九 JVM HotSpot 早期(編譯器)優化

2021-08-24 20:38:38 字數 1031 閱讀 6615

注:本博文主要是基於jdk1.7會適當加入1.8內容。

編譯過程:

1)解析與填充符號表

解析步驟:詞法分析和語法分析

詞法分析:將源**中的字元流轉變為標記(token)集合,單個字元是程式編寫過程的最小元素,而標記則是編譯過程的最小元素,關鍵字、變數名、字面量、運算子都可以成為標記。

語法分析:根據token序列構造抽象語法樹的過程,抽象語法樹是一種用來描述程式**語法結構的樹形結構,語法樹的每乙個節點都代表著程式**的乙個語法結構,包、型別、運算子、修飾符、介面、返回值甚至**中的注釋。

符號填充表:符號表是由一組符號位址和符號資訊構成的**。符號表中所登記的資訊在編譯的不同階段都要用到,語義分析中,符號表所登記的內容將用於語義檢查和產生中間**,在目標**生成階段,當對符號名進行地質分配時,符號表是位址分配的依據。

2)註解處理器

jdk1.6提供了一組插入式註解處理器的標準api在編譯器對註解進行處理,可以看做是一組編譯器外掛程式,外掛程式中可以任意讀取、修改、新增抽象語法樹中的任意元素。如果外掛程式在註解期間對語法樹進行了修改,編譯器將回到解析和符號填充階段重新處理,直到所有的插入式註解器都沒有對語法樹進行修改為止。

3)語義分析和位元組碼生成

語法分析之後,編譯器獲得了程式**的抽象語法樹表示,語法樹能表示對乙個結構的源程式的抽象,但無法保證源程式符號邏輯。而語義分析主要任務是對結構上正確的源程式進行上下文有關性質的審查。

語義分析過程分為:標註檢查和資料以及控制流分析。

//編譯前

public

static

void

main(string args) else

}//編譯後,常量的if語句會在編譯階段執行,生成位元組碼

public

static

void

main(string args)

編譯原理 作業九

1.將dfa最小化 教材p65 第9題 dfa最小化的圖如下 用正規式描述其所識別的語言 a c bb 2.構造以下文法相應的最小的dfa s 0a 1b a 1s 1 b 0s 0 s 0a 1b s 0 1s 1 1 0s 0 01s 01 10s 10 01 10 s 01 10 01 10 ...

編譯原理第九次作業

1.將dfa最小化 教材p65 第9題答 i b b b 可區分,劃分ii 不可區別,等價 不可區別,等價 不可區別,等價 簡化後的dfa 2.構造以下文法相應的最小的dfa正規文法 s 0a 1b a 1s 1 b 0s 0 答 正規文法 正規式 s 0a 1b 0 1s 1 1 0s 0 01s...

C Primer Plus 第九章(單獨編譯)

詳細請參考c primer plus 第九章 p301 1單獨編譯 與其將結構宣告加入到每乙個檔案中,不如將其放在標頭檔案中,然後在每乙個源 檔案中包含該標頭檔案。這樣,要修改結構宣告時,只需要在標頭檔案中做一次改動即可。另外,也可以將函式原型放在標頭檔案中。因此,可以將原來的程式分成三部分 第一,...