Programming languages 如何组合不同的编程语言

Programming languages 如何组合不同的编程语言,programming-languages,linker,compilation,Programming Languages,Linker,Compilation,我不是问什么时候链接不同的编程语言 这是一个相当普遍的问题,但我个人在Linux上工作 我想了解的是不同编程语言的使用过程 结合起来,我发现了一篇关于结合C/C++/Fortran的好文章: 据我所知,大多数编译器执行两个阶段: 将语言文件转换为包含机器代码但仍然存在的目标文件 包含一些符号(可能是函数名?) 将对象文件链接在一起,只有在这个阶段,链接器才会检查 在对象中,文件是可调用的 我认为将不同的语言结合起来的问题是名称混乱,这意味着 函数的名称在转换为目标代码时发生更改 问题是: 难道

我不是问什么时候链接不同的编程语言

这是一个相当普遍的问题,但我个人在Linux上工作

我想了解的是不同编程语言的使用过程 结合起来,我发现了一篇关于结合C/C++/Fortran的好文章:

据我所知,大多数编译器执行两个阶段:

  • 将语言文件转换为包含机器代码但仍然存在的目标文件 包含一些符号(可能是函数名?)

  • 将对象文件链接在一起,只有在这个阶段,链接器才会检查 在对象中,文件是可调用的

  • 我认为将不同的语言结合起来的问题是名称混乱,这意味着 函数的名称在转换为目标代码时发生更改

    问题是:

  • 难道你不能事先发现被破坏的函数名,然后用编程语言显式地指定它们吗?或者更好,难道没有一个软件已经这样做了吗

  • 我不完全理解动态库是如何链接的,但可以使用不同的语言 通过程序与动态库交互的相同方法进行交互


  • p、 s主要目的是调用用另一种语言编写的函数。

    标准是在组合不同语言的程序时使用无损坏的名称。C++中的特定符号可以通过使用<代码>外部“C”< /代码>声明它们来关闭名称。C不会损坏名称。

    所有库可执行文件都包含某种类型的接口。如果他们不这样做,任何软件都无法与他们一起工作。内部方法更有可能被更改为更有效的方法。此外,许多语言允许您在编译器级别关闭“损坏”


    链接,作为一个简单的解释(我可能会为此而被丁克?),是打包到一个文件中。至少从外部编程的角度来看,这些类保留与非链接库相同的接口。

    不同的语言肯定可以使用相同的库。例如,在旧的Windows Visual Basic上,动态加载Windows API函数非常常见

    语言间链接只需就函数的调用约定达成一致,并了解函数名。前者必须通过查阅文件来完成;后者必须在创建对象或库的编译器中查找。例如,<代码> GCC < /C>将编译C++而不必用名字来命名,因此可以直接引用C源中的函数名,而<>代码> G++/COD>将编译带有被损坏名称的C++代码,并且最好通过<代码>外部“C”< /C>声明>来公开C函数。
    基本上,只要对象或库只公开C ABI,就应该广泛支持绑定到其他语言。例如,如果您想使用本地C++库,则更困难,因为在这种情况下,外语必须实现正确的C++ ABI。例如,从Fortran导出代码也类似,但我相信可以让人只使用C ABI。

    将不同的对象文件链接在一起的问题通常归结为子程序调用约定。基本上,当您调用位于另一个对象文件中的例程时,编译器必须知道另一个对象文件将在内部为其例程命名什么,如何传递其所有参数,以及例程需要什么(如果有)设置和清理代码。所有这些东西通常都归在s的标题下

    每个编译器都有自己喜欢用于子例程的调用约定。注意我说的是“编译器”,不是语言。Linux中的C调用约定不同于Windows中的C调用约定

    因此,当您混合语言时,您需要某种方法告诉编译器调用或被调用的子例程使用另一种语言的调用约定。C的约定是一种常用的“通用语言”,因为几乎每个平台都有一个C编译器。然而,一些平台(例如:Windows)有多种流行的调用约定

    现在我们问你在评论中提出的问题:

    “告诉编译器使用另一种语言的调用约定”有一种常见的方法吗

    答案是,“不,不是真的”。有些语言确实定义了使用其他语言的特定调用约定的方法。例如,C++允许你在声明中放置<代码>外部“C”/Cuff>,告诉编译器所使用的声明使用C调用约定。Ada通过
    pragma约定(X,…)
    实现了同样的功能,其中X是约定名称
    C
    Fortran
    Cobol
    由该语言定义,但其他支持的内容(例如:Windows'
    Stdcall
    )由实现定义


    但是,如果有一对语言的编译器编写者从未考虑过彼此,那么您别无选择,只能告诉它们使用它们都知道的第三种约定(通常是C)。例如,为了得到标准的C++和艾达的互操作,你可以让服务器代码使用C约定导出它的例程,并告诉客户端代码它调用的例程是使用C约定的。

    我不太理解最后一部分,你所说的“你的对象或库只暴露C abi”是什么意思,你的库可以使用各种不同的内部事物(比如C++的东西),你不能轻易地从外部理解,但是只要你想让其他人看到的函数遵循C abi,其他程序就可以动态地链接它们。我怎么知道我使用的编译器/语言是否与C abi兼容,有办法知道吗