语言“绑定”如何与现有库进行通信?

Posted

技术标签:

【中文标题】语言“绑定”如何与现有库进行通信?【英文标题】:How does a language "binding" communicate with the existing library? 【发布时间】:2015-11-17 06:50:51 【问题描述】:

我试图了解绑定(端口)到另一种语言的一般工作原理,但为了帮助澄清我的问题,我将使用名为 libsass 的项目的直接示例(Sass 编译器的 AC/C++ 实现)。 还有一个项目node-sass 这是 Node.js 与 libsass 的绑定。

我假设这意味着node-sass 是一个在nodejs 上运行的javascript 程序,nodejs 充当libsass C++ 系统级程序的代理转发指令。

我的问题是:nodejs 解释器如何与 libsass C++ 应用程序“对话”? - 它使用套接字吗?

子问题:如果node-sass 通过初始化可用于您自己的节点脚本的对象、函数等在节点环境中公开 API - 根据定义,这是“绑定”吗?

【问题讨论】:

一个“程序”将作为它自己的进程运行;一个库通常被加载到同一个进程中。 啊,我看到这个特定的项目是一个库 - 但通常我会认为通常被移植到的程序 - 一个程序或服务本身吗? 这个问题几乎没有 C++。 “C/C++”是两种语言。当然,C++ 具有与 C 的语言绑定,但正如这个问题所示,Node.js 也是如此。而且我们也不去谈论“C/Node.js”。 【参考方案1】:

C++ 库部分是,考虑到它实际上是一个库而不是某个服务器程序,它不会自行运行,也不会监听某个套接字。如果在 C++ 程序中使用了 C++ 库,它也会集成在该程序进程中,并且不会在其他地方运行。

许多语言都内置了访问本地 C 语言 API 的可能性,包括 Node.js(C 是语言互操作性的事实标准,例如,因为每个有些重要的操作系统也主要由 C 组成。)。关于 C++ 与 C,用 C++ 编写一些东西并提供 C 接口并不难。

在这种情况下,语言绑定通常只是将复杂的本机访问部分包装在更易于在目标语言中使用的东西中。

由于评论而进一步详细说明:

操作系统本身有函数(在 C 程序中使用)来动态加载 C 库,获取它们的特定函数并调用它们,而不需要在编译 C 程序时知道 lib 和函数的名称(例如.你可以制作一个C程序,要求用户输入一个lib名称,然后使用它......)。

与此无关,每种语言要么以将程序编译为包含 CPU 指令等的“真实”程序的方式制作,这些程序可以直接执行(例如:C),要么制作该语言的程序是其他格式,但是每次启动都需要一个“真正的”程序来帮助 OS/CPU 了解应该做什么(例如:Javascript、Java ......如果没有安装帮助软件,您将无法单独运行程序,如浏览器或 JRE)。

对于第二种类型,辅助软件可以利用操作系统的库加载功能,如果 JS/Java 程序包含这样做的指令......(对于第一种“真实”类型,一定与 C 库的兼容性级别是自动给出的,因为它们使用相同的二进制格式(是的,这是简化的))

【讨论】:

啊,好的,谢谢,所以基于 C/C++ 的操作系统提供了一种更高级别的环境,其中 C/C++ 程序能够使用本机调用进行交互?这是否也意味着套接字更适合不共享相同底层语言的程序和运行服务,例如如果 Java 应用程序需要与基于 C 的程序通信? @user4668401 查看编辑后的答案。不,您也不需要 Java 中的套接字; Java 也有本地访问的可能性。

以上是关于语言“绑定”如何与现有库进行通信?的主要内容,如果未能解决你的问题,请参考以下文章

adnroid四大组件之Service 绑定服务,数据通信-IBinder

如何在数据库绑定的应用程序之间进行有效的通信?

存储库只与数据层通信?

12.网络通信

无法使用数据绑定Android与ViewModel中的XML通信

示例:使用消息传递在 Activity 和 Service 之间进行通信