美文网首页
Go编写Ruby扩展

Go编写Ruby扩展

作者: falm | 来源:发表于2016-04-24 14:53 被阅读275次

本文将会介绍,使用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编写扩展的话,还是需要根据应用的场景来判断是否适合。

相关文章

  • Go编写Ruby扩展

    本文将会介绍,使用Go语言编写 Ruby的扩展程序 Ruby-FFI Ruby-FFI 是一个以编程的方式加载动态...

  • 【转】BurpSuite插件配置

    Burp插件的使用 使用准备 Burpsuite可以使用三种语言编写的扩展插件,Java、Python和Ruby。...

  • Heka

    Heka 日志收集服务 流式 Mozilla出品 Golang编写 轻量却功能强大 灵活易用 Go/Lua扩展 H...

  • 笔记框架

    Jekyll ruby hexo node hugo go

  • iOS 工程自动化 - Ruby 入门到辅助脚本编写

    iOS 工程自动化 - Ruby 入门到辅助脚本编写 iOS 工程自动化 - Ruby 入门到辅助脚本编写

  • Ruby中的Module

    Ruby中没有Java语言中的interface,Ruby只支持单继承。Ruby通过Mix-in提供对类的扩展,其...

  • [Ruby]语法

    所有的 Ruby 文件扩展名都是.rb 运行文件 $ rubytest.rb Ruby 程序中的空白 在 Ruby...

  • 使用Hugo + GitHub Pages搭建个人博客

    Hugo是静态网站生成器,使用go语言编写,与同类产品Hexo相比,具有简单、易用,高效,易扩展、快速部署等特点。...

  • Metasploit EXP开发

    EXP开发》》Metasploit 》》》 编写MSF Ax步骤 MSF 使用Ruby编写 我们以编写好的exp作...

  • iOS fastlane自动化打包集成流程及使用方法

    1、ruby 因为Fastlane是ruby编写的,所以我们首先保证电脑的ruby环境有正确安装,打开终端,输入如...

网友评论

      本文标题:Go编写Ruby扩展

      本文链接:https://www.haomeiwen.com/subject/zpdfrttx.html