C语言编译系统初探
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
此 外 为 了 生 成 能 够 脱 离 Win32 环 境 的 程序,该系统最后还将为目标程序安装一 个32位DPMI扩展器,使得程序即使部署在 纯DOS环境下依然能够进入处理器保护模 式并能访问全部4GB的地址空间。
运行库及启动代码
运行库包括了很多常用的C标准库函 数,并全部由该编译系统编译生成。
类型表
变量表
函数表
常量表
Baidu Nhomakorabea
• 词法分析将源程序分解为按C语言规定的保留字、标 识符、数字、符号、字符串等,并处理预编译指令。
• 代码生成进行将输入的单词归约为诸如声明、定义、 语句、表达式等实体的尝试,并登记到各相关表中, 如果归约失败还将记录出错信息。整个过程采用递归 的方式进行逐级的分析。
• 类型表记录由typedef所定义的类型。
与标准C之间语法的差异
✓函数调用前必须声明。 ✓函数、外部变量的声明不能省略基本类
型标识。 ✓函数参数表如果为空则表示无任何参数。 ✓局部变量的定义无须全部写在语句体的
开头部分。 ✓可以使用C++风格的单行注释。
汇编程序&连接程序
这两个部分不是我做的,我只是采用 了Borland的TASM和TLINK来充当这两个 角色。
unsigned long 64
0 ~ 184467445
float
32 1.401298464e-45 ~ 3.402823466e+38
double
64 4.940656458e-324 ~ 1.797693134e+308
long double 80 3.362103143e-4932 ~ 1.189731495e+4932
8
-128 ~ +127
unsigned char 8
0 ~ 255
short
16
-32768 ~ +32767
unsigned short 16
0 ~ 65535
int
32
-2147483648 ~ +2147483647
unsigned int 32
0 ~ 4294967295
long
64
-92233728 ~ +92233727
集成开发环境(IDE)
同样是由该编译系统实现,并利用了 前面提到的工程管理程序。这是整个系统 的主要界面,集成了系统几乎所有的功能。 由于C语言不直接支持面向对象的程序设 计,因此我引用了Windows API中的消息传 递机制来模拟面向对象的机制。
结束语
这个“初探”的系统已经有一定的实用价值 了。源程序附有我以前在Turbo C 2.0上写的一个 图形演示程序,在这个系统上运行几乎未作什么 修改。与TC的版本比较,在该系统上的版本能够 并发更多的特效(主要得益于32位的代码并突破 了实模式下640KB的内存限制),且由于对高精 度计时的支持使得程序运行速率能够更加精确地 控制。加上前面的MAKE程序和IDE,都使整个 系统经受了一定的能力上和稳定性上的考验。
• 函数表直接记录目标代码。该编译程序不产生中间代 码。
• 常量表记录字符串、浮点常数等无法由x86立即数寻址 方式引用的常量。
• 类型表和变量表采用栈结构,这是为了方便表示非全 局的类型和变量。
• 引用信息记录了源程序所有引用过的源文件,这些信 息将用于工程管理。
简单数值类型
类型
位长
取值范围
char
编译器以普通的C源代码文件为输入,以32 位x86汇编语言代码文件为输出。
该编译器实现了一些简单的优化。如常值表 达式的化简等。
编译流程
源程序
Token流
词法分析 &解释预 处理指令
代码生成 类型/声明分析
函数体分析 语句分析 表达式分析
错误表 错误信息输出
目标代码输出
错误信息 目标代码 引用信息
然而,这个系统毕竟还只处于实验阶 段,仍有许多不足之处,很多功能也还不 完善。最大的遗憾就是由于时间仓促没能 完成Debug模块和帮助子系统,以后一有 时间我会补完的。
谢谢!
启动代码由纯汇编语言编写,包含目 标程序启动时所需的与运行环境相关的初 始化代码及基础支持代码(如截获系统中 断、高精度计时、64位长整数乘除运算支 持等)。
工程管理程序(MAKE)
这个模块是由该编译系统实现的。它 能够逐个检查工程内的每个模块的修改时 间,对上次编译后又修改过的模块或新加 入的模块进行编译、汇编,最后根据需要 进行连接。整个过程都是自动完成的,这 使得建造工程变得简单了许多,同时也为 我后来的开发工作提供了很大的方便。
系统流程
C编译 程序
汇编 程序
C源代码 编译 汇编代码 汇编 目标代码
C源代码 编译 汇编代码 汇编 目标代码
C源代码 编译 汇编代码 汇编 目标代码
C源代码 编译 汇编代码 汇编 目标代码
连接 程序
连接
可执行文件
C运行库
编译程序
编译器是系统的核心部分,用纯面向对象的 方法设计,是技术上最难实现的部分。由于本项 目的目标只是做编译器的尝试且为了调试方便, 因此并未使用低级语言而是采用Visual C++ 6.0来 实现。
C语言编译系统初探
概述
该系统是一个简易的32位C语言编译 系统,可以实现C语言程序从编辑修改、 编译到连接、运行等一系列过程。能够工 作在Windows的各个版本下。
必须声明的是:在设计实现这个系统 的时候我并未正式接触过编译原理,因此 难免会有很多贻笑大方之处☺
主要构成模块
• 编译程序 • 汇编程序 • 连接程序 • 运行库及启动代码 • 工程管理程序 • 集成开发环境
运行库及启动代码
运行库包括了很多常用的C标准库函 数,并全部由该编译系统编译生成。
类型表
变量表
函数表
常量表
Baidu Nhomakorabea
• 词法分析将源程序分解为按C语言规定的保留字、标 识符、数字、符号、字符串等,并处理预编译指令。
• 代码生成进行将输入的单词归约为诸如声明、定义、 语句、表达式等实体的尝试,并登记到各相关表中, 如果归约失败还将记录出错信息。整个过程采用递归 的方式进行逐级的分析。
• 类型表记录由typedef所定义的类型。
与标准C之间语法的差异
✓函数调用前必须声明。 ✓函数、外部变量的声明不能省略基本类
型标识。 ✓函数参数表如果为空则表示无任何参数。 ✓局部变量的定义无须全部写在语句体的
开头部分。 ✓可以使用C++风格的单行注释。
汇编程序&连接程序
这两个部分不是我做的,我只是采用 了Borland的TASM和TLINK来充当这两个 角色。
unsigned long 64
0 ~ 184467445
float
32 1.401298464e-45 ~ 3.402823466e+38
double
64 4.940656458e-324 ~ 1.797693134e+308
long double 80 3.362103143e-4932 ~ 1.189731495e+4932
8
-128 ~ +127
unsigned char 8
0 ~ 255
short
16
-32768 ~ +32767
unsigned short 16
0 ~ 65535
int
32
-2147483648 ~ +2147483647
unsigned int 32
0 ~ 4294967295
long
64
-92233728 ~ +92233727
集成开发环境(IDE)
同样是由该编译系统实现,并利用了 前面提到的工程管理程序。这是整个系统 的主要界面,集成了系统几乎所有的功能。 由于C语言不直接支持面向对象的程序设 计,因此我引用了Windows API中的消息传 递机制来模拟面向对象的机制。
结束语
这个“初探”的系统已经有一定的实用价值 了。源程序附有我以前在Turbo C 2.0上写的一个 图形演示程序,在这个系统上运行几乎未作什么 修改。与TC的版本比较,在该系统上的版本能够 并发更多的特效(主要得益于32位的代码并突破 了实模式下640KB的内存限制),且由于对高精 度计时的支持使得程序运行速率能够更加精确地 控制。加上前面的MAKE程序和IDE,都使整个 系统经受了一定的能力上和稳定性上的考验。
• 函数表直接记录目标代码。该编译程序不产生中间代 码。
• 常量表记录字符串、浮点常数等无法由x86立即数寻址 方式引用的常量。
• 类型表和变量表采用栈结构,这是为了方便表示非全 局的类型和变量。
• 引用信息记录了源程序所有引用过的源文件,这些信 息将用于工程管理。
简单数值类型
类型
位长
取值范围
char
编译器以普通的C源代码文件为输入,以32 位x86汇编语言代码文件为输出。
该编译器实现了一些简单的优化。如常值表 达式的化简等。
编译流程
源程序
Token流
词法分析 &解释预 处理指令
代码生成 类型/声明分析
函数体分析 语句分析 表达式分析
错误表 错误信息输出
目标代码输出
错误信息 目标代码 引用信息
然而,这个系统毕竟还只处于实验阶 段,仍有许多不足之处,很多功能也还不 完善。最大的遗憾就是由于时间仓促没能 完成Debug模块和帮助子系统,以后一有 时间我会补完的。
谢谢!
启动代码由纯汇编语言编写,包含目 标程序启动时所需的与运行环境相关的初 始化代码及基础支持代码(如截获系统中 断、高精度计时、64位长整数乘除运算支 持等)。
工程管理程序(MAKE)
这个模块是由该编译系统实现的。它 能够逐个检查工程内的每个模块的修改时 间,对上次编译后又修改过的模块或新加 入的模块进行编译、汇编,最后根据需要 进行连接。整个过程都是自动完成的,这 使得建造工程变得简单了许多,同时也为 我后来的开发工作提供了很大的方便。
系统流程
C编译 程序
汇编 程序
C源代码 编译 汇编代码 汇编 目标代码
C源代码 编译 汇编代码 汇编 目标代码
C源代码 编译 汇编代码 汇编 目标代码
C源代码 编译 汇编代码 汇编 目标代码
连接 程序
连接
可执行文件
C运行库
编译程序
编译器是系统的核心部分,用纯面向对象的 方法设计,是技术上最难实现的部分。由于本项 目的目标只是做编译器的尝试且为了调试方便, 因此并未使用低级语言而是采用Visual C++ 6.0来 实现。
C语言编译系统初探
概述
该系统是一个简易的32位C语言编译 系统,可以实现C语言程序从编辑修改、 编译到连接、运行等一系列过程。能够工 作在Windows的各个版本下。
必须声明的是:在设计实现这个系统 的时候我并未正式接触过编译原理,因此 难免会有很多贻笑大方之处☺
主要构成模块
• 编译程序 • 汇编程序 • 连接程序 • 运行库及启动代码 • 工程管理程序 • 集成开发环境