view Paper/chapter3.tex @ 4:d117c68a5b33

modify thesis
author e165727 <e165727@ie.u-ryukyu.ac.jp>
date Wed, 12 Feb 2020 19:19:55 +0900
parents
children 242bf93dbbb5
line wrap: on
line source

\chapter{Abyss Server}
\section{なぜ Perl6 は遅いのか}
通常 Ruby のようなスクリプト言語ではまず YARVなどのプロセスVM が起動し,その後スクリプトを Byte code に変換して実行という手順を踏む.
Rakudo はインタプリタの起動時間及び, 全体的な処理時間が他のスクリプト言語と比較して非常に低速である.
これは Rakudo 自体が Perl6 と NQP で書かれているため, MoarVMを起動し, Rakudo と NQP のByte codeを読み取り, Rakudoを起動し, その後スクリプトを読み取り, スクリプトの Byte code 変換というような手順で進むためである.
また Perl6 は実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である.

\section{Perl6によるAbyssの実装}
提案手法で実装したAbyss サーバーは Perl6 で書かれているクライアント側から投げられた Perl6 を実行するためのサーバーである.
図3は Abyss サーバーを用いたスクリプト言語実行手順である. 
Abyss サーバーはユーザーが Perl6 を直接立ち上げるのではなく, まず図3右側の Abyss サーバーを起動し, ユーザーは Abyss サーバーにファイルパスをソケット通信で送り, Abyss サーバーがファイルを開き実行し, その実行結果をユーザーに返す. 

この手法を用いることで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Perl6 スクリプトの実行を行うため, Rakudo の全体的な処理時間を短縮できると推測できる. 

\begin{figure}[H]
     \begin{center}
     \includegraphics[width=80mm]{fig/abyss.pdf}
     \end{center}
     \caption{Abyssサーバーを用いたスクリプト言語実行手順}
    \label{fig:perl6cbcinter}
\end{figure}

Code1はAbyss サーバーのソースコードである.
Abyssサーバーは起動すると, まず自身にファイルパスを転送するためのソケットを生成し, その後ファイルを受け取るための待機ループに入る.

Perl6 ではEVAL関数[\ref{code3}]があり文字列を Perl6 のソースコード自身として評価できる

Perl6 では, EVALは通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる.
EVALFILE はファイルパスを受け取るとファイル開き, バイト文字列に変換し読み込む, その後読み込んだバイト文字列にデコードし, ファイルパスの文字列を読み込み, ファイルの中身を EVAL と同様に解釈する.

Code1 の2行目にある MONKEY−SEE−NO−EVAL は Perl6 上で EVALFILE を使用可能にする pragma である.

\lstinputlisting[label=code1,  caption= Abyss サーバーの実装の source code ]{code/abyss.p6}
\lstinputlisting[label=code2,  caption=クライアント側の source code ]{code/client.p6}
\lstinputlisting[label=code3,  caption=evalのサンプルコード]{code/eval.p6}
%通常、自分でプロセス立ち上げてPerl6を実行する際は,
%\section{問題点}
\section{比較}
\begin{itemize}
\item{Microsoft CLR}
\\
.NET Framework には, 共通言語ランタイム(Common Language Runtime)と呼ばれるランタイム環境がある.
.NET対応のソフトウェアは, 様々なプログラミング言語で書かれたソースコードから, いったん共通中間言語 (Common Intermediate Language)による形式に変換されて利用者のもとに配布される.
CIL 形式のプログラムを解釈し, コンピュータが直に実行可能な機械語によるプログラムに変換して実行するソフトウェアが CLR である.
現状の Abyss サーバーはプロセスとして立ち上げているが, CLR は OS に直接組み込む必要があるが, Abyss サーバーはプロセス上で実行しているため OS に手を加えず実装が容易である.
\\
\item{PyPy}
\\
PyPy は Python の 実装の一つであり, Cpython のサブセットである RPython で記述された 処理系である.
\\
PyPy は JIT コンパイル を採用しており, 実行時にコードを機械語にコンパイルして効率的に実行させることができる.
PyPy は Cpython より実行速度が速いが起動速度は Cpython と比較して約3倍遅い.
Perl6 と同様, PyPyは Cpython と比較して起動時間が遅いため今回提案した手法を応用できると予測できる.
\end{itemize}
\section{まとめ}
本稿では実行する Perl6 ファイル名をサーバーに転送し,コンパイラサーバーでコンパイルを行い実行することで全体的に処理時間が早くなることを示した.
\\
今後Abyssサーバーでの開発をより深く行っていくにあたって以下のような改善点が見られた \\
\begin{itemize}
\item コンパイラの起動が遅い言語だけでなく, モジュールの読み込みが遅い言語などを, あらかじめサーバーを側でモジュールを読み込んでおき, それを利用してプログラムを実行する手法も応用できるように改良を行う.
\item 今回の実装では TCP ソケットを用いたが TCP ソケットを用いるとサーバーを立ち上げた際に外部からファイルを転送される可能性があるので, Unix domain socket の実装を行い, それを用いたクライアント・サーバーを作成することで安全性が高まると考えた.
Perl6 には現状 Unix domain socket の実装がないので, Unix domain socket を実装し, 自分以外が実行できないようにすることが今後の課題に挙げられる.
\item 今回用いた Perl6 の EVALFILE 自体にクライアント側に出力を返す実装追加することも今後の課題に挙げられる.
\item 現状の Raku の EVALFILE では, 出力がサーバー側に返っているので, クライアント側から出力を見るためにクライアント側に返す必要がある.
\item モジュールを送信する機能の追加
\item プログラムの実行終了したらモジュールを削除する機能の追加\\
\end{itemize}
%またscript言語をサーバー上で実行する場合の欠点については以下のようなものが見られる
%\begin{itemize}
%\item
%\end{itemize}
今後の開発を行っていくにあたって, 他の Python のような script 言語にも応用できるように開発を行っていく.