时建立的,而不是生成的C++代码,为什么编译+链接可执行直接

问题描述:

有人问我这个问题时,导师一个入门级程序员,我在想这个编译+链接过程,以便官方和往常一样,我从来没有去想为什么。时建立的,而不是生成的C++代码,为什么编译+链接可执行直接

有一件事我能想到的是提高开发效率,但如果有任何其他更多的编译器相关的原因是什么?

效率。 当你编译一个程序时,你为每个源文件创建一个目标文件,如果你改变一个源文件,你只需要重新编译该模块,然后重新链接(重新连接很便宜)。 如果编译器一次完成所有操作,它将不得不为每次更改重新编译所有内容。

这也符合与该做一件事的小程序的UNIX哲学,让你有一个预处理器,编译器,链接器,库的创建者。这些步骤现在可能是相同工具的不同模式。

然而,有一些原因让你希望编译器在一个步骤中链接,如果你允许编译器在链接时改变目标文件,你可以做一些优化 - 大多数现代编译器都允许这样做,但它要求他们把在编译时将额外的信息放入目标文件中。

它会更好,如果编译器可以在整个项目存储在一个数据库中,而不是源,资源的混乱,浏览信息文件,目标文件等 - 但开发商很保守!

+0

是的,这也是我提到的开发生产力,但是,从编译器算法的角度来看还有没有考虑? – 2010-06-11 15:43:31

+2

另一件要考虑的事情是,它完全可以从不同的obj文件子集创建更多的可执行文件(即两个项目可以使用相同的源代码files = modules = obj文件)。这当然是可能的,这要归功于编译和链接阶段的分离。你不需要从头开始重建所有的东西。 – PeterK 2010-06-11 16:06:40

+0

-1:这与Unix无关 – 2010-06-13 01:30:49

编译文件改变了代码转换成二进制计算机可以读取。链接文件告诉计算机如何完成一个命令。所以不可能一下子完成,没有两个步骤。

+0

什么?这甚至没有意义。 – 2010-06-11 18:16:08

+0

我试图解释编译和链接过程的作用。 – 2010-06-12 06:26:15

+0

-1:那么你做了一个非常糟糕的工作。 – 2010-06-13 01:28:37

这是历史的一部分。回到黑暗时代,电脑几乎没有记忆。创建一个带有足够源代码的程序很容易,它不能一次处理所有程序。所以处理必须分阶段完成:预处理源代码,将源代码编译为程序集(逐个),汇编到目标代码,将所有目标文件链接到最终的可执行文件中。每个步骤都有一个或多个独立工具来完成其任务。多年来,这些工具逐渐得到了改进,但过程的重大设计并未成为主流。

重要的是,建造时间,即使是一个非常大的项目,是24小时。而且能够在一夜之间建立更好。 独立编译,这就是将程序分为“编译单元”独立编译它们,是为了减少编译时间的方式:

  • 如果编译单元尚未改变,如果没有它取决于已经改变,你可以重用旧编译的结果。

  • 您通常可以并行编译多个单元,甚至可以通过工作站网络进行分布。低级Make将会并行编译,并且存在其他工具,如ccdist来分配编译工作。

链接本身几乎没有什么好处,但使用单独编译的结果是必要的。

这是一个非常好的时间来教你的门徒关于单一责任原则!