计算机语言是如何利用自动机概念理论制作的?



我非常努力地在谷歌引擎上找到这个问题的答案。

但是我想知道这些高级编程语言是如何根据自动机原理创建的,还是自动机理论不包括在定义语言中?

语言设计往往有两个重要的层次:

  1. 词法分析 - 标记的定义。什么是字符串文字,什么是数字,变量、函数等的有效名称是什么。
  2. 句法分析 - 定义标记如何协同工作以做出有意义的语句。你能给文字赋值吗,块是什么样子的,if语句是什么样子的,等等。

词法分析是使用常规语言完成的,通常使用正则表达式定义标记。这并不是说使用了 DFA(大多数正则表达式实现在实践中不是 DFA(,而是正则表达式往往与大多数语言认为的标记很好地对齐。例如,如果你想要一种所有变量名都必须是回文的语言,那么你的语言的令牌规范必须是上下文无关的。

词法分析阶段的输入是源代码的原始字符。因此,字母表将是 ASCII 或 Unicode 或编译器期望的任何输入。输出是带有元数据的令牌流,例如可能表示源代码中"hello world"string-literal (value: hello world)

语法分析通常使用称为 LL 或 LR 解析器的上下文无关语言子集来完成。这是因为CFG(PDA(的实现是不确定的。LL 和 LR 解析是就如何解析给定表达式做出确定性决策的方法。

我们使用 CFG 作为代码,因为这是 Chomsky 层次结构中发生嵌套的级别(您可以在其中表达"深度"的概念,例如在if中使用if(。层次结构上的更高或更低级别是可能的,但常规语法无法轻松表达嵌套,并且上下文相关语法可能会导致混淆(但并非闻所未闻(。

句法分析步骤的输入是令牌流,输出是某种形式的可执行结构,通常是立即执行的解析树(如在解释语言中(,或者存储以供以后优化和/或执行(如编译语言(或其他东西(如在中编译语言中(。因此,CFG 的字母表是词法分析步骤指定的可能标记。


所以这整件事是一种冗长的说法,说重要的不是自动机理论,而是形式语言。我们通常希望拥有满足我们需求的最简单的语言课程。这通常意味着常规令牌和上下文无关语法,但并非总是如此。

正则表达式的实现不一定是自动机,CFG 的实现也不能是 PDA,因为 PDA 是非确定性的,所以我们在 CFG 类的合理子集上定义确定性解析器。

更一般地说,我们谈论计算理论。

在编程语言的历史中,已经正式证明,高级结构等同于理论抽象机器中的构造。

我们更喜欢现代语言中的高级结构,因为它们使程序更容易编写,并且更容易被其他人理解。这反过来又导致更容易的同行评审和团队合作,从而更好的程序和更少的错误。

维基百科关于结构化编程的文章讲述了部分历史。

至于自动机理论,它仍然存在于正则表达式引擎的实现中,并且在大多数编程情况下,一个好的解决方案包括通过一组可能的状态进行转换。

最新更新