現在開発の進んでいる言語にスクリプト言語の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が出ずに無事結果を出力. 同じスクリプトを複数回実行させても大丈夫.