2

它确实存在于 C/C++ 中,但我不确定其他任何编程语言。我只是好奇链接器是否存在于所有编译的编程语言中,或者每个语言创建者都决定如何编译代码?

对于 Benj:我的意思是本地语言,没有像 CLR 这样的托管代码。

4

5 回答 5

7

严格来说,链接器不是语言的一部分,而是语言实现的一部分。(此外,语言本身并不是“编译”或“解释”的——这些也是实现的特征)。

链接器允许语言实现者实现“单独编译”。单独编译是一个非常重要的功能,它允许程序的单独部分物理解耦并允许部分构建(这可以减少总构建时间)。出于这个原因,大多数输出​​本机二进制文件的语言实现将使用链接器作为其实现的一部分。

也就是说,链接器不是语言编译实现的必需部分,并且可以想象某些语言实现不会使用链接器(考虑一个学生项目来编写一种语言并实现它——如果这种语言是预计不会与任何大型程序一起使用,花在实现/集成链接器上的时间可能被认为不值得)。

于 2012-05-01T13:07:59.893 回答
3

例如,Java(严格来说)没有称为“链接器”的工具,但它具有类似的概念。

从根本上说,如果您的可执行代码是由不相交的目标文件(或等效文件)构建的,那么在它们需要运行时,总有一些东西可以将它们拉到一起。

于 2012-05-01T12:56:17.980 回答
3

不,有许多编译语言不使用链接器。例如 Forth、Lisp 和 Java 在某种程度上不需要它。

仍然需要完成相同的工作(让不同的编译单元相互了解),但这可以通过链接步骤以外的其他方式完成。例如,查找可以在运行时完成。

于 2012-05-01T13:06:57.040 回答
2

从历史上看,有一些编译语言不使用任何类型的链接。也许最著名的是 Turbo Pascal,它在其最早的版本(4.0 之前)中对源文件(或源文件,如果{$I filename}使用该指令)进行单次传递,直接生成输出代码,并建立一个修复列表(我认为在其他编译完成后将修复应用于写入的目标文件,因为即使使用软盘驱动器作为目标,编译器也能正常运行)。

于 2012-05-01T13:06:41.697 回答
1

定义“链接器”的含义。每当有单独的编译时,无论编译输出如何,都必须有一个“链接”的步骤。但是,如果您考虑“链接”只是在其他编译的目标代码中填写地址(传统链接器所做的),那么许多更现代的系统不会“链接”。编译器的输出将是某种中间格式,最后一步将在从中生成机器代码之前将它们组合成一个实体。

当然,所有这些都忽略了动态链接和及时编译的问题,这进一步模糊了问题。

So about all you can say is that for a sufficiently vague definition of linking, all languages with separate compilation support it, and for a sufficiently strict version, a lot of modern compilers don't "link" for any language.

于 2012-05-01T13:10:27.013 回答