先写一个最简单的汇编器AssA(可以只支持一部分指令),手工翻译成二进制指令码,在裸机上跑。
然后用这个AssA支持的汇编语言或子集写一个功能略强支持全部指令的汇编器AssB,用AssA汇编后生成目标码。
用汇编语言写一个宏汇编器AssC,用AssB生成目标码。
用汇编语言写一个最简单的C语言子集编译器C tiny,可以仅仅支持整数和指针数据类型,输出汇编语言源文件。用AssC汇编这个编译器。
以后就是用C tiny写一个支持更多数据类型的C语言子集编译器C small, 用C tiny 编译C small,再用 AssC 生成目标码。
如果愿意,这时候可以再用可执行的C small 编译器编译C small自己的源代码,再用AssC生成目标码,形成新的C small编译器。
下面,可以选择用C small重写汇编器AssD……
接着再用C small支持的C语言子集,编写更大的C语言子集编译器C medium,然后是C big、操作系统、在操作系统上运行的新C编译器 ……
这是仅有目标计算机自己的情况下玩的自举开发途径。如果已经有了一套完整的体系结构能运行C语言和编译器,可以在这个机器上开发改写C编译器,让其产生目标平台的可执行代码,也就是通常说的“交叉编译”。常见的例子,就是在PC上开发MCS51单片机程序。
在GCC自己编译自己的过程里,有三个配置选项:build host target,分别代表编译编译器的平台、编译器运行的平台和编译生成代码的目标平台。举例而言:你可以在Linux/x86 平台上用GCC编译GCC自己,生成一个运行在Solaris/SPARC平台上的新版本GCC,这个GCC在SUN工作站上运行后,可以生成运行在裸机上的ARM目标代码……
阅读(1414) | 评论(0) | 转发(0) |