我想找到一种编写可以通过语言绑定(或其他框架)从任何其他编程语言访问的API的方法。是否有可能做到这一点?如果是这样,哪种编程语言最适合编写“跨语言” API?我的目标是创建可以从正在使用的任何编程语言中访问的一组函数,这样就无需手动以每种语言重新编写整个API。
我想找到一种编写可以通过语言绑定(或其他框架)从任何其他编程语言访问的API的方法。是否有可能做到这一点?如果是这样,哪种编程语言最适合编写“跨语言” API?我的目标是创建可以从正在使用的任何编程语言中访问的一组函数,这样就无需手动以每种语言重新编写整个API。
Answers:
我认为C或C ++最适合您的目的。您可以使用SWIG(简化包装程序和接口生成器)从C或C ++ API生成语言绑定。
SWIG是一种软件开发工具,可将用C和C ++编写的程序与各种高级编程语言相连接。SWIG与不同类型的目标语言一起使用,包括诸如Perl,PHP,Python,Tcl和Ruby之类的通用脚本语言。支持的语言列表还包括非脚本语言,例如C#,Common Lisp(CLISP,Allegro CL,CFFI,UFFI),D,Go语言,Java(包括Android),Lua,Modula-3,OCAML,Octave和R。还有几种解释和编译的Scheme支持的实现(Guile,MzScheme / Racket,Chicken)。SWIG最常用于创建高级解释或编译的编程环境,用户界面,以及作为测试和原型C / C ++软件的工具。SWIG通常用于解析C / C ++接口并生成上述目标语言调用C / C ++代码所需的“胶水代码”。SWIG还可以XML和Lisp s表达式的形式导出其解析树。SWIG是免费软件,SWIG生成的代码与商业和非商业项目兼容...
extern "C"
因此在外部与C兼容。因此,您确实具有C ++的内部优势(较高的类型安全性,库),但是具有C的优势(事实上的ABI标准)
几乎有2种方法:
进行此更改所需的工作取决于所使用的系统,例如,套接字接口可以工作,但是与http库相比,客户端库往往更底层。
您可以尝试找到一个支持所有要使用的语言的网络库,并根据该库实现API-例如,使用ZeroMQ可为您提供很大的灵活性,因此您可以使用ZeroMQ接口编写API,并且那么任何想要调用您的API的语言都必须使用ZeroMQ客户端库来执行此操作。选择一个支持多种语言的库,并允许您进行进程内和进程外通信以实现最佳性能。
如果性能和呼叫延迟不是问题,请考虑提供一个全面的命令行界面(可能在其顶部使用脚本语言)。ImageMagick可能是此类“ API”的一个很好的例子。另一个很好的例子是Tk工具箱。
whoami
在Ubuntu上获取用户名),还是有其他想法?
API到底是什么意思?
在许多平台上,您都可以链接到DLL或类似的结构,但是是否需要为特定的本机目标(Intel / ARM)或字节序重新编译?由于数据类型问题或构造(指针试图返回不支持它们的语言),特定的二进制接口对于某些语言可能仍然会遇到困难,因此您还必须考虑API本身的设计,以免排除某些语言或从这些语言中繁琐地使用它。
诸如C之类的可移植性以及基于DLL中二进制端点的接口可能很好,并且通常可以在大多数平台和大多数语言上调用,但是可能需要以不同的方式进行编译和/或以不同的方式提供或链接到不同的静态库。
在我看来,在您提供有关API公开的平台/服务的更多信息之前,选择编写库或服务的语言或按照定义定义的语言并不是问题的本质。如果您可以假定网络堆栈可用并且不要求直接链接的函数调用级别的性能,则该API可以轻松地基于HTTP并使用某种客户端语言的填充程序,以使请求透明。
我认为通常来说,这个问题过于笼统,无法在现实世界中使用,因为鉴于所提供的服务类型,您没有给出关于哪种API可能适用的指示。
要添加到以上建议使用RPC机制的答案中。您可以使用Apache Thrift。(http://thrift.apache.org/)。它基本上是一个RPC框架。
根据Thrift Wiki:
用于可扩展的跨语言服务开发的Apache Thrift软件框架将软件堆栈与代码生成引擎结合在一起,以构建可在C ++,Java,Python,PHP,Ruby,Erlang,Perl,Haskell,C#,可可,JavaScript,Node.js,Smalltalk,OCaml和Delphi等语言
用任何语言写出一个文本文件,该函数具有调用要传递的参数的功能。让您的“我与任何人”应用程序监视目录,一旦看到process-call.txt,它就会开始工作。没有服务器或网络协议;甚至非计算机语言方法也可以初始化功能。甚至一个人也可以创建文本文件。
内容可能如下所示:
Call-method: fdisk()
Params: (string) "/root", (string) "write-back-file-expected.txt"
;)您可能会永远等待获得答案。您只需要向其他进程发送一些字节,但是我敢肯定这不是整个规范。
OpenGL是描述内容的一个很好的例子-它是用C编写的API,其设计方式易于编写其他语言的绑定
可以从大多数编程语言(通常是编译后的扩展或PyPy ctypes
库等之类)中调用C库。
所有函数都将简单数据类型作为参数(布尔值,整数,浮点数,常量,数组),因为带有指针的函数可能难以翻译成某些语言
int
float
方面可能有所不同)如果仅针对C用户,则生成的API不一定是您可以编写的使用最好的C API。但是,这意味着这些功能几乎可以直接暴露给另一种语言(例如,PyOpenGL文档列出了差异,其中大多数差异很小)
在这个冗长的API之上,您可以围绕此(游戏框架等)编写更多的“对开发者友好”的包装器