【发布时间】:2013-09-23 16:59:20
【问题描述】:
我对了解编译器的真正工作原理很感兴趣。我翻阅了几本书,他们都同意编译器阶段大致是这样的事实(如果我错了,请纠正我):词法分析,语法分析,语义分析,中间代码,代码优化,代码生成。词汇和语法阶段看起来非常清晰和直接的方法(但这当然并不意味着容易)。但是,我仍然无法找到语义阶段的真正组成部分。一方面,我知道应该有一些子阶段,如范围检查、声明检查和类型检查,但一直困扰我的问题是:是否还有其他事情需要做。你能告诉我在这个阶段必须采取哪些强制性步骤吗?我知道这在很大程度上取决于编程语言和编译器实现,但你能给我一些关于 C/C++、Java 的例子吗?您能否指点我一本书/页面/文章,我可以在哪里深入阅读这些内容。谢谢。
编辑: 我看过的书是“编译器:原理、技术和工具”,Aho 和“现代编译器设计”,Grune,Reeuwijk。我无法使用它们回答这个问题。如果您觉得这个问题过于宽泛,请考虑您选择的 C、C++ 或 Java 编译器实现来给出答案。
【问题讨论】:
-
这是一个非常有趣的问题,但我认为它过于宽泛,无法在此处发布。不同的语言在语义分析方面有不同的要求——例如,像 Scheme 这样的语言甚至可能没有语义分析阶段,并将所有检查推迟到运行时,而像 Haskell 等其他语言在语义分析过程中需要遵循非常复杂的规则。您可能希望将这个问题改写为更有针对性,以便获得更好的反馈,即使这意味着要问几个类似的问题。
-
我担心这可能确实是一个广泛的问题,这就是我提到 C/C++/Java(或命令式和面向对象的语言)作为主要关注点的原因。如果我错了,请纠正我,但我认为这些语言应该具有相似的特征。如果不是,您认为为每个问题发布多个问题仍然是一个好主意吗?
-
我的理解是词法和语法是一回事。你确定“中间代码”是一个阶段吗?
-
词法不同于语法。词法是指标记化(字符 -> 标记),由扫描仪完成。语法是指解析(令牌 -> 解析树)并由解析器完成。当然,确实存在无扫描前端,但即使这些前端也有一些令牌与语法类别的概念。
标签: java c++ c compiler-construction