博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

自展,交叉编译(转)

Posted on 2012-10-03 10:19  蜗牛57  阅读(378)  评论(0编辑  收藏  举报

  最近开始学习编译原理。貌似不好学的样子,所以刚开始就得用功。

  还好网络是强大的,弄点资料帮帮忙。

---------------------------------------隔---------------------------------------隔------------------------------

 

  一、程序。无论是Windows操作系统下的exe程序还是Linux操作系统下的elf可执行程序,甚至手机上的程序,它们都是可以直接执行的。而实际上,一个程序本质上是一个文件,文件内部保存的是机器语言(01串)。

    二、程序依赖。对于普通用户,比较常见的现象是,一个exe程序放在Linux下是无法直接运行的。这说明程序本身是需要依赖于操作系统的。并且,在x86平台下编译的Linux内核在手机上是无法运行的,这说明程序依赖于硬件设备。内核实际上也是一个程序,只不过它不依赖于操作系统,并且可以控制计算机的全部部件。

    三、机器语言。由于程序是机器语言(01串),早期编程实际上是在打孔纸带上完成的。有孔和无孔表示0和1。将打孔纸带插入计算机。计算机读取打孔纸带上的内容并执行。后来有了存储设备(早期的存储设备比如磁带什么的我就不在这说了,这里直接以非常高级的“硬盘”来说明),我们把编写好的01串保存在一个文件中存储在硬盘上,这样计算机可以直接从硬盘中读取这个程序并执行。

    四、编程语言。后来大家觉得编写机器语言太蛋疼了(何止是疼啊,都快碎了),发明了一些编程语言,比如汇编语言。汇编语言代码保存在一个文件中,称作“源代码文件”。我们需要将保存汇编语言的源代码文件翻译成机器语言的程序才能执行。后来又陆续有了C语言,C++等比较高级的编程语言(暂时不考虑脚本语言和基于虚拟机的编程语言),都需要首先把源代码翻译成机器语言才能执行。

    五、编译器。简单地,我们可以这样认为:将源代码翻译成机器语言的过程叫做编译,完成编译工作的程序叫做编译器。所以,编译器也是一个程序。(实际上,“他不是一个人!”,编译器不是“一个”程序,而是很多程序共同完成编译的工作。)

    六、自展。比如,我们现在有一个编译器A。编译器也是一个程序,所以A肯定对应着源代码,设为X。那么是谁把源代码X编译成了A?肯定不是A。假设是编译器B将源代码X编译成了编译器A。B又是谁编译的呢?你会发现,这可能是一个无穷无尽的问题,最终归结到,第一个编译器是怎么产生的?你可能会猜,是用让人蛋疼的机器语言写的。恭喜你,猜对了。

        首先,有了机器语言。我们发明了一个非常简单的编程语言Z,之后用机器语言写了一个Z语言的编译器。后来,我们又发明了一个稍微复杂一点的编程语言Y,之后用Z语言写了一个Y语言的编译器。最后,我们又发明了一个很复杂的编程语言X,之后用Y语言写了一个X语言的编译器。这种过程就叫做自展。

    七、交叉编译。比如我想写个手机游戏,我该用什么编译器?通常,我们在计算机上编译,产生的程序仍然要运行在计算机上。也就是说,编译器的运行环境和它产生的程序的运行环境相同。那么我们寻找一个在手机上运行的编译器不就可以了吗?虽然现在手机的处理器性能已经有了非常大的提高,不过运行编译器仍然有些吃力。所以我们希望找到这样一个编译器:编译器运行在计算机上,但是它能产生运行在手机上的程序。这种编译器的运行环境与产生程序的运行环境不同的编译过程叫做交叉编译。完成交叉编译的程序叫做交叉编译器。

本文出自 “elephant_liu” 博客,请务必保留此出处http://elephantliu.blog.51cto.com/1107116/567633