链接器是否存在于所有编译的编程语言中



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

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

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

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

也就是说,链接器

不是语言编译实现的必要部分,并且可以想象某些语言实现不会使用链接器(考虑一个学生项目来编写语言并实现它 - 如果这种语言不期望与任何大型程序一起使用,那么实现/集成链接器所花费的时间可能被认为是不值得的(。

例如,
Java(

严格来说(没有称为"链接器"的工具,但它具有类似的概念。

从根本上说,如果您的可执行代码是由不相交的对象文件(或等效文件(构建的,那么在需要运行时,必须始终有一些东西将它们组合在一起。

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

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

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

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

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

所以你可以说的是,对于一个足够模糊的链接定义,所有具有单独编译的语言都支持它,而对于足够严格的版本,许多现代编译器不会"链接"任何语言。

最新更新