编程语言的原语

时间:2010-03-26 23:34:02

标签: programming-languages

哪些概念控制流,数据类型,语句,表达式和操作属于哪个?语法或语义?

控制流,数据类型,语句,表达式,操作,功能......之间的关系是什么?如何从这些原语逐级构建程序?

我想了解这些原始概念及其关系,以便弄清楚应该学习新语言的哪些方面。

谢谢和问候!

3 个答案:

答案 0 :(得分:2)

所有这些语言元素都有语法(如何编写)和语义(它的编写方式与实际意义相对应)。控制流确定执行哪些语句以及何时,表达式产生一个值,并且可以由函数和其他语言元素组成(尽管细节取决于编程语言)。操作通常是一系列语句。 “功能”的含义因语言而异;在某些语言中,任何可以通过名称调用的操作都是一个函数。在其他语言中,函数是产生结果的操作(与不报告结果的过程相反)。有些语言还要求函数不变异,而程序可以变异,尽管这在不同语言之间有所不同。数据类型封装了数据以及可以对该数据进行操作的操作/过程/函数。

答案 1 :(得分:2)

他们属于这两个世界:

  • 语法将描述哪些是运算符,它们是基本类型(intfloat),它们是关键字(returnforwhile)。因此语法决定了您可以在编程语言中使用哪些“单词”。用词我的意思是每一个可能的令牌:=是一个令牌,void是一个令牌,varName12345是一个被视为标识符的令牌,12.4是一个令牌被视为浮动等等..

  • 语义将描述如何在您的语言中将这些令牌组合在一起。

例如,您将while语义类似于:

WHILE ::= 'while' '(' CONDITION ')' '{' STATEMENTS '}'
CONDITION ::= CONDITION '&&' CONDITION | CONDITION '||' CONDITION | ...
STATEMENTS ::= STATEMENT ';' STATEMENTS | empty_rule

等等。这是语言的语法,它准确描述了语言的结构。因此,它将能够根据语言语义来判断程序是否正确。

然后是语义的第三个方面,即“构造意味着什么?”。您可以将其视为例如for循环与其如何转换为需要执行的较低级语言之间的对应关系。

第三个方面将决定您的程序在允许的操作方面是否正确。通常你可以让一个编译器拒绝许多没有意义的程序(因为它们违反了语义),但是为了能够找到许多不同的错误,你必须引入一个新的工具:类型检查器也会检查你什么时候做根据类型,他们是正确的操作。

例如,您的语法可以允许执行varName = 12.4,但是typechecker将使用varName的声明来了解您是否可以为其分配浮点数。 (当然我们谈的是静态类型检查)

答案 2 :(得分:1)

这些概念属于两者。

语句,表达式,控制流操作,数据类型等使用语法定义其结构。然而,它们的含义来自语义。

当您为编程语言及其构造定义语法和语义时,这基本上为您提供了一组构建块。语法用于理解代码中的结构 - 通常使用抽象语法树或AST表示。然后,您可以遍历树并将语义应用于每个元素以执行程序,或者为某些指令集生成一些指令,以便稍后执行代码。