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

Compiler construction 动态类型检查编译语言中的符号表,compiler-construction,typechecking,symbol-table,compile-time-type-checking,Compiler Construction,Typechecking,Symbol Table,Compile Time Type Checking,我正在尝试创建一种动态类型检查编译语言,但现在我对此有点困惑: -编译语言始终具有静态类型检查 -任何编译器的阶段必须具有相同的顺序- 例如,符号表必须在词汇分析阶段创建,并且必须与以下图表一样连接到每个阶段 上述术语正确吗? 真正的问题是什么时候(哪个阶段)必须为这种语言创建符号表?不,这些都不是真的。让我们依次看一看: 编译语言始终具有静态类型检查 首先,我反对“编译语言”这个术语。有些语言经常被编译,有些语言经常被解释,但它们之间没有一条明确的界线。例如,一些JavaScript实现通过

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

-编译语言始终具有静态类型检查
-任何编译器的阶段必须具有相同的顺序-
例如,符号表必须在词汇分析阶段创建,并且必须与以下图表一样连接到每个阶段

上述术语正确吗?

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

不,这些都不是真的。让我们依次看一看:

编译语言始终具有静态类型检查

首先,我反对“编译语言”这个术语。有些语言经常被编译,有些语言经常被解释,但它们之间没有一条明确的界线。例如,一些JavaScript实现通过解释部分代码和编译其他代码来工作。类似地,在20世纪80年代和90年代,一些大学曾经使用C解释器教授C语言,这使得调试和反思正在发生的事情变得更加容易,尽管C语言几乎总是编译的

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

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

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

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

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

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

那真的要由你来决定。语义分析可能是实现这一点的好地方,因为在这一点上,您可以获得整个程序结构,尽管可以想象它可以折叠成解析,并在构建AST时生成

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


希望这有帮助

这些条件都不是一成不变的。我真诚地感谢你的帮助。但这里还有一件事,对于一种同时声明和分配变量的语言(比如python),我们无法决定是否在之前声明了变量,因此,我认为不可能在运行时之前创建符号表。请把这个加到你的解释里。啊,说得好。尽管需要注意的是,并不是所有语言都支持这一点,所以实际上可能不需要在运行时支持动态符号表。