编程语言(如C,C ++)中语法和语义之间有什么区别?
答案 0 :(得分:160)
语法是关于结构或语言的语法。它回答了这个问题:我如何构建一个有效的句子?所有语言,甚至英语和其他人类(也称为“自然”)语言都有语法,即定义句子是否正确构造的规则。
以下是一些C语言语法规则:
语义是关于句子的含义。它回答了这个问题:这句话有效吗?如果是这样,这句话是什么意思?例如:
x++; // increment
foo(xyz, --b, &qrs); // call foo
是语法上有效的C语句。但他们的意思是什么?尝试将这些语句转换为可执行的指令序列是否有效?这些问题是语义学的核心。
在第一个语句中考虑++运算符。首先,尝试这个甚至是有效的吗?
最后,请注意,某些语义无法在编译时确定,因此必须在运行时进行评估。在++运算符示例中,如果x已经处于其数据类型的最大值,那么当您尝试向其添加1时会发生什么?另一个例子:如果你的程序试图取消引用值为NULL的指针会发生什么?
总之,语法是仅关注句子是否对语言语法有效的概念。语义是关于句子是否具有有效含义。
答案 1 :(得分:15)
语法是指语言的结构,将etymology描述为事物的组合方式。
例如,你可能需要通过声明一个类型然后一个名字然后一个分号来将代码放在一起,以便在语法上正确。
Type token;
另一方面,语义是关于意义的。 编译器或解释器可能会抱怨语法错误。你的同事会抱怨语义。
答案 2 :(得分:8)
维基百科有答案。阅读syntax (programming languages)& semantics (computer science) wikipages。
或者考虑任何compiler或interpreter的工作。第一步是lexical analysis,其中通过将字符串分成lexemes然后parsing生成标记,其构建一些abstract syntax tree(这是语法的表示)。接下来的步骤涉及转换或评估这些AST(语义)。
另外,请注意,如果您定义了C的变体,其中每个关键字都转换为其法语等效值(因此if
变为si
,do
变为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)
他喝米饭(错误的语义-无意义的语法-正确的语法)
喝水(正确的语义-有含义,错误的语法-语法)