核心观点:
一个编译程序就是一个语言翻译程序。就是把一种语言书写的程序翻译成另一种语言(目标语言)的等价程序。
重要性:
一个编译程序的重要性体现在它使得多数计算机用户不必考虑与机器有关的繁琐细节,使程序员和程序设计专家独立于机器,这对于当今机器的数量和种类持续不断增长的年代尤为重要。
编译程序的功能:
高级语言程序(源程序) –> 编译程序 –> 低级语言程序(目标程序)
高级语言程序的处理过程:
学过计算机的人都知道,除了编译程序外,还需要一些其他程序才能生成一个可在计算机上执行的目标程序。
需预处理的源程序 –> (预处理程序) –> 源程序 –> (编译程序) –> 目标汇编语言程序 –> (汇编程序)–> 可再装配的机器代码 –> (装配/连接编辑程序)–> 绝对机器代码
上面是一个大体的流程图。简单介绍一下:
一个源程序可能分成几个模块存放在不同的文件里,将这些源程序汇集在一起的任务,由一个叫做预处理程序的程序来完成,有些预处理程序也负责宏展开,像C语言的预处理程序要完成文件合并、宏展开等任务。
编译程序生成的目标程序是汇编代码形式,需要经由汇编程序翻译成可再装配(或可重定位)的机器代码,再经由装配/连接编辑程序与某些库程序连接成真正能在机器上运行的代码。
也就是说,一个编译程序的输入可能要由一个或多个预处理程序来产生;另外,为得到能运行的机器代码,编译程序的输出可能仍需要进一步的处理。
源语言的种类成千上万,从常用的C、C++、Java等,到各种各样的计算机应用领域的专用语言。而目标语言也是种类繁多的,加上编译程序由于构造不同,所执行的具体功能有差异,又分成了各种类型,如一趟编译、多趟编译、具有调试或优化功能的编译等。
尽管存在这些明显的复杂因素,但是任何编译程序所执行的主要任务都是一致的,就是将源语言程序翻译成等价的目标语言程序。通过理解这些任务,使用同样的基本技术,可以为各种各样的源语言和目标语言设计和构造编译程序。