代码之家  ›  专栏  ›  技术社区  ›  Baiyan Huang

为什么编译+链接时,构建一个C++代码,而不是直接生成可执行文件

  •  3
  • Baiyan Huang  · 技术社区  · 15 年前

    当我指导一个入门级程序员时,有人问我这个问题,我认为这个编译+链接过程是如此正式和平常,以至于我从来没有想过为什么。

    我能想到的一件事是提高开发效率,但是是否还有其他与编译器相关的原因呢?

    5 回复  |  直到 15 年前
        1
  •  13
  •   Martin Beckett    15 年前

    效率。 编译程序时,为每个源文件创建一个对象文件,如果更改源文件,则只需重新编译该模块,然后重新链接(重新链接很便宜)。 如果编译器在一次传递中完成了所有操作,那么它将必须为每个更改重新编译所有内容。

    它还符合小程序的Unix原理,即只做一件事,所以您有一个预处理器、一个编译器、一个链接器、一个库创建者。这些步骤现在可能是同一工具的不同模式。

    但是,您希望编译器在一个步骤中链接的原因是,如果允许编译器在链接时更改对象文件,则可以进行一些优化-大多数现代编译器都允许这样做,但它要求它们在编译时将额外的信息放入对象文件中。

    如果编译器可以将整个项目存储在一个数据库中,而不是混乱的源、资源、浏览信息文件、对象文件等,那就更好了——但是开发人员非常保守!

        2
  •  2
  •   BatchyX    15 年前

    这是历史的一部分。在黑暗时代,计算机的内存很小。用足够的源代码创建一个程序很容易,所有的源代码都不能一次处理。因此,处理必须分阶段完成:预处理源代码、将源代码编译到程序集(逐个)、将程序集编译到对象代码、将所有对象文件链接到最终可执行文件。每个步骤都有一个或多个独立的工具来完成其任务。这些年来,这些工具逐渐得到了改进,但没有一个主要的流程重新设计成为主流。

        3
  •  2
  •   Norman Ramsey    15 年前

    重要的是,构建时间,即使对于一个非常大的项目,也要少于24小时。能在一夜之间建造更好。 单独汇编 也就是说,将一个程序划分为“编译单元”,并独立地编译它们,是减少构建时间的方法:

    • 如果编译单元没有被更改,并且它所依赖的任何内容都没有更改,则可以重用旧编译的结果。

    • 您通常可以并行地编译多个单元,甚至可以在工作站网络上分布。低级make将并行编译,其他工具如 ccdist 存在以分发编译工作。

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

        4
  •  2
  •   Edward Strange    15 年前

    多好的时间来教你的专家关于单一责任原则!

        5
  •  -3
  •   Greg Treleaven    15 年前

    编译文件会将代码更改为计算机可以读取的二进制代码。链接文件告诉计算机如何完成命令。因此,如果没有这两个步骤,就不可能一次生成全部内容。