主要分为2个部分:分析(analysis)部分和综合(synthesis)部分前端
综合部分:根据中间表示和符号表构造目标程序。java
词法分析器读入字节流,将他们组成有意义的词素(lexeme)序列,以词法单元(token)的形式输出:后端
<token-name,attribute-value>数组
例子:缓存
position = initial + rate * 60markdown
词法分析后为一个词法单元序列编辑器
<id,1><=><id,2><+><id,3><*><60>函数
语法分线器使用词法分析器生成的各个词法单元 建立树形的中间表示,累似一颗二叉树表的中间表示。工具
使用语法树和符号表中的信息检查源程序是否和语言定义的语义一致。性能
完成语法分析和语义分析,编译器生成一个类机器语言的中间表示。
意义:易于生成,容易被翻译成目标机器上的语言
常见的有 三地址代码(three-address code的中间表示。这种中间表示累死汇编语言的指令,每一个指令有三个运算份量,每一个运算份量像一个寄存器。
机器无关的代码优化,能够改进中间代码,以便生成更好的目标代码(更短更快)
//三地址代码序列 t1 = inttofloat(60) t2 = id3 * t1 t3 = id2 + t2 id1 = t3 //优化后 t1= id3 * 60.0 id1 = id2 + t1
以源程序的中间表示做为输入,映射到目标语言(机器代码)。需要为程序中的变量选择寄存器或内存位置。合理分配寄存器以存放变量的值相当重要。
如使用寄存器R1和R2,完成中间代码翻译的机器代码:
LDF R2, id3 MULF R2, R2, #60.0 LDF R1, id2 ADDF R1, R1, R2 STF id1, R1
符号表为每个变量名字建立了一个记录条目,包括类型,做用域。对于过程名字,包括参数数量和类型,参数的传递方式,反回类型。
在特定的实现中,多个步骤的活动被组合成一趟(pass)。每趟读入一个输入文件并产生一个输出文件。词法语法,语义分析组成一个pass,代码优化做为一个可选的pass,为特定目标机生成代码为一个pass。
经过把前端和不一样的目标机后端结合,创建针对不一样目标机的编译器。
实现一个完整的软件开发环境,包含语言编辑器,调试器,版本控制,程序秒暑期,测试管理等工具。
名词解释
几乎全部的高性能计算系统都用到了两种技术:并行(Parallelism)和内存层次结构(memory hierarchy)。