# HG changeset patch # User autobackup # Date 1613315403 -32400 # Node ID 6c24dd1308cd1c5adb0f614cbc820af6d038ec01 # Parent 2f33bc3a5b9b034b673ab4c5c1418382d3cdead7 backup 2021-02-15 diff -r 2f33bc3a5b9b -r 6c24dd1308cd user/tobiuo/メモ/2021/02/14.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/tobiuo/メモ/2021/02/14.md Mon Feb 15 00:10:03 2021 +0900 @@ -0,0 +1,53 @@ +# 研究目的 +最近のスクリプト言語ではコンパイラが自身で書かれているケースが多い. 例えば, PyPyやGo言語, Haskellなどである. +現在開発の進んでいる言語にRaku がある. RakuはコンパイラがRaku自身で書かれてるため, 起動時に毎回コンパイラのロードとコンパイル, JITコンパイルを繰り返すことになる. そのため, 起動時間及び処理速度がPerl5やPython, Rubyなど比較し非常に低速である. +そこで, この問題を解決するために, 既にコンパイラをロードしてあるサーバーを同一ホスト内に用意し, このサーバーに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案している. Rakuに対しては, 当研究室にてAbyssサーバーを開発している. + +# やったこと +- `Test::Util`を使っているテストファイルをAbyssサーバーで動かした. + - 使用するmoduleのpathをコンパイラに伝えるプラグマ`use lib`はmodule内で使用できない. + - abyssサーバーはファイルをmoduleとして実行するので, 実行ファイル内にある`use lib`に引っかかっていたのが今まで実行できていなかった原因. + - なので, `sed -i -e '/^use lib/d' ./**/*.t`のようにして`use lib`の文を全て削除した. + - このままでは, テストファイルは使用するmoduleのpathがわからないので, 代わりに`other/startup.p6`に`use lib`を書くことでpathを教えてあげる. + +- client側のソースコードを3種類にした. + - `other/client.p6` + - 実行ファイルをAbyssサーバーに投げるたびにsocketを繋ぎ直す. + - `other/client2.p6` + - 一度のsocket通信で全ての実行ファイルをまとめてAbyssサーバーに投げる. + - 若干だが標準出力のバグがある. + - `other/client3.p6` + - command lineから実行したいファイルを引数にしてAbyssサーバーに投げる. + - `*.t`みたいな引数には対応できていないので, 実行ファイルを単体ずつしか投げれない. + - パイプ処理にも対応できていない. + +- `*.rakudo`をAbyssサーバーで動かした. + - `*.t`は通らないtestやcompile errorを吐くファイルがたくさんなので, 綺麗に動く`*.rakudo`を動かしたかった. + - まず, Abyssサーバーで動かすために, `sed`コマンドで`use v6;`と`use lib`は全部抜いた. + - `*.rakudo`内には`exit`関数があり, Abyssサーバーで1つの`rakudo`ファイルを動かしただけで強制終了してしまう. + - なので, `exit`も`sed`コマンドで全部抜いた. +- `roast/rakudolist`の作成. + - それでも謎に動かない`rakudo`ファイルがいくつかあったので, 動く`rakudo`ファイルのみの絶対pathを`roast/rakudolist`にまとめた. + - clientには`roast/rakudolist`に記載されてあるファイルpathをAbyssサーバーに投げてもらう. + +# 速度検証 +- Abyssを使わないlocalでの実行. `other/time.sh`で実行する. + - `413.50s user 28.40s system 141% cpu 5:11.51 total` +```zsh:time.sh +#!/bin/zsh + +shpath=`pwd`/$0 +shdir=${shpath%/*/*} +lib=$shdir'/roast/packages/Test-Helpers/' + +time ( +for f (`cat $shdir'/roast/rakudolist'`) +do + raku -I $lib $f +done +) +``` +- `client.p6`での実行. + - `2.17s user 1.68s system 1% cpu 4:07.95 total` +- `client2.p6`での実行. + - `1.93s user 1.63s system 1% cpu 3:57.06 total` \ No newline at end of file