这是Eric Lippert博客的一句话:
鉴于这种不幸的情况,首先强调存储机制,然后再强调语义是有道理的 .
很容易得到字典定义 "语义"的意思,但它在计算机术语方面意味着什么?
但就计算机术语而言,它意味着什么?
基本上是一样的.例:
x = 5;
以上是语法(表示).这个术语的含义(即语义)是将值5赋给一个被称为的符号(变量,无论如何)x
.不同的语言提供不同的语法来提供相同的语义.例如,上面的赋值将被写为
x := 5;
在Pascal,和
x <- 5
用其他几种语言.在所有情况下,含义基本相同.但有时,相同的语法也可能具有不同的含义,具体取决于语言和/或上下文.例如,VB将equals运算符重新定义为两个不同的东西.首先是一项任务,如上所述.
其次,在下面的代码片段中,它不是分配,而是采用比较两个值的含义:
If x = 5 Then Console.WriteLine("x is 5")
字典定义适用.
语义是(是?)所有关于词的含义.
例如,如果使用.NET类型KeyValuePair来表示除键和值之外的其他内容,则会出现语义问题.它可能有用......它可能是最好的解决方案,但它在语义上并不准确.
这正是他在博客文章中所谈论的内容.我们首先用C语言列出返回类型,但实际上返回是最后的.这在语义上是不准确的.
语义是我们的意思,程序应该做什么.Sytax是我们如何表达语义的语言特定约束.
理论上,只要程序的语义是正确的,使用什么语言编写它就没关系.
就编程语言术语而言,有几种语义概念:
静态语义告诉您哪些语法程序也格式正确。许多语言要么没有静态语义(方案,Ruby,Python,Icon,Lua,Perl),要么具有主要与实现类型系统有关的静态语义(Java,C,C#,Haskell)。“使用前需要声明”是另一种可能的静态语义。静态语义回答问题“ 该程序有意义吗? ”,并且在编译时会这样做。
动态语义告诉您以下两件事之一:
鉴于程序是有意义的,它的含义是什么? 含义已经以许多不同的方式在数学上进行了定义。经典的动态语义可能会定义程序输入和程序输出之间的函数(或关系)。含义功能(“名词语义”)由Dana Scott和Christopher Strachey率先提出;含义关系(“公理语义”)由Tony Hoare提出。斯科特(Scott)和霍尔(Hoare)荣获图灵奖;斯特拉奇可能会,但他死得很早。入门的好方法是阅读Tony Hoare的《计算机科学随笔》。
鉴于程序是有意义的,执行时它将如何表现?。这种语义通常称为“操作语义”,它描述了某种抽象机器上程序的执行。同样,有很多很多的品种。如今,操作语义已成为首选工具,因为存在强大的证明技术,因此,例如,使用操作语义可以证明托管代码中永远不会出现内存错误。罗宾·米尔纳得到了他在用来描述或并发多线程程序(CCS和演算)不同的操作技术部分图灵奖。如果您跳过证明,他在1999年出版的有关通信和移动系统的书也是很好的读物:-)
如果您在手册或文章中读到“语义”一词,并且上下文是非正式的英语而不是精确的数学描述,那么作者可能指的是动态操作行为-如果您愿意,则是对操作语义的非正式描述。这种非正式的描述对于编译器作者和程序员可能非常有帮助。