阅读更多

9顶
1踩

编程语言

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

2008-11-02 00:40 by 见习编辑 robbin 评论(6) 有15486人浏览
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
哇,这么傻瓜.

发表评论

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

相关推荐

  • 局域网断线报警带声音

    BAT程序,如果要编辑IP地址请用记事本打开,按规则修改IP地址即可,声音文件同理

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

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

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

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

  • dns内网劫持

    一、原理 虽然计算机之间通信需要对方的ip,但是最底层的传输是物理层上,传输的是二进制和MAC帧,将ip解析成MAC地址的是ARP缓存表,这个缓存表每个第二层设备及以上都有。 主机A要和主机B通信,知道主机A的ip,但是arp缓存表了没有主机B的MAC地址,于是他会在局域网内广播询问主机B的mac,主机B会应答自己的MAC.(注:因为每个主机的ip是不固定的,所以设...

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

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

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

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

  • 内网横向移动—ARP攻击&图片捕捉&数据劫持&DNS劫持

    ARP(Address Resolution Protocol)是一种TCP/IP协议,用于根据IP地址获取物理地址。在计算机发送信息时,如果需要知道目标IP地址的物理地址,就会使用ARP协议。该协议会通过将目标IP地址广播到局域网上的所有主机,并接收返回的消息来获取目标物理地址。一旦收到返回的消息,计算机就会将该IP地址和物理地址存入本机ARP缓存中,以便下次请求时直接查询,从而节约资源。

  • 关于局域网中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地址,典型的例子是在用户非法入网和恶意隐藏自己.

  • 局域网内DNS劫持方法

    转载注明出处,尊重原创! 以下讲述本人最近设计的一套基于局域网的dns劫持方法,其最终能实现的目的是:只用一台接入到某个局域网的计算机,该计算机可以对该局域网内指定的计算机发起dns劫持,使被dns劫持的计算机的可以正常的上网,但是访问某个特定网站时候,转到的是我们的钓鱼网站。整套dns劫持模式由以下元素组成:arp欺骗,nat 转发,搭建web服务器,搭建dns服务器,这些都是在我们接入到局域...

  • 掉线报警 检测多个IP地址通断

    自动检测多个IP地址,自动检测每个ip记录断线时间,有日志文件

  • 局域网内的会话劫持(手动)

    需要使用到的工具:                                kali  linux                                arpspoof     &amp;gt;   转发ip                                wireshark     &amp;gt;  抓包                                fe...

Global site tag (gtag.js) - Google Analytics