【发布时间】:2013-12-03 13:32:08
【问题描述】:
我有两个代码库:一个用 C++ 编写,另一个用 Common Lisp 编写。 Lisp 代码库中实现了一个特定的功能,我想从我的 C++ 代码中访问它。我搜索了 Foreign Function Interfaces 以从 C++ 调用 Lisp 函数,但似乎找不到任何东西(我发现 FFI 主要用于另一个方向)。所以我决定实现某种形式的 RPC 来满足我的要求,它们是:
两个代码都将在同一台机器上运行,因此远程机器调用的可扩展性并不重要。
来自 C++ 的输入将是一个 Lisp 样式的列表,这是来自 Lisp 代码的函数将作为输入的内容。
每次执行代码都会进行 1000 次调用,因此每次远程调用的性能至关重要。
到目前为止,我从网络上的各种资源中了解到可能的解决方案是:
Sockets - 设置一个 Lisp 代码实例,该实例将侦听来自 C++ 代码的函数调用,在给定的输入上运行函数,并将结果返回给 C++ 代码.
XML-RPC - 在 Lisp 端设置 XML-RPC 服务器(这很容易,因为我使用 Allegro Common Lisp,它提供了支持 XML-RPC 的 API)然后使用 C++ 的众多 XML-RPC 库之一进行客户端调用。
我认为这些方法的优缺点如下:
套接字是一个低级结构,所以看起来我需要自己完成大部分连接管理、读取和解析套接字上的数据等工作。
XML-RPC 似乎更适合我的需求,但我读到它总是使用 HTTP,并且无法使用 UNIX 域套接字。所以,感觉 XML-RPC 对于我的想法来说可能有点过头了。
有没有人在实现一些类似的代码集成方面有任何经验?本地 RPC 的套接字和 XML-RPC 之间的性能是否存在显着差异?任何关于哪种方法可能更好的建议都会非常有帮助。此外,也将不胜感激有关执行此操作的不同技术的建议。
编辑:以下是有关共享功能的更多详细信息。 Lisp 代码中有一个函数 f 可用(它足够复杂,使得在 C++ 中重新实现的成本高得令人望而却步)。它将两个列表 L1 和 L2 作为输入。我对这种情况的设想如下:
- L1 和 L2 用 C++ 构建并发送到 Lisp 端并等待结果,
- 在 Lisp 端的输入 L1 和 L2 上调用 f 并将结果返回给 C++ 端,
- C++ 端接收结果并继续计算。
L1 和 L2 的尺寸通常不大:
L1 是一个列表,通常包含 100 个元素,每个元素是一个最多包含 3-4 个原子的列表。
L2 也是一个包含
所以每个 RPC 的总数据量可能是一个 100s/1000s 字节的字符串。这个调用是在我的 C++ 代码中的每个 while 循环开始时进行的,因此很难给出每秒调用次数的具体数字。但从我的实验来看,我可以说它通常每秒完成 10 到 100 次。 f 不是数值计算:它的符号。如果您熟悉 AI,它本质上是在一阶逻辑中进行符号统一。所以它没有副作用。
【问题讨论】:
-
你应该多解释一下共享功能......
-
即使进行了编辑,您对共享功能的解释也不够充分。它的真正作用是什么(简而言之);实际的数据类型是什么(远程传递的参数,接收的结果)......你多久调用一次......?它是幂等的吗...?如果类型是列表,它们的元素的类型是什么?
-
您可以查看cl-cxx
标签: c++ sockets common-lisp rpc xml-rpc