版权声明:如果喜欢的话,可以撩我哟,此处没有联系方式,想要就自己找哈。 https://blog.csdn.net/qq_39384184/article/details/84291319
编译器的概述
- 编译器是一个程序
- 核心功能是把源代码翻译成目标代码
- 源代码:
- C/C++, Java, C#, html, …
- 目标代码:
- x86, IA64, ARM, MIPS, …
编译器的结构
编译器具有非常模块化的高层结构,编译器可看成多个阶段构成的“流水线”结构。
每个阶段将源程序从一种表示转换成另一种表示:
- 词法分析器:字符流->单词流
- 语法分析器:单词流->语法树
- 语义分析器:
- 收集标识符的属性信息:
- 类型(Type)
- 种属(Kind)
- 存储位置、长度
- 值
- 作用域
- 参数和返回值信息
- 语义检查:
- 变量或过程未经声明就使用
- 变量或过程名重复声明
- 运算分量类型不匹配
- 操作符与操作数之间的类型不匹配
- 收集标识符的属性信息:
- 中间代码生成器:抽象语法树->中间表示(与平台无关的抽象程序):
- 易于产生
- 易于翻译成目标程序
- 三地址码:temp1=c*d;temp2=b+temp1;a=temp2
- 四元式:(op, arg1, arg2, result);(* , c , d , temp1);(+ , b, temp1 , temp2);(= , temp2 , - , a)
- 代码优化器:试图改进中间代码,以产生执行速度较快的机器代码:
- temp1=c*d;temp2=b+temp1;a=temp2
- change to:temp1=c*d;a=b+temp1
- 代码生成器:生成可重定位的机器代码或汇编代码:
- temp1=c*d;a=b+temp1
- change to:Mov R2,c;Mul R2, d;Mov R1, b;Add R2, R1;Mov a, R2
- 一个重要任务是为程序中使用的变量合理分配寄存器
- 符号管理表:
- 基本功能是记录源程序中使用的标识符,
- 并收集与每个标识符相关的各种属性信息,
- 并将它们记载到符号表中。
- 错误处理器:
- 处理方式:报告错误,应继续编译
- 大部分错误在语法分析、语义分析阶段检测出来
- 词法分析:字符无法构成合法单词
- 语法分析:单词流违反语法结构规则
- 语义分析:语法结构正确,但无实际意义
编译技术的应用
- 高级程序设计语言的实现
- 针对计算机体系结构的优化(并行性与内存层次结构)
- 新计算机体系结构的设计(CISC -> RISC)
- 程序翻译
- 软件生产率工具(查错)