问题3: 我们通常用什么手段 来“实现”一个程序 设计语言?
Algorithmic idea algorithm for y from I to N do (body-of-loop) Programmer programming end (human) program in high-level language MVCO.Y (move constantto location Y) LOOP:CMP N.Y (compare values at locations N and Y) Compiler compilation (software) JEQ REST (if equajumto statement labelledREST ADC 1.Y (addconstova 编译 program in A (aad-bdy-of-oop) Compilation assembly language JMP LOOP (jump back to statement labeled "LOOP") REST: (restofproram) machine code Computer execution
编译 Compilation
什么是编译器 ·一个编译器就是一个程序 Input::以某一种语言(源语言)编写的程序, Output:与input等价的、用另一种语言(目标语言)编写的程序。 源程序 编译器 目标程序 ·狭义:程序设计语言→机器代码 ▣广义:程序变换C++→C汇编 Pascal→C
什么是编译器 ◼ 一个编译器就是一个程序 ◼ Input:以某一种语言(源语言)编写的程序, ◼ Output:与input等价的、用另一种语言(目标语言)编写的程序。 ◼ 狭义: 程序设计语言 → 机器代码 ◼ 广义:程序变换 C++ → C →汇编 Pascal → C 源程序 编译器 目标程序
示例 ■程序的运行过程 口源程序 口汇编代码 口机器代码 L8B0_1: .loc 1175 cmpl s10,-20(erbp) jge LBB0_3 ##B8#2 .10d 1189 Ltmp6: while (i<10){ movl -24(%rbp),%eax a=a+1: 编译器 addl -20(srbp),%eax i++; movl %eax,-24(%rbp) .loc 1199 movl -20(%rbp),teax addl 51,,%ea× movl %eax,-20(%rbp】 .10c 1205 jmp LBB0_1
示例 ◼ 程序的运行过程 ❑ 源程序 ❑ 汇编代码 ❑ 机器代码 编译器
position initial rate 60 编译器工作流程 词法分析器 (id.1)(e)(id.2(+)id.3)()60 语法分析器 (id,1 + Void Compiler( (id,2) (id.3) 60 t 语义分析器 position (d,1 2 initial (id,2) 3 rate (id,3 inttofloat t 训 中间代玛生成器 符号表 t1 inttofloat(60) t2 id3 t1 t3 id2 t2 1d1=t3 代马优化器 t1=1d3·60.0 1识 代码生成器 LDF R2,id3 HULF2.R2,60.0 LDF R1,id2 ADDF RI.R1.R2 STF id1,R1
编译器工作流程 Void Compiler(){ LexicalAnalysis(); SyntaxAnalysis(); SemanticAnalysis(); InterCodeGen(); CodeOptimization(); AssemblyCodeGen(); }