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

时间:2013-07-29 17:22:15

标签: syntax programming-languages semantics

编程语言(如C,C ++)中语法语义之间有什么区别?

10 个答案:

答案 0 :(得分:160)

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

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

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

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

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

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

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

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

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

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

答案 1 :(得分:15)

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

Type token;

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

答案 2 :(得分:8)

维基百科有答案。阅读syntax (programming languages)& semantics (computer science) wikipages。

或者考虑任何compilerinterpreter的工作。第一步是lexical analysis,其中通过将字符串分成lexemes然后parsing生成标记,其构建一些abstract syntax tree(这是语法的表示)。接下来的步骤涉及转换或评估这些AST(语义)。

另外,请注意,如果您定义了C的变体,其中每个关键字都转换为其法语等效值(因此if变为sido变为faire,{ {1}}成为else等等...)你肯定会改变你的语言的语法,但你不会改变语义:用法语C编程也不会更容易!

答案 3 :(得分:6)

语义就是你的代码意味着什么 - 你可以在伪代码中描述什么。语法是实际的结构 - 从变量名到分号。

答案 4 :(得分:5)

  • 您需要正确的语法进行编译。
  • 您需要正确的语义才能使其正常工作。

答案 5 :(得分:2)

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

a的语法 编程语言是其表达式,语句和程序的形式 单位。其语义是这些表达式,语句和程序单元的含义。例如,Java while语句的语法为

while (boolean_expr) statement

此语句形式的语义是当当前值为布尔值时 表达式为真,则执行嵌入式语句。然后隐式控制 返回布尔表达式以重复该过程。如果是布尔表达式 为false时,控制权将转移到while构造之后的语句。

答案 8 :(得分:1)

了解编译器如何看待代码

通常,代码的语法和语义分析是在编译器的“前端”部分进行的。

  • 语法:编译器为每个关键字和符号生成令牌:令牌包含关键字的信息类型及其在代码中的位置。 使用这些标记,可以创建并分析AST(抽象语法树的缩写)。 编译器在这里实际检查的是代码是否在词法上有意义,即“关键字序列”是否符合语言规则?如先前答案中所建议,您可以将其视为语言的语法(而不是代码的含义/含义)。 旁注:此阶段报告语法错误。(将具有错误类型的令牌返回给系统)

  • 语义:现在,编译器将检查您的代码操作是否“有意义”。 例如如果语言支持Type Inference,则在尝试将字符串分配给float时将报告语义错误。或两次声明同一变量。 这些是“语法上” /语法上正确的错误,但在操作过程中没有任何意义。 旁注:为了检查同一变量是否被声明两次,编译器管理一个symbol table

因此,这两个前端阶段的输出是带注释的AST(具有数据类型)和符号表。

以一种不太技术的方式理解它

考虑我们使用的普通语言;在这里,英语:

例如他去学校。 -错误的语法/语法,尽管他想传达正确的意义/语义。

例如他去感冒了。 -感冒是一个形容词。用英语,我们可能会说这不符合语法,但实际上它是我想到的具有正确语法的最接近不正确语义的例子。

答案 9 :(得分:1)

他喝米饭(错误的语义-无意义的语法-正确的语法)

喝水(正确的语义-有含义,错误的语法-语法)