编译器构造(C语言描述)第一章

本文探讨了编译器的工作原理及其设计要素,包括编译器的组成部分如词法分析器、语法分析器等,以及程序设计语言的语法和语义特征。此外,还讨论了编译器的不同类型和影响其设计的因素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:概述和历史

程序设计语言(源)à编译器à机器语言(目标)

编译器:程序设计语言翻译器

FORTRAN编译器,nrofftroff


2:编译器可以做什么

分类一:按照试图生成的目标代码类型

(1) 纯机器代码:仅包含指令集中的指令

(2) 拓广的机器代码:生成操作系统例程和语言支撑例程所拓展的机器代码(虚拟机的指令)

(3) 虚拟机器代码:代码完全由虚拟指令组成(增强可移植性)

分类二:生成的目标机器代码的格式

(1) 汇编语言格式:简化翻译,将许多代码生成决定留给汇编器

(2) 可重定位的二进制代码格式:外部引用,局部指令,数据地址尚未绑定

(3) 内存映射(加载和运行)格式:通过编译的输出可以被加载到编译器的地址空间中,立即执行,此过程快,但是,外部引用、库及编译例程借口非常有限,且每次执行需重新编译


3:解释器:

执行程序而不明确地进行翻译。

程序和任何其他数据一样,执行过程中控制点在解释器中而不在用户程序中

允许:

(1) 执行中可以对用户程序进行修改或想用户源码中添加代码

(2) 对象所代表的类型是动态的

(3) 更好的错误诊断信息

(4) 极大程度的机器无关性

开销:

(1) 执行过程中,程序文本必须被不断地重新检查,动态化语言执行速度下降

(2) 巨大的空间开销,

3:编译器结构

(1) 词法分析器(scanner):将字符分组为独立的单词和符号来对源程序进行分析。

(2) 语法分析器(parser):语法分析器读入词法记号(token)并将其按照CFG产生式的规定分组为单元,形成语法结构(语法树)。

(3) 语义例程(Semantic Routine):检查静态语义,将CFG分组或语法树进行翻译,生成实现该结构的IRIntermidiate Representation)代码。

(4) 优化器(Optimizer):对IR代码进行分析并转化为功能上等价但经过改进的IR代码。

(5) 代码生成器(Code Generator):将IR代码映射为目标及其代码。

(6) 符合和属性表(Symbol and Attribute Table):允许将信息与标识符相关联的机制。


4:程序设计语言的语法和语义

完整的程序设计语言包括了语法(结构)和语义(意义)。

语法通常可以分为:上下文无关,上下文相关两种

(1)上下文无关的序列直接作为语法问题处理(只需要检验符号序列是否符合定义即可,不依赖与符号的意义)。

(2)上下文相关的序列作为语义问题处理(不仅仅检验符号序列是否符合定义,还要检查符号的意义是否符合规定)。

语义组件被典型地分为两种:静态语义,运行时语义

(1)静态语义:定义了上下文相关的约束,程序被接受之前,需要强制这些约束。都不能用CFG来表达的标识符声明,操作符和操作数的类型相容,适当数量的参数调用过程。

(2)运行时语义:规定程序做什么,计算什么,通常被及其非形式化地规定?

总结:程序设计语言事实上是由编译器选择接受的内容以及选择如何翻译语言结构的方式来定义。


5:编译器设计与程序设计语言设计

程序设计语言的设计影响并常常支配编译器的设计。

易于编译的程序设计语言有诸多优点:

(1) 易于学习、阅读和理解

(2) 在许多机器上有高质量的编译器。

(3) 通常会生成更好的代码。

(4) 编译错误较少。

(5) 编译器会更小、更廉价、更快、更可靠、更普及。

(6) 编译器诊断错误和程序开发特性通常会更好。

一个允许编译的程序设计语言必须具备什么属性?须考虑一下问题:

(1) 执行开始之前确定每个标识符引用的作用域和绑定?

(2) 运行开始之前确定一个对象的类型?

(3) 现存的程序文本在执行过程中能否被改变或添加?


6:编译器分类

多种变体:

(1) 错误诊断编译器:提供对程序的详细检查并详细地说明程序员的错误。

(2) 优化编译器:特别设计用来以编译器复杂性和编译时间的增加为代价产生高效的机器代码。优化编译器实际上是不存在的,只能通过各种混合的转换来改善程序的性能。

(3) 可再目标编译器:给定现存的多种程序设计语言和计算机,必须编写大量相似、但不同的编译器,这种形式决定了从事编译器编写行业的人们的利益,单也导致了许多重复努力以及编译器质量的极大差异。从而产生了可再目标编译器。


7:影响编译器设计的因素(高效+可靠)

1)计算机指令集面向汇编级程序设计,高级程序设计的代码难以实现

2)调整指令集,甚至直接提供硬件支持

3)精简指令集,减小编译器任务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值