gpt4 book ai didi

common-lisp - 如何从 Common Lisp 调用 Go 程序

转载 作者:行者123 更新时间:2023-12-02 08:28:01 25 4
gpt4 key购买 nike

我有一个 Go 程序,出于效率原因,它不能用 Common Lisp 重写。如何通过 Common Lisp 运行它?

到目前为止的选项:

1。 CFFI

在我看来,使用外部函数接口(interface)是执行此操作的“正确”方法。然而,我所做的研究却直接走向了死胡同。如果这是赢家,有哪些资源可以了解如何与 Go 交互?

2。 socket

让 Go 程序在监听端口的同时一直运行是可行的。如果这是最好的方法,我会继续努力让它发挥作用。

3。执行系统命令

这似乎是各种错误。

4。未知

或者有什么我还没想到的绝妙方法?

最佳答案

这取决于你想做什么,但 1-3 都是可行的选择

1。 CFFI

要使其正常工作,您需要在 go 和 lisp 端使用 FFI。您需要将 Go 中的适当函数作为 C 函数进行外部调用,然后使用 lisp 中的 cffi 调用它们。参见 https://golang.org/cmd/cgo/#hdr-C_references_to_Go关于如何在 go 中使用 extern 函数。在这种情况下,您将创建一个可动态链接的库(dll 或 so 文件)而不是可执行文件。

2。套接字(IPC)

第二种选择是将你的 go 程序作为守护进程运行,并使用某种形式的 IPC(例如套接字)在 lisp 和 go 之间进行通信。如果你的程序长时间运行,或者如果有一个服务器和一个或多个客户端(服务器可以很容易地是 lisp 代码和 go 代码),这很有效。尤其是套接字也更灵活,您可以用其他语言编写组件或更改一个组件的语言,而无需更改其他组件,只要您保持相同的协议(protocol)即可。此外,您可能会在单独的硬件上运行这些组件。但是,使用套接字可能会损害性能。还有其他可用的 IPC 方法,例如 FIFO 文件(命名管道)、SHM 和消息队列,但它们比套接字更依赖于系统。

3。系统命令(子进程)

第三种方式是启动一个子进程。这是一个可行的选择,但它有一些警告。首先,启动子进程的行为取决于 lisp 实现和操作系统。 UIOP 消除了许多实现差异的细节,但有些细节太大而无法克服。特别是,根据实现,您可能会或可能不会并行运行子流程。否则,每次要与 go 通信时都必须运行一个单独的命令,这意味着每次需要时都要等待进程启动。您也可能会或可能不会在启动子流程后将输入发送到它。

另一种选择是运行一个命令来启动一个 go 进程,然后使用套接字或其他 IPC 与其通信,然后运行一个命令来停止进程,然后关闭 lisp 程序。

就我个人而言,我认为使用套接字是最有吸引力的选择,但根据您的需要,其他选项中的一个可能更适合。

关于common-lisp - 如何从 Common Lisp 调用 Go 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30227651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com