2.1.2 编译器
编译器直接把源代码转化成汇编语言或机器指令。最终的结果是一个或多个机器代码的文件。这是一个复杂的过程,通常分几步完成。使用编译器时,从写源代码转到执行代码,是一个较长的过程。
仰仗编译器设计者的聪明才智,编译器生成的程序往往只需较少的运行空间,并且执行速度更快。虽然编译后的程序较小、运行速度快是人们认为应当使用编译器的理由,但在许多时候这却不是最重要的。某些语言(如C语言)可以分别编译各段程序。最后使用连接器(linker)把各段程序连接成一个完整的可执行程序。这个过程称为分段编译(separate compilation)。
分段编译有许多好处。由于编译器或编译环境的限制,不能一次完成编译的整个程序,可以分段编译。每次创建和测试程序的一部分,当这部分程序能正常运行后,就把它作为程序组块保存起来。人们把测试通过并能正常运行的程序块收集起来加入库(library)中,供其他程序员使用。由于独立创建每一段程序,其他各段程序的复杂性便被隐藏起来。所有这些特点支持大型程序的创建[1]。
编译器的调试功能不断地得以改进。早期的编译器只能产生机器代码,要知道程序的运行状态,程序员要插入打印语句。但这样做并不总是有效的。现代编译器能在可执行程序中插入与源代码有关的信息。这个信息由一些强大的源代码层的调试器(source-level debugger)使用,以便通过跟踪程序经过源代码的进展来显示程序的执行情况。
为了提高编译速度,一些编译器采用了内存中编译(in-memory compilation)。大多数编译器,编译时每一步都要读写文件。内存中编译器就是将编译器程序存放在RAM中。对于小程序来说,内存中编译器几乎能和解释器一样响应。
[1]Python又是一个例外,因为它也支持分段编译。