我一直认为引用语言的语法与引用语言的语义相同。但我已获悉,显然并非如此。有什么不同?
我一直认为引用语言的语法与引用语言的语义相同。但我已获悉,显然并非如此。有什么不同?
Answers:
语义〜意义
语法〜符号表示
因此,用不同语言编写的两个程序可以完成相同的操作(语义),但是用于编写程序的符号将有所不同(语法)。
编译器将为您检查语法(编译时错误),并从语言规则中导出语义(将语法映射到机器指令上),但是不会找到所有语义错误(运行时错误,例如计算错误的结果,因为代码说加1而不是加2)。
x + y
没有合适的+
运算符的地方)。我称逻辑错误为1而不是2 。
实际上,没有两个级别,而是三个:
i
并f
产生if
)if
,(
,42
,==
,answer
和)
产生一个条件语句)ValidIdentifier
终端,可以将其定义为类似的东西![AnyKeyword] [Identifier]
(我在这里使用的是类似PEG的表示法)。对于这种语言,您不需要单独的词法传递。例如,请参阅基于GLR的C ++解析器。
语义描述编程语言的逻辑实体及其交互。语法定义了这些字符如何表达。
例如,指针算术的概念是C语义的一部分。的方式+
和-
运营商可以用来表达指针操作是其语法的一部分。
有时,两种语言共享其部分语义,但是语法却大相径庭(例如C#和VB.NET-都使用值类型和引用类型,但是键入定义它们的字符是不同的)。在其他情况下,两种语言在语法上是相似的,但是语义却不匹配(考虑Java与JavaScript,在相似之处通常会使初学者感到困惑)。
语法是您排列语言标记的方式。语义就是这些标记的含义(通常,标记的特定排列意味着什么)。
您没有指定是仅引用编程语言还是编程中使用的通用语言,因此我的答案是关于数据语言(例如XML,RDF,数据类型系统等)的:
布赖恩·米克(Brian L. Meek)在他的七个独立于语言的标准的黄金法则(1995年)中写道:“一种语言的语法可以是另一种语言的语义”。他指的是数据描述中使用的“语法”和“语义”一词:因此,如果您在某种数据格式的规范中偶然发现这些词,则最好用“ Potrzebie”替换这两个词,以明确表示您必须解决对自己的意义。
至少在精确指定的数据中,语法和语义之间的关系可以用术语“编码”更好地描述。语义以语法编码。由于录音可以嵌套,因此一种语言的语法就是另一种语言的语义。如果超出了数据领域,则这种嵌套实际上是无限的,正如Umberto Eco所说的那样,它是“无限符号学”。
举个例子:
人们通常会在某种程度上停下来并把它当作语义,但最终除非存在某些人在脑海中解释数据的情况,否则就没有最终的语义。一旦人们试图以数据形式表达语义,它就会成为语法。
如果可以用BNF(巴克斯-纳尔形式)或类似形式描述它,那是语法。如果不能,那不是。
另一方面,语义与程序(或其他源代码块)的含义有关。
有时两者之间的界限可能会模糊。
一种理解区别的方法是查看程序语法或语义不正确时遇到的各种错误。
语法错误是指源代码无法匹配语言语法,例如,在需要使用分号的地方没有分号。
语义错误是无法满足其他语言要求(例如C称为“约束”);一个例子可能是写x + y
在那里x
,并y
是不兼容的类型。语言语法告诉您,加法看起来像something + something
,但是它的功能不足以表达对左右操作数类型的要求。
(逻辑错误,例如使用1表示2是正确的错误,通常不会被编译器检测到-尽管在某些情况下,编译器会警告可疑代码。)
语法是句子中单词的语法安排,即单词顺序。
(英语)“ cat dog boy ”和(编程)“ hi.5 ”在语法上不正确。
(英语)“ 猫抱着男孩 ”,(编程)“ * 3.2 * 5 *”在语法上有效。
静态语义是语法上有效的语句是否具有任何含义。
(英语)' 我很大 '(编程)(python)' 3 +'hi' '在语法上是正确的,但具有静态语义错误。
语义是与语法正确的符号字符串相关联的含义,没有静态的语义错误,即句子在语法和语义上都是正确的,但其含义可能不是所要的。
(英语)“ 飞行中的飞机可能是危险的 ”可以有两种含义,即飞行中的飞机可能有危险或正在飞行中的飞机有危险。
(编程)“计算机不会生成任何错误消息,但不会执行您告诉计算机的操作;它将做其他事情。
来源:MIT 6.00.1
语法是指规范某种语言中有效语句的构造的正式规则。语义是指给出陈述含义的一组规则。
当违反或滥用编程语言规则时,在程序中会发生由于语法引起的错误。当语句没有意义时,由于语义而导致的错误会在程序中发生。
词序是语法的基本原理,试图理解所写内容的人使用词序的句法线索来帮助给出句子的结构和含义。语义是个人根据其先验知识对“句子”的含义的自己的解释。因此,在使用语义提示时,看似没有语法意义的句子可以具有意义。
语法仅与语言和语法上正确的内容有关。语义学要求所有人都具备先验知识,而这远远超出了任何特定于语言的知识。
“婴儿牛奶饮料”一词没有句法含义,但是由于我们的先验知识告诉我们婴儿喝牛奶,因此大多数人会通过语义将其解释为“婴儿喝牛奶”的含义,因此我们可以从中找到含义。关键词。
语法和语义就像策略和战术或左右。
它们并不是真正独立的通用概念,而是一对相关的单词,当您处于特定的上下文中时,它们指示相反的方向。但是,在某种程度上,策略是另一种策略。
因此,如果您使用某种语言编写代码,那么语法就是您使用的语言,而所需的行为就是语义。但是,如果您正在实现或讨论该语言的编译器,那么语法就是语法(可能是类型系统)以及基于此语言构建的语义。等等。
语法是计算机可以理解的,语义是人类可以理解的。
编译器/解释器不在乎您的设计,在任何编译到机器级别的代码中,您都很难推断出设计。开发人员关心设计,因为好的设计是通过抽象复杂的行为和交互来降低复杂性,并且不同类型的问题使它们具有不同的语义。语言的选择主要取决于您要使用的语义在语法中如何轻松有效地表达。
非常简单的“ plain c”示例:
void main()
{
int a = 10;
int x = a - 1;
int y = - 1;
printf("x = %i", x);
printf("y = %i", y);
getch();
}
在此示例中,“-”标记的语法相同,但是根据其使用位置,其含义不同(“语义”)。
在“ x”分配中,“-”表示“减”运算,在“ y”分配中,“-”表示“负号”运算。
-
运算符是相同的token,但是它们在语法上有所不同,因为它们在不同的上下文中使用。 0 - 1
匹配语法规则additive-expression: additive-expression - multiplicative-expression
,同时- 1
匹配语法规则unary-expression: unary-operator cast-expression
(参考:C99标准)。
-
操作者之间的区别是语法上的,而不仅仅是语义上的(尽管它们也具有不同的语义)。语法由语言语法定义,并且两个运算符在语法的不同部分中指定。有关一元运算符,请参见N1570草案第6.5.3节,加法运算符请参见6.5.6节。(顺便说一句,如果您要使用C示例,它应该是正确的;void main()
应该是int main(void)
,并且您丢失了#include <stdio.h>
,无论标头声明是什么getch