java - 语义分析编译器阶段的子阶段是什么?

标签 java c++ c compiler-construction

我对了解编译器的真正工作原理很感兴趣。我翻了几本书,他们都同意编译器阶段大致是这样的(如果我错了请纠正我):词法分析,语法分析,语义分析,中间代码,代码优化,代码生成。词汇和语法阶段作为方法看起来非常清晰和直接(但这当然并不意味着容易)。但是,我仍然无法找到语义阶段的真正组成部分。首先,我知道应该有一些子阶段,比如范围检查、声明检查和类型检查,但一直困扰我的问题是:是否还有其他事情必须要做。你能告诉我在这个阶段必须采取的强制性步骤是什么吗?我知道这在很大程度上取决于编程语言和编译器的实现,但你能给我一些关于 C/C++、Java 的例子吗?你能不能给我指一本书/页面/文章,我在哪里可以深入阅读这些东西。谢谢。

编辑: 我浏览的书籍是“编译器:原理、技术和工具”,Aho 和“现代编译器设计”,Grune,Reeuwijk。我无法使用它们回答这个问题。如果您觉得这个问题太宽泛,请考虑您选择的 C、C++ 或 Java 编译器实现,然后给出答案。

最佳答案

许多编译器以一种或另一种形式经历了典型的“语义分析”阶段。在词法分析和解析之后,以下操作通常按此顺序发生:

  • 名称和类型解析。确定词法范围、在此类范围内声明的标识符、这些标识符的类型信息,以及对于标识符的每个非声明使用,它所引用的声明

  • 控制流分析。在代码显式和/或隐含(例如,构造函数)的计算上构建控制流图。

  • 数据流分析。确定变量接收新值的位置,以及程序其他部分读取这些值的位置。 (这通常会在程序内完成本地分析,然后可能会跨程序进行分析)。

也经常做,作为数据流分析的一部分:

  • 指向分析。在代码中的每个位置确定每个指针可能引用哪些实体

  • 调用图。跨过程构建调用图,通常考虑间接函数指针,其估计值出现在指向分析期间。

作为一个实际问题,其中一些需要交错以产生更好的结果。

除此之外,还有许多分析用于支持各种优化和代码生成过程。如果您真的想了解更多信息,请查阅任何一本不错的编译器书籍。

关于java - 语义分析编译器阶段的子阶段是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18880618/

相关文章:

java - 使用 ScrollView 将 xml 布局多个添加到另一个 xml

java - 应用程序发布 APK 上的依赖项冲突,但调试时不冲突?

Java 客户端-服务器聊天应用程序获取 java.net.SocketException : Socket closed

c++ - 将带有移动捕获的 lambda 传递给函数

c - c中是否有任何运算符可以避免在第一次赋值后变量值发生任何变化?

java- 如何告诉 LDAP DirContext.search(...).hasMore() 返回 false 而不是抛出 PartialResultException

c++ - 如何计算传感器从其 3D 点位置集覆盖的总距离?

c++ - 在共享库中增加异常

c - 2 个应用程序之间的数据交换

c - 对哨兵使用线性搜索有什么意义?