它确实存在于C / C ++中,但我不确定任何其他编程语言。我只是好奇是否链接存在于所有编译的编程语言中,或者每个语言创建者都决定如何编译代码?
对于Benj:我的意思是母语,没有像CLR这样的托管代码。
答案 0 :(得分:8)
严格地说,链接器不是语言的一部分,而是语言实现的一部分。 (此外,语言本身并未“编译”或“解释” - 这些都是实现的特征)。
Linkers允许语言实现者实现“单独编译”。单独编译是一项功能,对于允许程序的各个部分进行物理分离以及允许部分构建(可以减少总构建时间)非常重要。出于这个原因,输出本机二进制文件的大多数语言实现将使用链接器作为其实现的一部分。
也就是说,链接器不是语言编译实现的必需部分,并且可以想象某些语言实现不会使用链接器(考虑学生项目编写一个语言并实现它 - 如果不希望这种语言与任何大型程序一起使用,那么实现/集成链接器所花费的时间可能被认为是不值得的。)
答案 1 :(得分:2)
从根本上说,如果您的可执行代码是由不相交的目标文件(或等效文件)构建的,那么必须始终有某些在需要运行时将它们拉到一起。
答案 2 :(得分:2)
从历史上看,有些编译语言没有使用任何类型的链接。也许最着名的是Turbo Pascal,它在最早的版本(4.0之前)中通过源文件(或源文件,如果使用{$I filename}
指令)进行单次传递,直接生成输出代码,并构建一个修复列表(我认为在其他编译完成后,修补程序已应用于写入的目标文件,因为即使使用软盘驱动器作为目标,编译器也能运行得很好。)
答案 3 :(得分:2)
不,有许多编译语言不使用链接器。例如Forth,Lisp以及Java在某种程度上不需要它。
同样的工作(让不同的编译单位了解彼此)仍然需要完成,但这可以通过其他方式完成,而不是通过链接步骤。例如,查找可以在运行时完成。
答案 4 :(得分:0)
定义“链接器”的含义。任何时候都有单独的编译,必须有一个步骤,无论编译输出如何“链接”。如果你考虑“链接”只是在其他编译的目标代码中填写地址,然而(传统的链接器做什么),那么许多更现代的系统不会“链接”。编译器的输出将是一些中间格式,最后一步将在从中生成机器代码之前将它们组合到一个实体中。
当然,所有这些都忽略了动态链接和及时编译的问题,这进一步影响了问题。
所有你可以说的是,对于一个足够模糊的链接定义,所有带有单独编译的语言都支持它,而对于一个足够严格的版本,很多现代编译器都没有“链接”任何语言。 / p>