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

Symbol table in a dynamic type-checking compiled language

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

-A compiled language always has a static type-checking
-Phases of any compiler must have the same order-
for example, the symbol table must be created at Lexical Analysis phases and it must be connected with each phase like the following diagram.

以上说法是否正确?
真正的问题是什么时候(哪个阶段)必须为这种语言创建符号 table?

不,其中 none 是正确的。让我们依次来看:

A compiled language always has a static type-checking

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

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

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

Phases of any compiler must have the same order - for example, the symbol table must be created at Lexical Analysis phases and it must be connected with each phase like the following diagram.

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

(此外,符号 table 通常不会在词法分析期间生成 - 一旦程序的全局结构被弄清楚,它可能会在语法分析或语义分析期间生成。)

And the real question is when (which phase) the symbol table must be created for this language?

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

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

希望对您有所帮助!