8 3 sum sum i Lexer Parser sum

  • Slides: 64
Download presentation

圖 8. 3 編譯器的六大階段 高階語言 sum = sum + i 掃描器 (Lexer) 剖析器 (Parser)

圖 8. 3 編譯器的六大階段 高階語言 sum = sum + i 掃描器 (Lexer) 剖析器 (Parser) 詞彙串列 sum = sum + i id = id + id STMT 語法樹 sum: id: int 語意分析 (Semantic Analysis) = EXP: int ITEM: int 語意樹 + i: id: int sum: id: int 中間碼產生 (P-code Generator) 中間碼 最佳化 (Optimization) 組合語言產生 (ASM generator) 組合語言 ITEM: int + = sum T 0 i ADD R 1, R 2, R 1 T 0 sum

圖 8. 10 <範例 8. 1> 剖析到 sum=0 時 的語法樹與堆疊結構 堆疊 (Stack) PROG Base.

圖 8. 10 <範例 8. 1> 剖析到 sum=0 時 的語法樹與堆疊結構 堆疊 (Stack) PROG Base. List BASE STMT EXP STMT sum: id ITEM = EXP ITEM 0: number 成 長 方 向

語意分析的範例 STMT sum: id = ITEM EXP + sum: id STMT 語意分析 sum: id:

語意分析的範例 STMT sum: id = ITEM EXP + sum: id STMT 語意分析 sum: id: int ITEM i: id (a) 語法樹 圖 8. 11 語意分析:將語法樹標註上節點型態 = ITEM: int EXP: int + sum: id: int (b) 語意樹 ITEM: int i: id: int

圖 8. 15 GNU 編譯器的流程 C C++ GENERIC (剖析樹) … Parsing Generic converter Gimplify

圖 8. 15 GNU 編譯器的流程 C C++ GENERIC (剖析樹) … Parsing Generic converter Gimplify GIMPLE (中間碼) Tree SSA optimizer RTL generator RTL (中間碼) RTL optimizer ASM generator 組合語言

Gimple

Gimple

圖 8. 3 編譯器的三大階段 – 掃描、剖析、程式碼產生 高階語言程式 (Source code) sum = sum + i

圖 8. 3 編譯器的三大階段 – 掃描、剖析、程式碼產生 高階語言程式 (Source code) sum = sum + i * i 掃描器 (Lexer) sum = sum + i * i id = id + id * id 一連串的詞彙 stmt (A sequence of tokens) 剖析器 (Parser) sum: id = Exp Term + Term * 剖析樹 (Parsing tree) Factor Item 程式產生 (Code Generation) sum: id i: id 目的程式碼 (Target code) * + = i sum t 2 i t 1 t 2 sum Factor

圖 8. 4 編譯器的六階段模型 高階語言程式 (Source code) 1. 掃描器 (Lexer) (A sequence of tokens)

圖 8. 4 編譯器的六階段模型 高階語言程式 (Source code) 1. 掃描器 (Lexer) (A sequence of tokens) 一連串的詞彙 2. 剖析器 (Parser) 抽象語法樹 (Abstract Syntax Tree) 3. 語意分析 (Semantic Analysis) 具型態標記的抽象語法 樹 (Annotated Abstract Syntax Tree) 4. 中間碼產生 (Intermediate Code Generator) 中間碼 (Intermediate Code ) 5. 最佳化 (Optimizer) 經過最佳化的碼 (Optimized Code ) 6. 程式碼產生 (Code Generation) 目的程式碼 (Target code) (A sequence of tokens) 一連串的詞彙

語意分析的過程示意圖 stmt sum: id int 設定型態 = Term Exp + Term * Factor Item

語意分析的過程示意圖 stmt sum: id int 設定型態 = Term Exp + Term * Factor Item sum: id i: id int int

中間碼產生過程的示意圖 stmt sum: id Exp = Term + * Factor Item sum: id i:

中間碼產生過程的示意圖 stmt sum: id Exp = Term + * Factor Item sum: id i: id 中間碼產生 * + = i sum t 2 i t 1 t 2 sum

程式剖析到 i=1 完成時的語法樹與堆 疊結構 堆疊 (Stack) <PROG> <Base. List> <BASE> <STMT> sum: id ;

程式剖析到 i=1 完成時的語法樹與堆 疊結構 堆疊 (Stack) <PROG> <Base. List> <BASE> <STMT> sum: id ; = for <EXP> <Base. List> <BASE> <FOR> ( i: id <STMT> = <EXP> <TERM> <FACTOR> <ITEM> 0: number 1: number 成 長 方 向

使用gcc跨平台編譯的範例圖 arm-elf-gcc array_sum_ARM. s arm-elf-gcc array_sum_ARM. o gcc array_sum_IA 32. s gcc array_sum_IA 32.

使用gcc跨平台編譯的範例圖 arm-elf-gcc array_sum_ARM. s arm-elf-gcc array_sum_ARM. o gcc array_sum_IA 32. s gcc array_sum_IA 32. o array_sum. c