java源码编译为字节码的流程
?
1. 詞法、語法分析和填充符號表
1.1 詞法分析:將源代碼的字符流轉為Token集合,關鍵字、變量名、字面量和運算符都可成為Token,比如代碼“int i = a + 2”,那么int, i, =, a, +, 2這六個都是Token。
1.2 語法分析:根據Token序列構建抽象語法樹的過程,抽象語法樹的各個節點是一個語法結構,如類型、修飾符以及返回值等。
1.3?填充符號表:根據信息構建一個類似鍵值對的表格,用于后面的語義分析階段。
?
2. 注解處理
某些注解在編譯期間可以修改抽象語法樹的任意元素,因此,當處理注解對語法樹進行了修改,編譯器會重新進行詞法、語法分析并填充符號表,直至注解處理結束。
?
3. 標注檢查、數據及控制流分析和字節碼生成
3.1 標注檢查:經過第一和第二步得到的抽象語法樹只能表示一個結構正確的源程序,但無法保證源程序符合邏輯。而標注檢查會對變量使用前是否已聲明、變量與賦值間的數據類型是否匹配等內容進行檢查。
3.2 數據及控制流分析:會對方法是否有返回值、是否所有的受檢異常都被正確處理等內容進一步驗證。
3.3 解語法糖:語法糖主要是為了便于程序員代碼開發的一種技術。比如常見的泛型、變長參數、增強for循環以及自動裝箱、拆箱等操作。解語法糖就是為了在編譯期將代碼還原回普通的語法結構。
3.4 字節碼生成:不僅僅將前面生成的抽象語法樹、符號表轉化為字節碼寫到磁盤里,編譯器還進行了少量的代碼添加和轉換工作。比如我們反編譯字節碼文件看到的<init>()方法和<clinit>()方法,就是這個階段添加到語法樹中。
?
總結
以上是生活随笔為你收集整理的java源码编译为字节码的流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java常用分析工具Jps、Jstat、
- 下一篇: ThreadLocal怎么实现线程隔离的