c++ - 用一种语言编写的代码如何被另一种语言调用

标签 c++ programming-languages scheme compilation interpreter

这是一个我一直想知道答案却从未真正问过的问题。

由一种语言(尤其是解释型语言)编写的代码如何被编译语言编写的代码调用。

例如,假设我正在用 C++ 编写一个游戏,并且我将一些 AI 行为外包给用 Scheme 编写。用 Scheme 编写的代码如何达到编译后的 C++ 代码可用的程度? C++源代码如何使用它,C++编译代码如何使用它?使用方法有区别吗?

相关

How do multiple-languages interact in one project?

最佳答案

这个问题没有一个适用于任何地方的单一答案。一般来说,答案是两种语言必须就“某事”达成一致——一组或规则或“调用协议(protocol)”。

在高层次上,任何协议(protocol)都需要指定三件事:

  • “发现”:如何找到彼此。
  • “链接”:如何建立联系(在他们相互了解之后)。
  • “调用”:如何实际向对方发出请求。

细节在很大程度上取决于协议(protocol)本身。

有时这两种语言会协同工作。有时两种语言同意支持一些外部定义的协议(protocol)。如今,通常还涉及操作系统或“运行时环境”(.NET 和 Java)。有时能力只有一种方式(“A”可以调用“B”,但“B”不能调用“A”)。

请注意,这与任何语言在与操作系统通信时都面临的问题相同。 Linux 内核不是用 Scheme 写的,你知道的!

让我们看看来自 Windows 世界的一些典型答案:

  • C 与 C++:C++ 使用“C 协议(protocol)”的扭曲(“损坏”)变体。 C++ 可以调用 C,C 可以调用 C++(尽管名称有时会很乱,可能需要外部帮助来翻译名称)。这不仅仅是 Windows;在所有支持这两种平台的平台上通常都是如此。最流行的操作系统也使用“C 协议(protocol)”。

  • VB6 与大多数语言:VB6 的首选方法是“COM 协议(protocol)”。其他语言必须能够编写 COM 对象才能在 VB6 中使用。 VB6 也可以生成 COM 对象(尽管不是所有可能的 COM 对象变体)。

    VB6 还可以与“C 协议(protocol)”进行非常有限的变体对话,然后只能在外部进行调用:它无法创建可以通过“C 协议(protocol)”直接对话的对象。

  • .NET 语言:所有 .NET 语言都编译为相同的低级语言 (IL)。运行时管理通信,从这个角度来看,它们看起来都像是同一种语言。

  • VBScript 与其他语言:VBScript 只能讨论 COM 协议(protocol)的一个子集。

还有一点要注意:SOAP“Web 服务”实际上也是一种“调用协议(protocol)”,就像许多其他正在流行的基于 Web 的协议(protocol)一样。毕竟,这一切都是关于与用不同语言编写的代码对话(并在不同的盒子中运行!)

关于c++ - 用一种语言编写的代码如何被另一种语言调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/840888/

相关文章:

c++ - 如何将指针作为另一个方法参数传递给方法

programming-languages - 有哪些配置语言的例子?

variables - 计划和设置!

c++ - char* 和 new 的一些错误

c++ - 类局部变量的指针?

c++ - 如何在特定位置设置QListWidget

scheme - 方案/ Racket 中letrec的含义

language-agnostic - 创建一种基本的编程语言 - 资源?

programming-languages - 专门为使静态验证更容易而设计的语言

list - 避免使用集合!进入函数式编程风格算法