阅读更多

9顶
1踩

编程语言

原创新闻 Ruby FFI - Ruby调用C库最棒的工具

2008-11-02 00:40 by 见习编辑 robbin 评论(6) 有15495人浏览
Ruby解析器的性能一向被人垢病,很多性能敏感的程序,都必须用C语言来编写,然后使用Ruby去调用C库。但糟糕的是,Ruby调用C库并不是一件轻松的活,需要你对Ruby的内部数据结构有比较深入的了解,甚至需要你仔细阅读Ruby相关的源代码,然后用C语言编程作为黏合剂,用Ruby特有的C API去给外部的C库增加一层封装。

以上的过程,相当于你要打开Ruby解析器的内部进行API调用了,对程序员的要求很高。而且一旦Ruby内部的数据结构随着版本升级发生变动,你的这些黏合剂程序就必须重写。比方说现在Ruby 1.9出来以后,绝大部分Ruby的C扩展库统统无法正常编译。

基于以上这些原因,给Ruby写C的扩展库一件非常痛苦的事情,而且也是Ruby社区程序员一直抱怨的问题之一。然而随着FFI的出现,我们即将告别这些痛苦的历史!

FFI即Foreign Function Interface,外部函数调用接口,并非Ruby独有的概念,只不过因为Ruby扩展库带来的痛苦,使得Ruby的FFI显得格外迫切。FFI最早已经在Rubinius虚拟机平台上实现了,随后在JRuby上面也得以实现,而今天:2008年11月1日,在Ruby官方版本的解析器Ruby 1.8.6/1.8.7和1.9版本上也可以使用FFI了。

安装FFI很简单:

gem install ffi


使用FFI也很简单,比方说调用C语言标准库的printf函数,我们可以这样来写:

require 'ffi'
module MyExtModule
  extend FFI::Library
  attach_function :printf, [:string], :void
end

MyExtModule.printf("Hello FFI\n")


用attach_fuction就可以把C语言标准库的printf函数绑定到ruby里面来了,后面的参数分别声明C函数的传入参数和返回值。如果需要引入其他C库,可以预先使用ffi_lib指定库的名称。(我使用ffi_lib未能绑定非标准库,有可能是FFI的bug?也有可能是我没有设置对?)

有了FFI,在Ruby语言里面调用C库,就变成了一件异常轻松的事情,完全不需要ruby程序员再去吭哧吭哧啃C语言了,只要你手里捧着C库的API手册能看清楚函数的参数定义就够用了,然后你就可以直接在ruby里面随心所欲的调用它了,在调用之前,只需要用attach_function进行一次函数绑定声明即可。这对于整个ruby社区来说是一件非常棒的好消息。

在FFI的源代码树的samples目录下面还有几个小例子,大家可以自己看看:http://kenai.com/projects/ruby-ffi/sources/723/show

作为一个对比,我们来看看传统的ruby扩展库是如何调用C库的吧。以上面的为例,如果我们希望在ruby里面使用C库的printf函数,那么要先用ruby API的格式来写一段C代码去封装它:

#include <ruby.h>
 
static VALUE
dummy_printf(VALUE self, VALUE format, VALUE num)
{
    int rlt = printf(RSTRING_PTR(format), NUM2INT(num));
    return INT2FIX(rlt);
}
 
void Init_printf()
{
    /* register the method to the Kernel module */
    rb_define_method(rb_mKernel, "dummy_printf",
                     RUBY_METHOD_FUNC(dummy_printf), 2);
}


当然你必须对ruby.h里面定义的ruby内部数据结构和ruby内部的函数调用有充分的了解。然后你要创建一个extconf.rb文件:

require 'mkmf' 
create_makefile('printf')


运行这个文件:ruby extconf.rb,会创建出来编译这段C代码的Makefile,然后你再编译和安装,最终这个共享链接库会被拷贝到你的ruby的本地扩展库目录下面。最后你才可以在ruby里面调用这个封装好的dummy_printf方法。

另外,对于通过FFI去调用比较复杂的C库的时候,会涉及到不同语言之间的数据类型转换问题,关于数据类型的对照表,以及FFI使用更详细的介绍请看张驰原(他也是rmmseg的作者)的文章:http://pluskid.lifegoo.com/?p=370
9
1
评论 共 6 条 请登录后发表评论
6 楼 ray_linn 2011-12-31 17:41
用fiddle好了
5 楼 danielking 2008-11-04 18:02
swig也不错啊, 可能稍稍复杂一点, 但是swig有个好处就是一次定义好了就能生成好多种语言都能调用的库
4 楼 robbin 2008-11-04 13:48
wooce 写道

dlx库跟FFI有什么区别? 哪个好一些?

dlx库已经死掉了,两年多没有任何新版本发布。FFI是刚刚出来的新东西,同时支持Ruby,JRuby,Rubinius,你说哪个好?
3 楼 wooce 2008-11-04 11:30
dlx库跟FFI有什么区别? 哪个好一些?
2 楼 Magicloud 2008-11-03 09:43
作者不知道有个叫dlx的库吗。
1 楼 cookoo 2008-11-02 03:57
哇,这么傻瓜.

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 局域网IP地址非法使用问题的解决方法

    在大多数局域网的运行管理工作中,网络管理员负责管理用户IP地址的分配,用户通过正确地注册后才被认为是合法用户。在局域网上任何用户使用未经授权的IP地址都应视为IP非法使用。但在Windows操作系统中,终端用户可以自由修改IP地址的设置,从而产生了IP地址非法使用的问题。改动后的IP地址在局域网中运行时可能出现的情况如下。??      a. 非法的IP地址即IP地址不在...

  • 局域网内如何盗用别人的IP上网

    现在很多局域网都根据IP地址的不同,给不同IP地址分配不同资源;或则网内自己ip由于一些原因被封掉,不能访问外网;这些时候可能我们可能就需要先借别人的IP用用了。下面分两种情况来介绍具体的方法:一、IP地址没有和网卡地址帮定简单,设置换个ip地址就行了。换个你想用的得IP,阿,不知道如何换? 我这里以windows2000为例,右键网上邻居,选属性, 右键本地连接,选属性,选 tcp/ip,属性然

  • 校园网上网帐号被盗事件的分析与防范

    校园网给学校的师生员工带来便利的同时,也产生了上网帐号的安全问题。近期我们接到投诉上网账号被他人占用的事件数量呈上升趋势,经过分析上网记录数据,可能还存在更多用户在毫不知情的情况下帐号被人盗用的情况。我校的上网帐号采用实名制,上网认证采用NAT+LDAP方式,访问校外网时要安装安全证书,还要在专用的客户端输入帐号名和密码。上网帐号为何频繁被盗呢?1、账号被盗事件五月中的一天...

  • 如何有效地解决校园网络IP地址冲突问题

      随着高校数字化校园网络的广泛应用,校内机器增多,无线网络的覆盖,相应的IP地址分配也在不断增多,IP地址冲突现象与日俱增,在一定程度上影响了网络的正常运行。    《计算机科学与应用》期刊上有篇文章从基础网络管理和网络技术管理两方面入手,提出了一项解决方案,解决校园网IP地址冲突问题,提高校园网网络管理、安全管理以及维护效率。    发生IP冲突的主要原因:1)用户不熟悉TCP/IP的原理,不...

  • 关于局域网中IP地址被盗用的探讨

    转载自品略图书馆http://www.pinlue.com/article/2020/03/2512/5710052114625.html 摘要:对于在Internet和Intranet网络上,使用TCP/IP协议时每台主机必须具有独立的IP地址,有了IP地址的主机才能与网络上的其他主机进行通信。随着网络应用大力推广,网络客户急剧膨胀,由于静态IP地址分配,IP地址冲突的麻烦相继而来。...

  • 什么是IP地址盗用?又要如何预防?

    IP地址是由互联网编号分配机构(IANA,Internet AssignedNumbersAuthority)先把IP地址分给各大洲的机构,然后各大洲的机构把IP地址分给运营商,再由运营商把固定的IP地址分配给用户。 假如出现分配的IP地址和设备不匹配的话,就有可能出现IP地址盗用的情况。 首先我们要先了解几种不同的IP地址盗用类型。 1.IP地址静态盗用 该方法是指用户配置或者修改计算机IP设置时,使用他人合法IP地址或者未经合法分配的 IP地址,典型的例子是在用户非法入网和恶意隐藏自己.

  • 解决局域网内盗用IP的安全问题

    一、IP地址盗用方法分析  IP地址的盗用方法多种多样,其常用方法主要有以下几种:  1、静态修改IP地址   对于任何一个TCP/IP实现来说,IP地址都是其用户配置的必选项。如果用户在配置TCP/IP或修改TCP/IP配置时,使用的不是授权机 构分配的IP地址,就形成了IP地址盗用。由于IP地址是一个逻辑地址,是一个需要用户设置的值,因此无法限制用户对于IP地址的静态修改,除非使用

  • 网络协议学习之局域网监听技术

    ARP即地址解析协议,用于处理主机之间获取MAC地址与IP地址的映射问题。 若主机A和主机B通讯。当A主机网络层数据交给数据链路层时,数据就被数据链路层封装为MAC帧,MAC帧需要知道目的主机B的MAC地址。 于是在目的B的MAC未知的情况下,A主机数据链路层会向局域网广播一个ARP广播,广播的内容类似于”请问ip地址为aaaa的主机是谁, 请告诉我(IP bbbb,MAC bbbbb

  • 怎么样查看局域网IP地址是否被占用?

    一、概述:最近在搞一个项目,需要给服务器开通IP地址白名单,想多开几个,于是乎就涉及到怎么查看没有占用的IP地址查询的问题。于是总结如下。 二、如何查看IP地址是否被占用,一共三种办法,我用的是批量查询的方法。很实用。 在通过局域网(例如校园网、公司内网)上网时,首先需要设定一个可用的IP。那么局域网中哪些IP没有被占用呢?可以包着碰运气的心理,设置好IP再看有没有冲突报告

  • IP地址冲突怎么办? 如何解决局域网IP地址冲突?

    IP地址冲突怎么办? 如何解决局域网IP地址冲突? 在同一个局域网里如果有两个用户同时使用了相同的IP地址,或者一个用户已经通过DHCP得到了一个IP地址,而此时又有其他用户以手工分配方式设定了与此相同的IP地址,这将造成IP地址冲突,并会令其中一个用户无法正常使用网络。 那么,应该怎样避免IP地址冲突这种情况的发生呢?我们可以从以下几个方面分析: 发生IP地址冲突的原因: 1、很多用户不知道“...

  • IP地址冲突解决方案,局域网IP地址冲突如何解决?

    IP地址冲突是网络管理的一个常见问题。尤其在企业局域网内部,由于管控策略的存在,总会有人试图通过修改IP地址来绕开管控、获取更多的上网权限以及更高的带宽。修改的IP一旦和公司的服务器发送IP冲突,会直接影响到办公和业务的正常运行。IP冲突的危害如下:绕开行为管理策略和流控策略的管控。导致被冲突的客户机断网。和服务器IP冲突会影响业务的正常运行。难以定位,使网络管理混乱无序。本...

Global site tag (gtag.js) - Google Analytics