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

编译程序开发的方法

Posted on 2012-09-13 16:39  蜗牛57  阅读(1006)  评论(0编辑  收藏  举报

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

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

 

 

  我们的教材上说,编译程序的开发常常采用 自编译、交叉编译、自展和移植等技术实现。

  1.自编译 

  用某种高级语言书写自己的编译程序称为自编译。
例如,假定A机器上已有一个PASCAL语言可以运行,则可以用PASCAL语言编写出一个功能更强的PASCAL语言编译程序,然后借助于原有PASCAL编译程序对新编写的PASCAL编译程序进行编译,从而在编译后即得到一个能在A机器上运行的功能更强的PASCAL编译程序。
  2.交叉编译  
  交叉编译是指用A机器上的编译程序来产生可在B机器上运行的目标代码。
例如,若A机器上已有C语言可以运行,则可用A机器中的C语言编写一个编译程序,它的源程序是C语言程序,而产生的目标程序则是基于B机器的,即能够在B机器上执行的低级语言程序。
 
以上两种方法都假定已经有了一个系统程序设计语言可以使用,若没有可使用的系统程序设计语言,则可采用自展或移植的办法来开发编译程序。
 
  3.自展
  自展的方法是:首先确定一个非常简单的核心语言L0,然后用机器语言或汇编语言编写出它的编译程序T0;再把语言L0扩充到L1,此时有L0L1,并用L0编写L1的编译程序T1(即自编译);然后再把语言L1扩充为L2,此时有L1L2,并用L1编写L2的编译程序T2……这样不断扩展下去,直到完成所要求的编译程序为止。
  4.移植
  移植是指A机器上的某种高级语言的编译程序稍加改动后能够在B机器上运行。一个程序若能较容易地从A机器搬到B机器上运行,则称该程序是可移植的。移植具有一定的局限性。
 

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

 

  一、程序。无论是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