如何用另一种语言调用用一种语言编写的代码

Hoo*_*ing 7 c++ scheme interpreter programming-languages compilation

这是一个我一直想知道答案的问题,但从未真正问过.

一种语言编写的代码,特别是解释语言,如何被编译语言编写的代码调用.

例如,假设我正在用C++编写游戏,并且我将一些AI行为外包给要用Scheme编写.如何用Scheme编写的代码到达编译的C++代码可用的点?它是如何被C++源代码使用的,它是如何被C++编译的代码使用的?它的使用方式有所不同吗?

有关

多语言如何在一个项目中进行交互?

Eur*_*lli 13

对于无处不在的问题,没有一个单一的答案.一般来说,答案是两种语言必须就"某事" - 一组或规则或"呼叫协议"达成一致.

在高级别,任何协议都需要指定三件事:

  • "发现":如何找到彼此.
  • "链接":如何建立连接(在他们彼此了解之后).
  • "调用":如何实际向对方发出请求.

细节在很大程度上取决于协议本身.

有时两种语言合谋共同努力.有时两种语言同意支持一些外部定义的协议.目前,操作系统或"运行时环境"(.NET和Java)也经常被涉及.有时这种能力只有一种方式("A"可以称为"B",但"B"不能称为"A").

请注意,这与任何语言在与OS通信时面临的问题相同.你知道,Linux内核不是用Scheme编写的!

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

  • C与C++:C++使用"C协议"的扭曲("受损")变体.C++可以调用C,而C可以​​调用C++(虽然名称有时可能非常混乱,可能需要外部帮助来翻译名称).这不仅仅是Windows; 在支持两者的所有平台上通常都是如此.最流行的操作系统也使用"C协议".

  • VB6与大多数语言相比:VB6的首选方法是"COM协议".其他语言必须能够编写可从VB6使用的COM对象.VB6也可以生成COM对象(尽管不是每个可能的COM对象变体).

    VB6也可以说"C协议"的非常有限的变体,然后只在外面进行调用:它不能创建可以通过"C协议"直接对话的对象.

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

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

还有一点需要注意:SOAP"Web Services"实际上也是一种"调用协议",就像许多其他基于Web的协议一样受欢迎.毕竟,这都是关于用不同语言编写的代码(并在另一个框中运行!)