Go编写Ruby扩展

本文将会介绍,使用Go语言编写 Ruby的扩展程序

Ruby-FFI

Ruby-FFI 是一个以编程的方式加载动态扩展库,绑定函数,并且能够在ruby中直接执行的 ruby 扩展包,使用FFI 提供的DSL语法,可以很灵活,优雅的调用C扩展程序。

Cgo

简单的说cgo就是通过加载C库 **import "C" ** ,然后可以在编译的时候,将文件注释中的C代码编译连接到当前的go程序中,这样就可以实现了 C程序和Go的相互调用。

实例

安装go

➜  $ brew install go
==> Downloading https://homebrew.bintray.com/bottles/go-1.5.3.el_capitan.bottle.tar.gz
######################################################################## 100.0%
==> Pouring go-1.5.3.el_capitan.bottle.tar.gz
==> Caveats
As of go 1.2, a valid GOPATH is required to use the `go get` command:
  https://golang.org/doc/code.html#GOPATH

You may wish to add the GOROOT-based install location to your PATH:
  export PATH=$PATH:/usr/local/opt/go/libexec/bin
==> Summary
🍺  /usr/local/Cellar/go/1.5.3: 5,336 files, 259.6M

安装 ffi

➜ $ gem install ffi
Building native extensions.  This could take a while...
Successfully installed ffi-1.9.10
Parsing documentation for ffi-1.9.10
Done installing documentation for ffi after 0 seconds
1 gem installed

go函数

** sum.go **

package main
import "C"
//export sum
func sum(x, y int) int {
  return x + y
}

func main(){}

这里使用在cgo中作为函数输出的注释标记 //export 标识出这个文件输出的函数

编译go程序

go build -buildmode=c-shared -o sum.so sum.go

在Ruby中调用Go函数

** sum.rb **

require 'ffi'
module Maths
  extend FFI::Library
  ffi_lib './sum.so'
  attach_function :sum, [:int, :int], :int
end
puts Maths.sum(ARGV[0].to_i, ARGV[1].to_i)
# ruby sum.rb 23 60
# => 83

总结

使用Go编写ruby扩展,相对于使用更底层的C语言编写扩展来说,更容易和更有趣一些。在本文实例中只是简单介绍了如何在ruby中使用Go扩展,但在具体的场景中这种方式还会遇到一些问题,比如,不是所有的Go程序都可以编译成C扩展,goroutine的并发特性不能应用到Ruby中,Go语言和C程序的交互还是有一些性能问题等,所以如果是要在生产环境使用Go编写扩展的话,还是需要根据应用的场景来判断是否适合。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,456评论 19 139
  • 原文 http://tonybai.com/2012/09/26/interoperability-between...
    ppice阅读 3,089评论 2 13
  • 一、异同对比选择1、Python和ruby的相同点: * 都强调语法简单,都具有更一般的表达方式。python是缩...
    沃伦盖茨阅读 4,295评论 2 24
  • TITLE: 编程语言乱炖 码农最大的烦恼——编程语言太多。不是我不学习,这世界变化快! 有时候还是蛮怀念十几、二...
    码园老农阅读 5,579评论 2 35
  • 看着你的眼 是一轮明月 把星光搁浅 让我忘记了时间 看着你的眼 如同时光的第一次初见 忘记了这一生的流年 总想记住...
    时光以北暮城南阅读 319评论 0 0

友情链接更多精彩内容