view Paper/chapter3.tex @ 15:e2d2da777af0

update Slide & add NativeCall section
author e165727 <e165727@ie.u-ryukyu.ac.jp>
date Sat, 15 Feb 2020 19:33:39 +0900
parents 06fcc4caf38d
children ce4e57fe652c
line wrap: on
line source

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

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

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

\section{Abyss Server側の実装}
[\ref{Server}]はAbyss サーバーのソースコードである.
Abyssサーバーは起動すると, まず自身にファイルパスを転送するためのソケットを生成し, その後ファイルパスを受け取り実行して . 出力結果をソケットに書き込む

\lstinputlisting[label=Server,  caption= Abyss Server側の source code ]{code/abyss.p6}

\section{Abyss Client側の実装}
ユーザーは Abyss Server を起動後, Client側からファイルパスをサーバーに送信し, [\ref{Client}]のようにSocketに書き込まれた実行結果を読み取る.

\lstinputlisting[label=Cient,  caption=Abyss Client側の source code ]{code/client.p6}


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

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

[\ref{Server}] の2行目にある MONKEY−SEE−NO−EVAL は Perl6 上で EVALFILE を使用可能にする pragma である.

\lstinputlisting[label=code3,  caption=evalのサンプルコード]{code/eval.p6}
%通常、自分でプロセス立ち上げてPerl6を実行する際は,

\section{NativeCall}
Rakuでは Native Call という標準ライブラリを用いて, Cのライブラリを扱うことが可能である.

以下に[\ref{Server}]で使用されているCのライブラリの解説を記す
\begin{itemize}
\item dup(int fd) - dup() は引数で指定したファイルディスクリプタを複製して, 未使用のファイルディスクリプタから最小番号を割り当てます
\item dep2(int newfd, int oldfd) - dup2() は oldfd を newfd に関連づけます.
\item close(int fd) - close() は指定されたfile descreptorを閉じます.
\end{itemize}

\section{通常実行との速度比較}
今回は,提案手法での実行速度と通常実行での実行速度, この二つの速度の比較を行う
題材として行うのはhelloworldを出力するだけのプログラムとフィボナッチ数列の例題である.

実験結果
\begin{table}[H]
  \begin{center}
    \begin{tabular}{|l|l|} \hline
      Language& Time \\  \hline
      通常実行 & 0.2695 sec \\
      提案手法 & 0.0238 sec \\ \hline
    \end{tabular}
  \end{center}
  \caption{通常実行と提案手法の速度比較}
\end{table}
提案手法は通常実行に比べて約10倍早い実行結果になった