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

最近的两篇关于Rubinius的文章中的第一篇是Giles Bowkett所撰写的,Giles在尝试开始参与Rubinius编译器的开发。Rubinius编译器通过遍历Ruby抽象语法树(Abstract Syntax Tree,AST)进行工作,AST使用ParseTree的s表达式(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。

你可能感兴趣的:(Rubinius:深入字节码编译器和外来函数接口)