現在開発の進んでいる言語にスクリプト言語のRakuがある. Rakuは起動時間がPerl5やPython, Rubyなどの主要なスクリプト言語に比べて非常に低速である. RakuはコンパイラがRakuそのもので書かれているため, 毎回コンパイラのロードとコンパイル, JITコンパイルを繰り返すことになる. 最近のスクリプト言語では, コンパイラが自身で書かれているケースが多い. 例えば, PyPy, Go言語, Haskellなどである. そこで, この問題を解決するために, 既にコンパイラをロードしてあるサーバーを用意し, サーバー上でスクリプト言語を実行する手法を提案している. Rakuに対しては, 当研究室にてAbyssサーバーを開発している.
# やったこと
- 今までhomebrewでinstallしたrakudo-starを使っていたが, githubからroastをcloneしてbuildした.
brew unlink rakudo-star
でrakudo-starを無効化したり, githubからzefをclone&buildしたり.
use v6;
がどのように実装されているのかを調べた. (後述)EVALFILE
を参考にEvalAsMod.pm6
を作成した.
|
|
EvalAsMod.pm
を使用して名前空間が切られているか実験した. (後述)- 複数のスクリプトをServerに送れるよう
client.p6
に手を加えた.
#
use v6;
がどのように実装されているのかを調べた.
- このページで下記の記述を発見.
use v6;
のコードはコメント行を除いた中で最初の行でなければならないっぽい.
we’ll require that a “use v6.X” is the first non-comment, non-whitespace declaration in a file. Anything later will trigger a “too late to switch Raku language version”.
-
use v6;
を複数回宣言して出てくるerror文Too late to switch language version.
がどこで定義されているのか調べた. -
rakudo/src/core.c/Exception.pm6にて
X::Language::TooLate
として定義されている. -
X::Language::TooLate
は以下で呼び出されている.- rakudo/src/perl6/Grammar.nqp
- rakudo/src/perl6/World.nqp
World.nqp
ではX::Language::TooLate
の部分がコメントアウトされている.
-
Grammar.nqp
のコードを読んでみた.X::Language::TooLate
はtoken statement_control
の中で使われている.statement_control
はmoduleのimportなどを解釈する役割?
typed_panic
という関数の引数にされている.- 同じく
Grammar.nqp
内に定義されていた関数.
- 同じく
- 読んでもよくわからなかった…
#
EvalAsMod.pm
を使用して名前空間が切られているか実験した.
- 実験用の2つのスクリプトを用意.
|
|
|
|
EVALFILE
でスクリプトを評価するverのAbyss::Server.pm6
で上の2つのスクリプトを実行する.Redeclaration of routine 'add' (already defined in packageAbyss::Server). Did you mean to declare a multi-sub?
というerrorがでた.
EVALASMOD
でスクリプトを評価するverのAbyss::Server.pm6
で上の2つのスクリプトを実行する.- errorが出ずに無事結果を出力. 同じスクリプトを複数回実行させても大丈夫.