Java编译器的内部架构[关闭]

2024-02-01

我一直在努力Java从8年多开始。

上周,在我公司的一次小型会议上,我的一位同事问我到底如何Java Compiler工作?我无言以对。

我尝试解释一下,就像 Java 编译器将语句一一转换为不针对任何对象的字节码OS but to JVM.

即使是我,也没有人对这个答案感到满意。

现在主要的问题是java编译器到底是如何工作的。即,在编译一个文件的情况下,编译器将完成多少个步骤或阶段或阶段Java file.

到底是什么Java's compiler建筑学?

如果有多个怎么办Java classes在同一个 .java 文件中。那么会编译多少个类。

如果导入指向未编译的 Java 类怎么办?那么未编译的类是被编译还是被忽略?

我用谷歌搜索了半天多,所有人都提供了与我给同事的答案相同的答案。

但最后我找到了一些有用的教程here http://www.bearcave.com/software/java/comp_arch.html.

但该教程的内容也不太深入,我无法想象该教程。

但我仍然不满足,并渴望从你那里了解更多有关这方面的信息。

因此,如果有人比我和上面的博客更了解一些东西,通过使用它我可以直观地看到内部架构到底是什么Java Compiler请解释一下。


一些基本步骤:

  1. parse:读取一组 *.java 源文件并映射结果标记 序列成 AST(抽象语法树)节点。
  2. Enter:将定义的符号输入到符号表中。
  3. 处理注释:如果有请求,则处理在以下位置找到的注释 指定的编译单元。
  4. attribute:语法树的属性。此步骤包括姓名 分辨率、类型检查和常量折叠。
  5. flow:对上一步中的树执行数据流分析。 这包括检查分配和可达性。
  6. desugar:重写 AST 并翻译掉一些语法糖。
  7. generate:生成源文件或类文件。

更详细地说:

  1. Lex - 将源文件分解为单个单词或标记。
  2. 解析 - 分析程序的短语结构。
  3. 语义动作 - 构建一个与每个短语对应的抽象语法树。
  4. 语义分析 - 确定每个短语的含义,将变量的使用与其定义联系起来,检查表达式的类型,请求每个短语的翻译。
  5. 帧布局 - 以与机器相关的方式将变量、函数参数等放入激活记录(堆栈帧)中。
  6. 翻译 - 生成中间表示树(IR 树),一种表示法 它不依赖于任何特定的源语言或目标机器体系结构。
  7. 规范化 - 消除表达式中的副作用,并清理条件分支,以方便下一阶段。
  8. 指令选择 - 将 IR 树节点分组为与目标机器指令的操作相对应的块。
  9. 控制流分析 - 将指令序列分析为控制流图,显示程序可能的所有可能的控制流 执行时跟随。

  10. 数据流分析 - 通过程序变量收集有关信息流的信息;例如,活跃度分析计算每个程序变量保存仍然需要的值(活跃)的位置。

  11. 寄存器分配——选择一个寄存器来保存程序使用的每个变量和临时值;变量不同时存在 可以共享同一个寄存器。

  12. 代码发射 - 将每个机器指令中的临时名称替换为 机器寄存器。

有一本很好看的书:

Java 中的现代编译器实现

您可能想查看 javac 代码:

Javac 文档 http://openjdk.java.net/groups/compiler/

OpenJDK 源代码 http://hg.openjdk.java.net/jdk7

javac 黑客指南 http://scg.unibe.ch/archive/projects/Erni08b.pdf

不要恐慌!帮助 javac 新手浏览代码库 http://openjdk.java.net/groups/compiler/doc/hhgtjavac/index.html

JVM JLS http://docs.oracle.com/javase/specs/jvms/se7/html/index.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java编译器的内部架构[关闭] 的相关文章

  • 在Maven中生成Version.java文件

    我有一个使用 Ant 脚本构建的 Java 项目 我正在尝试将项目转换为 Maven 其中一项任务生成一个名为 Version java 的 Java 源文件 其中包含编译时间戳的静态字符串表示形式 如下所示 package com foo
  • 在Windows Server 2003下如何在本地系统帐户下运行jvisualvm.exe?

    我在带有 Java 1 6 u 20 的 Windows Server 2003 下将 GlassFish 3 0 1 作为 Windows 服务运行 总体上我很满意 我希望能够在这个 JVM 上使用 VisualVM 并使用无法在 Tom
  • 非易失性领域的出版与阅读

    public class Factory private Singleton instance public Singleton getInstance Singleton res instance if res null synchron
  • 为什么在 10 个 Java 线程中递增一个数字不会得到 10 的值?

    我不明白 a 的值为0 为什么 a 不是10 那段代码的运行过程是怎样的 是否需要从Java内存模型来分析 这是我的测试代码 package com study concurrent demo import lombok extern sl
  • 以相反的顺序打印任何集合中的项目?

    我在 使用 Java 进行数据结构和问题解决 一书中遇到以下问题 编写一个例程 使用 Collections API 以相反的顺序打印任何 Collection 中的项目 不要使用 ListIterator 我不会把它放在这里 因为我想让有
  • Java LostFocus 和 InputVerifier,按反向制表符顺序移动

    我有一个 GUI 应用程序 它使用 InputVerifier 在产生焦点之前检查文本字段的内容 这都是很正常的 然而 昨天发现了一个问题 这似乎是一个错误 但我在任何地方都找不到任何提及它的地方 在我将其报告为错误之前 我想我应该问 我在
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • ThreeTen 向后移植与 JSR-310 的比较

    由于某些原因 我们现在无法使用 java 8 我们仍然停留在 java 7 上 不过 我想使用新的JSR 310 date time APIs现在 使用官方向后移植 ThreeTen http www threeten org threet
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 按降序排序映射java8 [重复]

    这个问题在这里已经有答案了 private static
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • 在 Java 中通过 D-Bus MPRIS 访问 Clementine 实例

    我使用 Clementine 作为音乐播放器 它可以通过 D Bus 命令进行控制 在命令行上 使用 qdbus 我可以 Start Stop 暂停播放器 强制它跳过播放列表中的歌曲 检查播放列表的长度 检查播放列表中当前播放的曲目及其元数
  • 使用 Apache 允许 Glassfish 和 PHP 在同一服务器中协同工作

    是否可以建立从 Java 到 php 文件的桥梁 我有一个用 Java 编写的应用程序 我需要执行http piwik org http piwik org 这是用 PHP 编写的 在服务器中 我正在运行 PHP 但无法从浏览器访问 php
  • 确定 JavaFX 中是否消耗了事件

    我正在尝试使用 JavaFX 中的事件处理来做一些非滑雪道的事情 我需要能够确定手动触发事件后是否已消耗该事件 在以下示例中 正确接收了合成鼠标事件 但调用 Consumer 不会更新该事件 我对此进行了调试 发现 JavaFX 实际上创建
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat
  • Spring 作为 JNDI 提供者?

    我想使用 Spring 作为 JNDI 提供程序 这意味着我想在 Spring 上下文中配置一个 bean 可以通过 JNDI 访问该 bean 这看起来像这样

随机推荐

  • dijit.Tree搜索和刷新

    我似乎无法弄清楚如何使用 ItemFileWriteStore 和 TreeStoreModel 在 dijit Tree 中进行搜索 一切都是声明性的 我使用的是 Dojo 1 7 1 这是我到目前为止所拥有的
  • VSCode 扩展修复 Python 选项卡不一致问题 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 首先 我想知道是谁决定使用基于缩进的语言的无脑天才 以及为什么他不能简单地使用分号 令人沮丧的是 Pyt
  • 使用模型时 CakePHP AJAX Json 解析错误

    我正在使用 CakePHP 2 5 3 0 开发一个应用程序 然后我偶然发现了 AJAX 的一个问题 我使用从 jQuery 到 CakePHP 的 AJAX 请求来发送用户的登录名和密码 然后 CakePHP 应该返回经过验证的 JSON
  • 展开可选 IBOutlet 值时为 Nil

    我有一个fatal error unexpectedly found nil while unwrapping an Optional value for an IBOutlet 在我的自定义视图中 我已将我的插座与XIB文件 我已经仔细检
  • 在 Objective-C 中打乱 NSString 中的字母

    我写了这个函数 它会打乱 a 的内容NSString 它似乎可以工作 但时不时会崩溃 这可能是一种迂回的方式 但我将字符放入一个数组中 随机交换数组中的元素 然后将数组转回字符串 我不确定我正在做的事情是不安全的 这会导致它崩溃 我想这可能
  • 从视图控制器返回到表视图控制器时,表视图单元格“跳转”

    我有一个TableViewController 然后单击自定义单元格会将您带到相关的WebViewController 我遇到的问题是 当我点击 返回 时WebViewController中的表视图单元格TableViewControlle
  • pandoc 文档转换失败,错误 2

    当我在 R studio 中编写 HTML 时 我得到以下结果 C Users Susan ANACON 1 Scripts pandoc RTS K512m RTS Lesson3 student utf8 md to html from
  • Ruby:KML 库?

    我正在寻找一个 ruby 库来将位置数据导出到 KML 文件中 要导出的数据主要包含带有纬度和经度的简单点 但我也希望能够导出更复杂的多边形 I tried 龟豹 http rubygems org gems kamelopard 但觉得不
  • Python __dict__

    属性 dict 应该包含用户定义的属性 但是如果我们打印 dict 一个空的类 我还会得到 module dict weakref doc 哪些是由 Python 预先填充的 dict 相应于类对象类型的属性 Now base and cl
  • 主 NSWindow 阴影不会像子窗口那样改变

    我的应用程序中的主窗口是无边框的 self window setStyleMask NSBorderlessWindowMask 从该窗口 我还打开其他子窗口 当我在其他子窗口之间单击时 我看到当该子窗口被单击并成为焦点窗口时 这些子窗口的
  • 如何使嵌套双引号在 bash 解释器中幸存下来?

    鉴于下面的上下文 是否存在任何可以插入到 WGETOPT 定义中的神奇语法 以允许 吸收 USERAGENT 变量 并且仍然允许调用 wget 命令 如下所示syntax 1 我目前已经求助于使用 eval 但我对此并不满意 但也许这是我可
  • 根据 React.Js 中第一个下拉列表中的选择填充第二个下拉列表

    我正在学习反应并努力根据从第一个下拉列表中单击的选项来填充第二个下拉列表 我在下面包含了我的代码 我认为问题在于我尝试设置的位置this state selected param tableName 我认为这行不通 但我不知道该用什么来代替
  • SVG 作为 CSS 背景 - 有没有办法重复 x 且中间没有空格?

    在基于 Webkit 和 Blink 的浏览器中 SVG 无法正确平铺 不同缩放级别的图像之间存在间隙 StackOverflow 上有许多主题解决了这个问题 所有主题都标记为已解决 但这些人一定没有足够彻底地测试他们的解决方案 我的 SV
  • Groovy Abstract ConcurrentMap 中的错误?

    抽象ConcurrentMap http grepcode sadcom file repo1 maven org maven2 org codehaus groovy groovy all 2 4 3 org codehaus groov
  • 是否可以使用VBA单击报表记录以在Access中打开相关表单

    我有一份包含工作 任务详细信息的报告 还有一个为该报告提供大部分数据的表格 鉴于报告是查看数据大图的好方法 而表单是编辑数据的最佳方法 我希望能够单击一行 并让它打开相关记录表单视图 有谁知道如何通过VBA 做到这一点 在我看来 这应该是可
  • 我可以在不可变类中使用 StringBuilder

    如果我创建一个不可变的类 所有字段都必须是最终的 如果我像这样使用 stringbuilder 最终 StringBuilder s new StringBuilder Hello 那么append函数可以追加s的值并且类不会是不可变的 请
  • 如何通过排序、分区和分组进行行编号

    我需要通过排序 分区和分组进行行编号 订购依据IdDocument DateChange 划分为IdDocument并分组依据IdRole 问题尤其出在分组上 从例子中可以看出 NumberingExpected DENSE RANK 必须
  • ASP.NET MVC Web 应用程序无法通过 Arvixe 托管的 IIS 服务器上的 SMTP 发送电子邮件

    我迫切需要帮助解决这个问题 如何让我部署的应用程序通过 SMTP 将电子邮件发送到任何地址 我正在 Visual Studio 2015 ASP NET MVC 中开发基于 Web 的销售跟踪应用程序 该网站将托管在 Arvixe Busi
  • 我想使用 StringTokenizer 搜索字符串,但我正在查找的字符串中有分隔符 - Java

    我有一个名为quotes txt 的外部文件 我将向您展示该文件的一些内容 1 Everybody s always telling me one thing and out the other 2 I love criticism jus
  • Java编译器的内部架构[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直在努力Java从8年多开始 上周 在我公司的一次小型会议上 我的一位同事问我到底如何Java Compiler工作 我无言以对