我试图理解一个绑定(端口)到另一种语言是如何工作的,但是为了帮助澄清我的问题,我将使用一个名为libsass的项目的直接示例(Sass编译器的AC / C ++实现) )。
还有另一个项目node-sass
这是Node.js绑定到libsass。
我假设这意味着node-sass
是一个在nodejs上运行的javascript程序,而nodejs则作为libsass
C ++系统级程序的代理转发指令。
我的问题是:nodejs如何解释" talk"到libsass C ++应用程序? - 它是否使用套接字?
子问题:如果node-sass
通过初始化您自己的节点脚本可用的对象,函数等在节点环境中公开API,那么这就是定义 - "绑定&#34 ;? 子>
答案 0 :(得分:3)
C ++库部分是,它实际上是一个库而不是某个服务器程序,不是自己运行而不是监听某个套接字。如果在C ++程序中使用C ++ lib,它也会集成在此程序进程中,而不会在其他地方运行。
许多语言都有内置的可能性来访问本机C语言API,包括Node.js(C是语言互操作性的事实标准,例如,因为每个有些重要的操作系统也主要由C组成。) 。关于C ++ vs C,用C ++编写内容并提供C接口也不难。
在这种情况下,语言绑定通常只是将复杂的本机访问部分包装在目标语言中更容易使用的东西中。
由于评论而进一步阐述:
操作系统本身具有(在C程序中使用)函数来动态加载C库,获取它们的特定功能并调用它们,而在编译C程序时不知道lib和函数的名称(例如你可以创建一个C程序,要求用户输入一个lib名称然后使用...)。
独立于此,每种语言都是以程序编译为包含CPU指令等的“真实”程序的方式制作的,这些程序可以直接执行(例如:C),或者编写语言程序是一些其他格式,但每次启动都需要一个“真正的”程序,以帮助操作系统/ CPU了解应该做什么(例如:Javascript,Java ....如果没有安装帮助软件,您无法单独运行程序,像浏览器或JRE)。
对于第二种类型,辅助软件可以使用操作系统的lib加载功能,如果JS / Java程序包含这样做的指令......(对于第一种“真实”类型,某些与C libs的兼容程度是自动给出的,因为它们使用相同的二进制格式(是的,这简化了))