使用 Haskell 和 Hubris 加强 Ruby

  • Sebastien Auvray
  • 杨晨

2009 年 9 月 1 日

话题:Ruby函数式编程Erlang语言 & 开发架构

在 Ruby 或者 Rails 应用中嵌入 C 代码是解决性能瓶颈的办法之一,RubyInline大大简化了这个过程。Ruby 社区也紧紧地和其他的函数语言社区联系在一起,包括 Erlang、Caml 和 Haskell:Erlectricity已经成为和 Erlang 连接的纽带,而rocaml则可以与 Objective Caml 进行交互。Apache 的Thrift则是以另外一种方式(通过 PRC 和序列化格式)与其他语言交互。

Mark Wotton编写了Hubris,使得在 Ruby 中调用 Haskell 代码成为可能。你只需要安装Haskell 平台所带的ghc来兼容jhc(John 的 Haskell 编译器),不过你必须注意的是,jhc 只能运行在 Linux 或者 Mac 平台下。

一旦你有这些需求,你需要首先编写一个 Haskell 文件,在自定义的函数处添加额外的调用导出命令,例如Test.hs

fibonacci :: Int -> Int
fibonacci n = fibs !! n
  where fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

然后你需要调用jhc_builder.sh Test.hs来创建动态库(libdynhs.so)。

接下来你可以放心大胆地编写 Ruby 代码,并且使用 Ruby/DL 加载动态库调用导出的函数了。

require 'dl/import'
 
module HaskyPants
  extend DL::Importable
  dlload "./libdynhs.so"
  extern "int fibonacci_hs(int)"
end
 
puts HaskyPants.fibonacci_hs(12)

Mark 将会在九月份举办的rorosyd做一个关于 Hubris 的讲座。尽管只是初步意向,但是这个讲座肯定会吸引一些 Haskell 的用户。

查看英文原文:Empower Your Ruby With Haskell And Hubris

Ruby函数式编程Erlang语言 & 开发架构