问题3:我们通常用什么手段来“实现”一个程序设计语言?
AlgorithmicideaalgorithmforYfromI toNdo(body-of-loop)Programmerendprogramming(human)program inhigh-level languageMVCO,Y(move constant O to location Y)LOOP:CMPN,Y(comparevaluesatlocationsNandY)CompilercompilationJEQREST(if equal jump to statementlabeled"REST(software)ADCI,Y(addconstanttovalueat locationY)编译program in(translated-body-of-loop)AassemblylanguageCompilationJMPLOOP(jump back to statenent labeled"LOOP*REST(rest of program)Amachine codeComputer豆厨execution
编译 Compilation
什么是编译器一个编译器就是一个程序Input:以某一种语言(源语言)编写的程序,Output:与input等价的、用另一种语言(目标语言)编写的程序。源程序目标程序编译器狭义:程序设计语言一机器代码广义:程序变换C++一→C一汇编Pascal →C
什么是编译器 ◼ 一个编译器就是一个程序 ◼ Input:以某一种语言(源语言)编写的程序, ◼ Output:与input等价的、用另一种语言(目标语言)编写的程序。 ◼ 狭义: 程序设计语言 → 机器代码 ◼ 广义:程序变换 C++ → C →汇编 Pascal → C 源程序 编译器 目标程序
示例程序的运行过程口源程序口汇编代码口机器代码LBBO_1:.loc1.175cmpt$10,-20(%rbp)jgeLBBo3##:BB#2:1189.locLtmp6:while(i10)movt-24(%rbp),eaxa=ati;addt-20(%rbp),%eax编译器i++;movlseax,-24(%rbp)3.loc1199movl-20(%rbp),%eaxaddt$1,seaxmovt%eax,-20(%rbp)1.205.LocjmpLBBe_1
示例 ◼ 程序的运行过程 ❑ 源程序 ❑ 汇编代码 ❑ 机器代码 编译器
positioninitial +rate+60:调法分析器编译器工作流程(id.1) (=) (id.2) (+) (id.3) () (60)语法分析器(id.1)Void CompilerO(id.2)(id,3)6A语义分析器position2initial(id,1)rate(id.2)(id,3)inttofloat60中闻代码生成器符号表tl -inttofloat(60)t2-id3.t1t3-id2+t2id1 -t3代码优化器t1 = id3 +60.0i81id2+1代码生成器LDFR2,id3HULFR2.R2,$60.0LDFR1,id2ADDFR1.RI,R2STEid1.RI
编译器工作流程 Void Compiler(){ LexicalAnalysis(); SyntaxAnalysis(); SemanticAnalysis(); InterCodeGen(); CodeOptimization(); AssemblyCodeGen(); }