简单定义"语义",因为它常用于编程语言/ API?

Jay*_*Jay 9 computer-science programming-languages definition semantics

今天我想到,尽管我在引用语言元素和命名约定时已经采用并且不经常使用术语"语义",但我没有任何正式定义的意义.

我试图在编程领域找到一个正式的定义让我眼前一亮.

我从我遇到它的语境中以及它在语言学方面的更常见用法中感受到它的含义,我通常使用该术语来指代语言元素的含义或表达力,或者保真度.命名的命名与其命名的意图,行为或功能.

不过,这个定义是我自己的想法.我是一名人类学/英语专业,从未上过计算机科学课程.这是在CS教的吗?

是否有更准确的定义可以归结为一两个陈述,而不是一篇详尽而令人筋疲力尽的文章?

dei*_*nst 6

这里开始的定义是编程语言的语义描述了语法和计算模型之间的关系..这几乎就是您的推断定义.粘着点,以及让你的眼睛茫然的是精确定义计算模型.

有许多不同的形式计算模型,每种模型都会导致不同形式的语义.操作语义可能最接近大多数人非正式地模拟语义的方式,让每个代码片段通过解释器运行并改变抽象例程的状态.这种方法在许多并发或非确定性等模型中都会崩溃,因此还有其他更适合这些情况的语义.


Jac*_*ack 6

它的含义的语言元素在他们正式的用语的含义方面的计算(通常,这是操作语义).这意味着它表达了你的语言术语有效地做了什么,假设一种潜在的模型依赖于我们所讨论的语义.

从维基百科页面可以看出,你主要有3种语义:

  • 操作语义通过指定抽象虚拟机在执行术语时的行为方式来表达语言的含义.(例如:: +从堆栈弹出两个元素并推送总和.这不是正式的,不是你应该如何考虑它,它只是给你一个想法).这是用于描述"普通"编程语言的语义的最常用的一种.例如,对于Java,您可以为每个可能的术语提供一系列JVM指令,用于对该术语进行建模.可能当你问到语义的含义时,这就是你要找的那个.
  • 指称语义是一种不同的方法:你为语言的每个术语赋予一个由数学函数表示的含义.因此,对于前面的示例,您将拥有与之关联的函数f,+其中包含该术语的语义(有效含义)
  • 公理语义是一种注释语言术语的方法,表达它们如何改变您想要在程序中验证的某些逻辑公式的有效性.您应该考虑阅读本文仅仅因为推理规则和公理在开发这种语义方面是相似的,但它是以实用的方式解释的

从这个解释中你可以理解语义是在上下文中定义得很好的东西,你需要一个指定的上下文,否则你就不能给你语言一个正式的术语定义.


Nor*_*sey 5

从编程语言的理论和实践的角度来看,语言元素具有语义.命名约定没有.并且语义与任何事物的"保真度"无关,除非可能是如果实现是正确的,它有时被称为"忠实于语义".

除此之外,很难概括,因为有太多不同风格的语义.

  • 克里斯托弗·斯特拉希(Christopher Strachey)真正推动了这样一个观点,即通常一个短语(思考声明,定义,陈述表达)是由较小的子短语组成的,并且较大短语的含义(语义)应该是其含义的函数.组成的子句.在这种风格中,每个语法上格式良好的子短语都有语义.听起来这就是你要找的东西.

还有其他语义风格,称为"操作语义",给定一个程序,语义告诉你如何在抽象机器上执行该程序(或者在另一个变体中,语义不是说程序将如何执行而只是结果是什么).

有"公理语义",大概是关于个人计划可以证明的事实.公理语义是有效证明技术的集合.由实施来确保所有可证明的索赔都是真实的.

还存在"静态语义",其通常意味着在编译时强加的任何要求,以使程序被认为是"好"或"良好形成".像"变量必须在使用之前定义"之类的东西是静态语义.但大多数人说静态语义时他们的意思是类型检查.

最后,可以说出抽象数据类型,类或接口等的"语义".这种用法是一个很好的松散,但它们可以归结为允许哪些行为的规范.我建议你在这种情况下避免使用"语义"一词,而是使用"合同"或"规范"这个词.这样可以避免混淆.


评论:尝试将一个复杂的主题归结为一两句话并不总是有帮助的.当谈到编程语言时,不要在维基百科上寻找好的信息.维基百科的人意味着很好,但他们往往是复杂的,令人困惑的,或者只是错误的.