【问题标题】:Symbol table in a dynamic type-checking compiled language动态类型检查编译语言中的符号表
【发布时间】:2020-06-23 16:02:03
【问题描述】:

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

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

以上说法属实吗?
真正的问题是何时(哪个阶段)必须为这种语言创建符号表?

【问题讨论】:

  • 这些条款都不是一成不变的。

标签: compiler-construction typechecking symbol-table compile-time-type-checking


【解决方案1】:

不,这些都不是真的。让我们轮流看:

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

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

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

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

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

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

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

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

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

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

希望这会有所帮助!

【讨论】:

  • 衷心感谢您的帮助。但有一件事仍然存在,一种同时声明和分配变量的语言(如python)怎么样,我们无法决定是否之前声明了一个变量,为此,我认为不可能创建符号运行时间之前的表。请把这个添加到你的解释中。
  • 啊,好点子。尽管请注意并非所有语言都支持这一点,因此实际上可能不需要在运行时支持动态符号表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多