编程语言中语法和语义有什么区别?

问题描述 投票:84回答:6

编程语言(如C,C ++)中语法和语义的区别是什么?

syntax programming-languages semantics
6个回答
164
投票

语法是关于语言的结构或语法。它回答了这个问题:我如何构建一个有效的句子?所有语言,甚至英语和其他人类(又称“自然”)语言都有语法,即定义句子是否正确构造的规则。

以下是一些C语言语法规则:

  • 用分号分隔的单词
  • 在括号内包含IF语句的条件表达式
  • 通过用大括号括起来将多个语句分组到一个语句中
  • 必须在第一个可执行语句之前声明数据类型和变量(此功能已在C99中删除.C99和后者允许混合类型声明。)

语义是关于句子的意思。它回答了这个问题:这句话有效吗?如果是这样,这句话是什么意思?例如:

x++;                  // increment
foo(xyz, --b, &qrs);  // call foo

是语法上有效的C语句。但他们的意思是什么?尝试将这些语句转换为可执行的指令序列是否有效?这些问题是语义学的核心。

在第一个语句中考虑++运算符。首先,尝试这个甚至是有效的吗?

  • 如果x是float数据类型,则此语句没有意义(根据C语言规则),因此即使语句在语法上正确也是错误的。
  • 如果x是指向某种数据类型的指针,则该语句的含义是“将sizeof(某些数据类型)添加到地址x处的值,并将结果存储到地址x”处的位置。
  • 如果x是标量,则语句的含义是“将地址x处的值加1并将结果存储到地址x处的位置”。

最后,请注意,某些语义无法在编译时确定,因此必须在运行时进行评估。在++运算符示例中,如果x已经处于其数据类型的最大值,那么当您尝试向其添加1时会发生什么?另一个例子:如果你的程序试图取消引用值为NULL的指针会发生什么?

总之,语法是仅关注句子是否对语言语法有效的概念。语义是关于句子是否具有有效含义。


17
投票

语法是指一种语言的结构,将其etymology描述为事物的组合方式。 例如,您可能需要通过声明类型然后是名称然后使用分号来将代码放在一起,以在语法上正确。

Type token;

另一方面,语义是关于意义的。编译器或解释器可能会抱怨语法错误。你的同事会抱怨语义。


8
投票

维基百科有答案。阅读qazxsw poi和qazxsw poi wiki页面。

或者考虑任何syntax (programming languages)semantics (computer science)的工作。第一步是compiler,其中令牌通过将字符串分为lexemes然后interpreter生成,其中构建了一些lexical analysis(这是语法的表示)。接下来的步骤涉及转换或评估这些AST(语义)。

此外,观察如果你定义了一个C的变体,其中每个关键字都被转换为它的法语等价物(所以parsing变成abstract syntax treeif变成sido变成faire等等......)你肯定会改变你的语言的语法,但是你不会改变语义:用法语C编程也不会更容易!


6
投票

语义就是您的代码所意味着的 - 您可能在伪代码中描述的内容。语法是实际的结构 - 从变量名到分号。


2
投票

语法是表达式,语句和程序单元的结构或形式,但语义是这些表达式,语句和程序单元的含义。语义直接遵循语法。语法是指特定编程语言指定的代码的结构/形式,但语义处理分配给符号,字符和单词的含义。


1
投票

语法:它指的是语言的语法结构。如果你正在编写c语言。你必须非常小心使用数据类型,令牌[它可以是文字或符号,如“printf()”。它有3个tokes,“printf,(,)”]。以同样的方式,你必须非常小心,你如何使用函数,函数语法,函数声明,定义,初始化和调用它。

虽然语义,它涉及句子或陈述的逻辑或概念。如果你说出或写出一些概念或逻辑。然后,你在语义错误。

© www.soinside.com 2019 - 2024. All rights reserved.