Mercurial > hg > Papers > 2020 > koo-thesis
changeset 16:05eac76e8c24
update paper
author | e165727 <e165727@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 15 Feb 2020 21:20:45 +0900 |
parents | e2d2da777af0 |
children | ce4e57fe652c |
files | Paper/appendix.tex Paper/chapter2.tex Paper/chapter4.tex Paper/chapter5.tex Paper/main.pdf Paper/main.tex Slide/Slide.md |
diffstat | 7 files changed, 75 insertions(+), 48 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/appendix.tex Sat Feb 15 21:20:45 2020 +0900 @@ -0,0 +1,12 @@ +\chapter*{付録} +\section*{Raku(Perl6)のbuild方法} +以下にMacOS上での Raku の build 方法を記述する\\ + +GitHub から rakudo をダウンロードしてくる + +\fbox{git clone https://github.com/rakudo/rakudo.git}\\ + + +ダウンロードしてきた directory に cd して 以下のコマンドを実行する + +\fbox{perl Configure.pl --gen-moar --gen-nqp --backends=moar --moar-option='--compiler=clang'}
--- a/Paper/chapter2.tex Sat Feb 15 19:33:39 2020 +0900 +++ b/Paper/chapter2.tex Sat Feb 15 21:20:45 2020 +0900 @@ -71,25 +71,12 @@ \subsection{起動時間の比較} \begin{table}[H] \begin{center} - \begin{tabular}{|l|l|} \hline - Language& version \\ \hline - Raku & 2019.03.1\\ - Perl5 & v5.18.4 \\ - Python & 2.7.10 \\ - Ruby & 2.3.7p456 \\ \hline - \end{tabular} - \end{center} - \caption{比較言語のバージョン} -\end{table} - -\begin{table}[H] - \begin{center} - \begin{tabular}{|l|l|} \hline - Language& Time \\ \hline - Raku & 0.249 sec \\ - Perl5 & 0.004 sec \\ - Python & 0.013 sec \\ - Ruby & 0.083 sec \\ \hline + \begin{tabular}{|l|l|l|} \hline + Language& version & Time \\ \hline + Raku & 2019.03.1& 249 ms \\ + Perl5 & v5.18.4 & 4 ms \\ + Python & 2.7.10 & 13 ms \\ + Ruby & 2.3.7p456 & 83 ms\\ \hline \end{tabular} \end{center} \caption{起動時間の比較}
--- a/Paper/chapter4.tex Sat Feb 15 19:33:39 2020 +0900 +++ b/Paper/chapter4.tex Sat Feb 15 21:20:45 2020 +0900 @@ -34,4 +34,5 @@ \item 同時に二つ以上のタスクを与えられると実行順のスケジューリングができない \item 異常に長いタスクが投げられた場合, 次のタスクが前のタスクが終わるまで実行ができない \item 起動時のオプションが選択出来ない +\item Client側を Raku で書いてしまうとファイルパスを送信する際に Raku を起動することになるので, 起動時間が通常実行よりかかってしまう \end{itemize}
--- a/Paper/chapter5.tex Sat Feb 15 19:33:39 2020 +0900 +++ b/Paper/chapter5.tex Sat Feb 15 21:20:45 2020 +0900 @@ -1,15 +1,19 @@ \chapter{結論} \section{まとめ} -本稿では実行する Raku スクリプトのファイル名をサーバーに転送し,コンパイラサーバーでコンパイルを行い実行することで全体的に処理時間が早くなることを示した. -\\ +本稿では実行する Raku スクリプトのファイル名をサーバーに転送し,コンパイラサーバーでコンパイルを行い実行する手法の提案を行なった. +また, 提案手法に沿って「Abyss Server」を実装した. \\ + +Raku の速度改善において, 同一ホスト内でサーバープロセスを生成し,サーバープロセス内であらかじめコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる + 今後Abyssサーバーでの開発をより深く行っていくにあたって以下のような改善点が見られた \\ \begin{itemize} \item コンパイラの起動が遅い言語だけでなく, モジュールの読み込みが遅い言語などを, あらかじめサーバーを側でモジュールを読み込んでおき, それを利用してプログラムを実行する手法も応用できるように改良を行う. \item モジュールを送信する機能の追加 -\item プログラムの実行終了したらモジュールを削除する機能の追加 \\ +\item プログラムの実行終了したらモジュールを削除する機能の追加 +\item リソース周りの実装 \end{itemize} %またscript言語をサーバー上で実行する場合の欠点については以下のようなものが見られる %\begin{itemize} %\item %\end{itemize} -今後の開発を行っていくにあたって, 他の script 言語にも応用できるように開発を行っていく. +今後の開発を行っていくにあたって, 他の script 言語にも応用できるように開発を行っていく. \ No newline at end of file
--- a/Paper/main.tex Sat Feb 15 19:33:39 2020 +0900 +++ b/Paper/main.tex Sat Feb 15 21:20:45 2020 +0900 @@ -91,6 +91,6 @@ \input{thanks.tex} % 付録 -%\input{appendix.tex} +\input{appendix.tex} \end{document}
--- a/Slide/Slide.md Sat Feb 15 19:33:39 2020 +0900 +++ b/Slide/Slide.md Sat Feb 15 21:20:45 2020 +0900 @@ -3,20 +3,19 @@ profile: 琉球大学 ## 研究背景 -- 現在開発の進んでいる言語に Raku がある. -スクリプト言語 Raku は任意の VM が選択できるようになっており, 主に利用されている VM に C で書かれた MoarVM が存在する. -- MoarVM は JIT コンパイルなどをサポートしているが, 全体的な起動時間及び処理速度が Perl5 や Python , Ruby などの他のスクリプト言語と比較し非常に低速である. -その為, 現在日本国内では Raku は実務としてあまり使われていない. -- Raku の持つ言語機能や型システムは非常に柔軟かつ強力であるため, 実用的な処理速度に達すれば, 言語の利用件数が向上することが期待される. + - 現在多くのスクリプト言語はインタプリタ型言語であり, 実行時にインタプリタの立ち上げ, モジュールを読み込み, スクリプトの解釈, スクリプトの実行 といったような処理を担っている. + - これらの処理の中にはOS上で事前に行うことで, より起動時間, 及び処理時間の短縮が予想される. + - 頻繁にコードを書き換え実行するスクリプト言語では起動時間をできるだけ短くしたい - +<!-- ## 研究概要 - Raku の実装の一つであるRakudoは、Byte code である MoarVM と、それ上で動作する Raku のsubsetであるnqp (Not Quite Perl)上に構成されている。 - 現状のRakuの実行はRakuで記述されたコンパイラをloadしてJITしながら実行すること自体に時間がかかっている。 - そこで, 同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案し実装する. +--> ## Raku と他言語の起動時間の比較 -- perl6と他言語の起動時間の比較行なった. +- Raku と他言語の起動時間の比較行なった. - 実行環境 ``` @@ -145,24 +144,40 @@ - ファイルパスを受け取ると, ファイルを開き実行する. ``` -unit class Abyss::Server:ver<0.0.1>; +use v6.c; +unit class Abyss::Server:ver<0.0.1>:auth<cpan:ANATOFUZ>; use MONKEY-SEE-NO-EVAL; use IO::Socket::Unix; +use NativeCall; -method readeval { - my $listen = IO::Socket::Unix.new( - :listen, - :localhost<localhost>, - :localport(3333) - ); - loop { - my $conn = $listen.accept; - while my $buf = $conn.read(1024) { - EVALFILE $buf.decode; +sub close(int32) returns int32 is native { ... } +sub dup(int32 $old) returns int32 is native { ... } +sub dup2(int32 $new, int32 $old) returns int32 is native { ... } + +method readeval +{ + my $listen = IO::Socket::Unix.new( :listen, + :localhost<localhost>, + :localport(3333) ); + my $backup = dup(1); + say DateTime.now; + + loop + { + my $conn = $listen.accept; + my $sock_msg; + my $buf = $conn.recv(); + $sock_msg = $buf; + close(1); + dup2($conn.native-descriptor(), 1); + EVALFILE $sock_msg; + dup2($backup, 1); + close($backup); + $conn.close; } - $conn.close; - } -} + + $listen.close; +}} ``` ## Abyss Client側の実装 @@ -170,11 +185,20 @@ ``` use IO::Socket::Unix; +use NativeCall; -my $conn = IO::Socket::Unix.new( :host<localhost>, +sub close(int32) returns int32 is native { ... } +sub dup(int32 $old) returns int32 is native { ... } +sub dup2(int32 $old, int32 $new) returns int32 is native { ... } + +my $conn = IO::Socket::INET.new( :host<localhost>, :port(3333) ); -$conn.print: 'FILEPASS'; +$conn.print: 'Absolute file path'; + +say $conn.lines; + +$conn.close; ``` ## Raku のEVAL @@ -198,7 +222,6 @@ ## Abyss Serverの欠点 - 現在 Abyss Server には 一度スクリプトを実行した後にサーバー内の環境をリセットする機能が存在しないため,スクリプトがサーバー内の環境に影響を及ぼした場合,通常実行と違う挙動をする危険性がある -- Raku に eval の出力を socket に切り替える機能が存在しないので出力が Server 側に返ってしまい,ユーザー側に返ってこない - 同時に二つ以上のタスクを与えられると実行順のスケジューリングができない - 与えられた順番に処理していく - 異常に長いタスクが投げられた場合, 次のタスクが前のタスクが終わるまで実行ができない