有没有对如何编写围棋的Ruby扩展一些教程或实践经验?
Answer 1:
去1.5用于构建是由C来调用(并因此从红宝石经由FFI)共享库加到支持。 这使得比在预1.5释放过程变得更容易(当有必要写与c胶水层)和Go运行时是现在可用的,在现实生活中制作这实际上有用(够程和存储器分配是不可能的前,如他们需要的Go运行,这是不可用的,如果离开是不是主入口点)。
goFuncs.go:
package main
import "C"
//export GoAdd
func GoAdd(a, b C.int) C.int {
return a + b
}
func main() {} // Required but ignored
需要注意的是//export GoAdd
评论需要每个导出功能; 之后的符号export
的功能是如何被导出。
goFromRuby.rb:
require 'ffi'
module GoFuncs
extend FFI::Library
ffi_lib './goFuncs.so'
attach_function :GoAdd, [:int, :int], :int
end
puts GoFuncs.GoAdd(41, 1)
该库建有:
go build -buildmode=c-shared -o goFuncs.so goFuncs.go
运行Ruby脚本产生:
42
Answer 2:
通常我会试着给你一个直接的答案,但评论到目前为止表明有可能不是一个。 所以,我希望这回答了通用的解决方案和其他一些可能会被接受。
一个通用的解决方案:编译高级语言程序转换成从C.总结,对Ruby库调用。 一个人必须非常小心,在这一点上的整合。 这一招是一个不错的杂牌在过去,许多语言集成通常遗留原因。 事情是,我不是去开发,我不知道,你可以编译进入东西从C调用前进。
创建两个独立的程序:Ruby和围棋程序。 在节目中,使用数据传递来回一个非常有效的方式。 扩展将简单地建立与围棋程序的连接,发送数据,等待结果,并将结果传递回红宝石。 所述通信信道可能是OS IPC,插座等无论每个载体。 如果没有安全问题,你使用预定义的消息格式的数据格式可以是非常简单的。 这进一步提升速度。 我的一些旧程序使用XDR的二进制格式。 这些天来,人们似乎要用的东西像JSON,协议缓冲器和ZeroMQ风格线协议。
第二个建议的变化:使用ZeroMQ! 或类似的东西。 ZeroMQ是快速,健壮并且具有两种语言绑定。 它管理整个前款你。 缺点是,它不太灵活WRT性能优化,具有额外的东西你不需要。
使用两个过程和它们之间传递数据的最棘手的部分是一个速度损失。 开销可能没有理由离开红宝石。 然而,围棋具有巨大的天然性能和并发性功能,可能会辩解编码它与脚本语言如Ruby应用程序的一部分。 (也许你理你的问题之一。)所以,尝试每一种策略。 如果你得到一个工作程序,也更快,使用它。 否则,坚持使用红宝石。
也许不太有吸引力的选择:用比去其他的东西,也有类似的优势,允许从调用C,并且可以集成。 Althought它不是很受欢迎,阿达是一种可能性。 它长期以来一直强于本地代码,(受限制)的并发性,可靠性,低级别的支持,跨语言的发展和IDE(GNAT)。 此外,朱丽亚是高性能的技术和并行编程新语言,可以被编译成可调用的库从C.它有一个JIT了。 也许从红宝石变化问题陈述+转到红宝石+(更适合的语言)会解决这个问题?
Answer 3:
作为围棋1.5的,有一个新的构建模式,它告诉编译器去输出共享库和C头文件:
-buildmode c-shared
(这是更详细的这个有用的教程解释说: http://blog.ralch.com/tutorial/golang-sharing-libraries/ )
随着新的构建模式,你再也不用写一个C胶层自己(如先前在较早响应的建议)。 一旦你的共享库和头文件,你可以继续使用FFI来电来访转到创建的共享库(例如: https://www.amberbit.com/blog/2014/6/12/calling- C-CPP-从旁注/ )