动态类型检查编译语言中的符号表

M0B*_*M0B -1 compiler-construction typechecking symbol-table compile-time-type-checking

我正在尝试创建一种动态类型检查编译语言,现在我对此有点困惑:

- 编译语言总是有静态类型检查
- 任何编译器的阶段必须具有相同的顺序 -
例如,符号表必须在词法分析阶段创建,并且必须与每个阶段连接,如下图所示。

在此处输入图片说明

上述条款是否属实?
真正的问题是什么时候(哪个阶段)必须为这种语言创建符号表?

tem*_*def 6

不,这些都不是真的。让我们依次进行:

编译语言总是有静态类型检查

首先,我会反对“编译语言”这个词。有些语言经常被编译,有些语言经常被解释,但它们之间没有硬性规定。例如,一些 JavaScript 实现通过解释部分代码并编译其他部分来工作。同样,在 1980 年代和 1990 年代,一些大学曾经使用 C 解释器来教授 C,这使得调试和反省正在发生的事情变得更加容易,即使 C 几乎总是被编译。

考虑到这一点,不,并非所有编译语言都具有静态类型检查。您可以为 Python 编写一个编译器,该编译器生成的代码在运行时计算出每个表达式的参数类型,如果给定操作不允许这些类型,则报告错误。

通常情况下,如果一种语言的设计期望它会被编译,那么该语言将使用静态类型检查。这样做的主要原因是静态类型检查需要对代码进行一些全局分析以确保类型检查,这会产生前期成本。如果您已经计划花费前期时间处理代码(例如,如果您正在编译它),这不是一个大问题。但是,如果您正在制作解释器,那么进行类型检查的成本可能会以有利于编译的方式减慢解释器的启动速度。

任何编译器的阶段都必须具有相同的顺序——例如,符号表必须在词法分析阶段创建,并且必须与每个阶段相连,如下图所示。

不,情况也并非如此。尽管这些编译阶段通常被认为是不同的,但在许多编译器中,它们都混合在一起,或者可能进一步细分。例如,如果编译器认识到某些操作可以被消除或折叠,或者在进行任何语义分析之前可能首先将代码翻译成另一种语言,则它可能会在解析期间开始进行优化。

(此外,符号表通常不会在词法分析期间生成 - 一旦确定了程序的全局结构,这可能会在语法分析或语义分析期间生成。)

真正的问题是什么时候(哪个阶段)必须为这种语言创建符号表?

这真的由你来决定。语义分析可能是执行此操作的好地方,因为那时您将拥有整个程序结构可供您使用,尽管可以想象它可以在构建 AST 时折叠为解析并生成。

根据语言语义和范围规则,您可能需要将其完全推迟到运行时。例如,如果一种语言可以创建其生命周期无限延长的变量,并且可以在运行时为这些变量选择名称,那么您就需要某种随时存在的动态表来进行查找。但并非所有动态类型语言都这样做,因此这可能不是必需的。

希望这可以帮助!