BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Rubinius:深入字节码编译器和外来函数接口

| 作者 Werner Schuster 关注 6 他的粉丝 ,译者 孙向晖 关注 2 他的粉丝 发布于 2007年10月27日. 估计阅读时间: 4 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

最近的两篇关于Rubinius的文章中的第一篇是Giles Bowkett所撰写的,Giles在尝试开始参与Rubinius编译器的开发。Rubinius编译器通过遍历Ruby抽象语法树(Abstract Syntax Tree,AST)进行工作,AST使用ParseTrees表达式(s-expressions)以树状形式展现Ruby的源码。这意味着它是一个使用符号来描述数据的数组。例如,它可能看上去如同:

[:call, [:lit, 1], :+, [:array, [:lit, 1]]]

字面量(Literal)看上去像这样:

[:lit, 42]

为了遍历AST,ParseTree使用了SexpProcessor库,这个库可以方便访问者的创建。为了分析一个Ruby AST的所有的节点类型,需要建立一个具有process_XXX方法的SexpProcessor的子类,XXX须是节点的名字。例如,要处理的是:alias节点,就得定义:

def process_alias(node)
cur = node.shift
nw = node.shift
# ...
end

Ruby到Rubinius字节码编译器正是基于此方式构建的。例如,一个Ruby的alias调用被分析成[:alias, :old_name, :new_name],编译器会做如下处理:

def process_alias(x)
cur = x.shift
nw = x.shift
add "push :#{cur}"
add "push :#{nw}"
add "push self"
add "send alias_method 2"
end

编译器获取到旧的名字(对应cur变量值)和新的名字(对应nw变量值),建立实现功能所必需的字节码指令(使用字符串),既而转换成由Rubinius解释器执行的二进制字节码。

拥有用Ruby写成的编译器让我们更加容易洞悉其内部工作机理并做出实验性的修改。有用的场景可能包括对生成的代码进行操作或者以低耗方式来搜集有关于被编译代码的统计数据。

想要浏览Rubinius的源代码,可以参阅InfoQ上关于Rubinius开发入门的文章,或者查看Rubinius的在线源代码,例如Rubinius当前版本的字节码编译器

对Rubinius而言,编译器不是其仅有的必要条件,一个完善的标准库也是必不可少的。Red Artisan的Marus Crafter提供了一个教程,教大家如何向Rubinius添加类库功能。这个教程讲解了如何使用Rubinius的外来函数接口foreign function interfaceffi)访问本地类库调用native library calls)。这可以用来实现一些缺失的类库功能,在这个教程中实现类库功能是POSIX的link调用。

查看英文原文:Rubinius: Inside the Bytecode Compiler and Foreign Function Interface
译者简介:孙向晖,儿子小名“豆豆”,常被人称为“豆豆他爹”。1998年开始步入IT行业,现任浪潮软件质保中心副主任。专注于研究和实践MDA/UP/UML/SCM等相关技术在团队中的大规模应用,对产品化的软件项目管理、需求管理和配置管理略有心得。他的博客为http://blog.csdn.net/xiaosun/。参与InfoQ中文站内容建设,请邮件至china-editorial[at]infoq.com

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT