LoginSignup
8
10

More than 5 years have passed since last update.

Perl6からGoの関数をつかう → はやい?

Last updated at Posted at 2015-11-07

はじめに

RubyからGoの関数をつかう → はやい」に便乗して、Perl6でShared Libraryを利用する方法を書きます。
釣りタイトルっぽくなってしまって恐縮です…

あわせて読みたい

言語 リンク 説明
Ruby+Go RubyからGoの関数をつかう → はやい 元ネタ。再帰を使ったフィボナッチ数算出を例にRubyからのShared Libraryの使用を解説。論旨は各言語それぞれの得意分野を活かした使い方をしようというもの
Crystal Crystalで書く → はやい 元ネタのRubyコードをCrystalでビルドして実行すればGoと遜色のない速度であったという検証記事
Ruby+Rust RubyからRustの関数をつかう → はやい
Ruby RubyからGoの関数をつかわなくても再帰をやめる → はやい 再帰を使わなければ速い旨
Ruby Ruby で書く→速い 同上
Common Lisp Common Lispで書く→はやい
Node.js Node.jsをつかう → はやい
JRuby+Scala JRubyからScalaの関数をつかう → はやい
Groovy+Go GroovyからGoの関数を使う→はやい
PHP+Go PHP から Go の関数を呼び出す

環境

項目
ハード MacBook Air (13-inch, Mid 2011)
OS OS X El Capitan (10.11.1)
プロセッサ 1.8 GHz Intel Core i7
メモリ 4 GB 1333 MHz DDR3
$ go version
go version go1.5.1 darwin/amd64

$ ruby -v
ruby 2.0.0p645 (2015-04-13 revision 50299) [universal.x86_64-darwin15]

$ perl6 -v
This is perl6 version 2015.09 built on MoarVM version 2015.09

①Perl6からGoの関数を呼ぶ。

  1. 元ネタの「Goを共有ライブラリにする」の通り、fib.soを作成します。

  2. 共有ライブラリとしてコンパイルしたGoをPerl6から扱うにはNativeCallモジュール1を使用します。

go-fib.pl
use v6;
use NativeCall;

sub fib(int32) returns int32 is native('./fib.so') { * }

say fib 40;

②再帰を使ったフィボナッチ数算出

fib_recursive.pl
use v6;

proto fib (Int $n --> Int) is cached {*}
multi fib (0)  { 0 }
multi fib (1)  { 1 }
multi fib ($n) { fib($n - 1) + fib($n - 2) }

say fib 40;

③再帰を使わないフィボナッチ数算出

fib_infinite_list.pl
use v6;

my constant @fib := 0, 1, *+* ... *;
say @fib[40];

結果

出力
# ① Perl6 with GO
$ time perl6 fib-go.pl
102334155

real    0m1.985s
user    0m1.867s
sys     0m0.076s
出力
# ② 再帰を使う
$ time perl6 fib_recursive.pl
102334155

real    0m0.301s
user    0m0.248s
sys     0m0.038s
出力
# ③ 再帰を使わない
$ time perl6 fib_infinite_list.pl
102334155

real    0m0.278s
user    0m0.237s
sys     0m0.036s

おわりに

(この例だと遅くなってしまいましたが)
元記事にもあった通り、各言語の得意分野で適宜書き分けて利用すると良いと思います。

おわりです。

注釈と参考

8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10