Mercurial > hg > Papers > 2020 > tobiuo-midterm
changeset 14:9b3f9bff4911
copletion.
author | Kaito Okura <e175748@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 15 Sep 2020 16:19:40 +0900 |
parents | 4d5a07da78a7 |
children | 1363cbcfcdf3 |
files | images/Rakudo.pdf midterm.pdf midterm.tex text/abstract.tex text/abyss.tex text/purpose.tex text/raku.tex |
diffstat | 7 files changed, 62 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/midterm.tex Tue Sep 15 15:12:52 2020 +0900 +++ b/midterm.tex Tue Sep 15 16:19:40 2020 +0900 @@ -55,7 +55,7 @@ \begin{document} \ltjsetparameter{jacharrange={-3}} -\title{\LARGE Rakuのサーバーを用いた実行 \\ \Large Raku} +\title{\LARGE Rakuのサーバーを用いた実行 \\ Running with Raku server} \author{学籍番号 175748C 氏名 大蔵 海斗 \and 指導教員 : 河野 真治} \date{} \maketitle @@ -66,13 +66,13 @@ % 2段組開始 \begin{multicols*}{2} - \input{text/purpose.tex} % 研究目的 + % \input{text/purpose.tex} % 研究目的 \input{text/raku.tex} % Rakuの概要 \input{text/abyss.tex} % Abyssサーバー \begin{thebibliography}{2} \bibitem{koo_thesis} 福田光希, 河野真治. Rakuのサーバーを使った実行. 琉球大学工学部情報工学科令和元年度卒業論文. - \bibitem{koo_prosym} 福田光希, 河野真治. Perl6のサーバーを使った実行. プログラミングシンポジウム論文. + \bibitem{koo_prosym} 福田光希, 河野真治. Perl6のサーバーを使った実行. プログラミングシンポジウム論文. \bibitem{raku_guide} Raku入門\\{https://raku.guide/ja/}(2020/09/09 アクセス) \end{thebibliography}
--- a/text/abstract.tex Tue Sep 15 15:12:52 2020 +0900 +++ b/text/abstract.tex Tue Sep 15 16:19:40 2020 +0900 @@ -1,3 +1,21 @@ \begin{abstract} + 現在開発の進んでいる言語にスクリプト言語のRakuがある. + Rakuは起動時間がPerl5やPython, Rubyなどの主要なスクリプト言語に比べて非常に低速である. + Rakuは, コンパイラがRakuそのもので書かれているため, 毎回コンパイラのロードとコンパイル, JITコンパイルを繰り返すことになる. + 最近のスクリプト言語では, コンパイラが自身で書かれているケースが多い. + 例えば, Pypy, golang, Haskellなどである. + そこで, この問題を解決するために, 既にコンパイラをロードしてあるサーバーを用意し, + サーバー上でスクリプト言語を実行する手法を提案している. + Rakuに対しては, 当研究室にてAbyssサーバーを開発している. + + + There is a scripting language, Raku, that is currently under development. +Raku's startup time is very slow compared to other major scripting languages such as Perl5, Python, and Ruby. +Raku's compiler is written in Raku itself, so loading and compiling the compiler and JIT compiling are repeated every time. +In recent scripting languages, there are many cases where the compilers are written by themselves. +For example, Pypy, golang, Haskell and so on. +So, to solve this problem, we prepare the server which has already loaded the compilers, +We have proposed a method of executing the script language on the server. +For Raku, we are developing the Abyss server in our laboratory. \end{abstract}
--- a/text/abyss.tex Tue Sep 15 15:12:52 2020 +0900 +++ b/text/abyss.tex Tue Sep 15 16:19:40 2020 +0900 @@ -14,17 +14,28 @@ \label{fig:Abyss_execute} \end{center} -\begin{center} -\begin{tabular}{|c|c|} - \hline - 手法 &実行時間 \\ - \hline - Abyssサーバーを用いた実行 &0.0238sec \\ - 通常実行 &0.2695sec \\ - \hline -\end{tabular} -\caption{実行時間の比較} -\label{table:time_comparison} -\end{center} +\section{Abyssサーバーの課題} +Rakuは開発中のため, 主なアプリケーションはコンパイラとテストコードしかない. +最初の目標として, テストの高速化を行う. +現状では..秒かかる. +テストは..項目あり, 連続的に実行される. +我々の方法では, テストスクリプトをサーバーに連続的に送り実行することになる. +この時に, 毎回コンパイラをロードしなおすのでは高速化にならない. +サーバーからの出力はソケット経由で行われるが, 各テスト項目ごとにソケットのopen/closeを繰り返すのは望ましくない. + +一方で, 前のテストの結果が次のテストに影響することは望ましくない. +例えば, 大域変数が残っていたりする場合である. +これらの後始末をする必要がある. -\section{Abyssサーバーの課題} +複数のテストの実行や入出力をパイプライン的に実行することにより, 高速化が可能だと思われる. + +パイプライン実行は並列実行と異なり, 個々のテストは並行に実行されない. +サーバー上での並列実行を可能にするには, 複数の実行ワーカーを用意すればよい. + +これらの内容により, テストを高速で実行することが最初の目標となる. + +実際のスクリプト環境として使用する場合には, 実行するスクリプト間での干渉を抑える必要がある. +しかし, JITコンパイルされた結果を再利用しないとすると, 実行時間は不利になる. +これらを調整する仕組みとAPIを開発し, 評価する必要がある. + +現在は, Abyssサーバーの実行の再現を行なっている.
--- a/text/purpose.tex Tue Sep 15 15:12:52 2020 +0900 +++ b/text/purpose.tex Tue Sep 15 16:19:40 2020 +0900 @@ -1,6 +1,9 @@ -\section{研究目的} +\section{スクリプト言語の高速化} 現在開発の進んでいる言語にスクリプト言語のRakuがある. Rakuは起動時間がPerl5やPython, Rubyなどの主要なスクリプト言語に比べて非常に低速である. -この問題を解決するために, 当研究室にてAbyssサーバーを開発している. - -本稿では, Abyssサーバーを +Rakuは, コンパイラがRakuそのもので書かれているため, 毎回コンパイラのロードとコンパイル, JITコンパイルを繰り返すことになる. +最近のスクリプト言語では, コンパイラが自身で書かれているケースが多い. +例えば, Pypy, golang, Haskellなどである. +そこで, この問題を解決するために, 既にコンパイラをロードしてあるサーバーを用意し, +サーバー上でスクリプト言語を実行する手法を提案している. +Rakuに対しては, 当研究室にてAbyssサーバーを開発している.
--- a/text/raku.tex Tue Sep 15 15:12:52 2020 +0900 +++ b/text/raku.tex Tue Sep 15 16:19:40 2020 +0900 @@ -1,26 +1,25 @@ \section{プログラミング言語Raku} -\subsection{Raku} Rakuは元はPerl5の後継言語のPerl6として開発されていたが, 言語仕様及び処理実装がPerl5と大幅に異なっており, 言語的な互換性が存在しない. 従って現在ではRakuとPerl5は別言語としての開発方針になっている. Rakuという名称は, 現在有力な処理系であるRakudoが由来となっている. Rakuの起動は, MoarVMを起動, nqpをロード, Rakudoをロードもしくはコンパイルし, その後JITしながら実行する. -\subsection{Rakudo} + RakudoとはRakuの現在の主流な実装である. (Rakuは言語名, Rakudoはコンパイラ) Rakuは仕様と実装が明確に区分されており, Rakudoという実装, roastというRakuの仕様 (テストスイートがある). Rakudoの構成は, MoarVMと呼ばれるRakudoのために構築されたVM, NQPと呼ばれるRakuのサブセット, NQPとRaku自身で記述されたRakuである. RakudoはMoarVMの他にJVMやJavaScriptを動作環境として選択可能である. -\subsection{MoarVM} + MoarVMはRakudo, NQPのために構築されたVMであり, C言語で実装されている. JITコンパイルなどが現在導入されているが, 起動時間が低速であるなどの問題がある. MoarVM独自のByteCodeがあり, NQPからこれを出力する機能などが存在している. MoarVMはNQPとByteCodeを解釈する. -\subsection{NQP} + NQPとはNot Quite Perlの略でRakuのサブセットである. その為基本的な文法などはRakuに準拠しているが,変数を束縛で宣言するなどの違いが見られる. このNQPで記述されたRakuの事をRakudoと呼ぶ. @@ -29,7 +28,7 @@ NQPは最終的にはNQP自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれたMoarVMのバイトコードを必要とする. Rakuの一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM, VMに対応させる様にビルドしたNQPがそれぞれ必要となる. -\subsection{Rakuが遅い原因} + 通常, Rubyのようなスクリプト言語ではまずVMが起動し, その後スクリプトをバイトコードに変換して実行という手順を踏む. 対してRakuは, コンパイラのRakudo自体がRakuとNQPで書かれているため, MoarVMを起動し, RakudoとNQPのバイトコードを読み取り, Rakudoを起動し, その後スクリプトをバイトコードに変換して実行という手順を踏む. @@ -38,3 +37,9 @@ また, Rakuは実行時の情報が必要であり, メソッドを実行する際にinvokeが走ることも遅い原因である. invokeはMoarVMのmethod呼び出しのバイトコードである. + +\begin{center} + \includegraphics[width=80mm]{images/Rakudo.pdf} + \caption{Rakudoの構成} + \label{fig:Rakudo_structure} +\end{center}