view Prepaper/pre.tex @ 25:cde9c8f9b7e4 default tip

update slide
author e165727 <e165727@ie.u-ryukyu.ac.jp>
date Mon, 17 Feb 2020 04:11:41 +0900
parents 27f7561b1135
children
line wrap: on
line source

\documentclass[twocolumn,twoside,9.5pt]{jarticle}
\usepackage[dvipdfmx]{graphicx}
\usepackage{picins}
\usepackage{fancyhdr}
\usepackage{abstract}
\usepackage{here}
\usepackage{url}
\usepackage{listings,jlisting}
%\pagestyle{fancy}
\lhead{\parpic{\includegraphics[height=1zw,keepaspectratio,bb=0 0 251 246]{pic/emblem-bitmap.pdf}}琉球大学主催 工学部情報工学科 卒業研究発表会}
\rhead{}
\cfoot{}

\setlength{\topmargin}{-1in \addtolength{\topmargin}{15mm}}
\setlength{\headheight}{0mm}
\setlength{\headsep}{5mm}
\setlength{\oddsidemargin}{-1in \addtolength{\oddsidemargin}{11mm}}
\setlength{\evensidemargin}{-1in \addtolength{\evensidemargin}{21mm}}
\setlength{\textwidth}{181mm}
\setlength{\textheight}{261mm}
\setlength{\footskip}{0mm}
\pagestyle{empty}

\input{dummy.tex}
\renewcommand{\abstractname}{Abstract}
\begin{document}
\title{Rakuのサーバーを使った実行}
%\title{Supporting NAT in Screen Sharing System TreeVNC}
\author{165727F 氏名 {福田}{光希} 指導教員 : 河野 真治}
\date{}
\twocolumn [
\maketitle
\begin{onecolabstract}

In a script language that rewrites code frequently, we want to minimize the startup time.
As a method of this, I propose a method of launching a server process that continues to execute in the same host, transferring the file name to be executed to the compiler that has been started up on this server process, and compile on the server process.
I implemented Abyss Server in accordance with this proposed method.music game is confirmed.  

\end{onecolabstract}] \thispagestyle{fancy} 

\section{スクリプト言語の高速実行}
現在多くのスクリプト言語はインタプリタ型言語であり, 実行時にインタプリタの立ち上げ, モジュールを読み込み, スクリプトの解釈, スクリプトの実行 といったような処理を担っている.
これらの処理の中は事前に行うことで, より起動時間, 及び処理時間の短縮が予想される.

現在開発の進んでいる言語に スクリプト言語 Raku がある.
Raku は任意の VM が選択できるようになっており, 主に利用されている VM に C で書かれた MoarVM が存在する.
MoarVM は JIT コンパイルなどをサポートしているが, 全体的な起動時間及び処理速度が Perl5 や Python , Ruby などの他のスクリプト言語と比較し非常に低速である.
%Raku は MoarVM に基づくJIT コンパイラを持っており,コンパイルされた結果はプロセッサが実行可能な機械語に相当する.

%Raku のような言語に JITコンパイラを持ち, 起動時間が遅い PyPy などの言語がある.
本研究では, スクリプト言語 Raku の起動時間及び, 処理速度の改善を図り, 研究をするにあたり得られた, サーバー上でscript言語を実行する場合の利点と欠点について述べ, 今後の展望について記載する. 

また, その手法として同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し,サーバー上でコンパイルを行う手法を提案する.
著者らは, この提案手法に沿って『Abyss サーバー』を実装している.
\section{Raku}
Rakuは元はPerl5の後継言語のPerl6として開発されていたが,現在は名称が変更されRakuとなっている.
Rakuの現在の主流な実装はRakudoである.RakudoはMoarVM,とNQPと呼ばれるRakuのサブセット,NQPとRaku自身で記述されたRakuという構成である.
MoarVMはNQPとByte Codeを解釈する.

NQP とは Not Quite Perl の略で Raku のサブセットである.その為基本的な文 法などは Raku に準拠しているが,変数を束縛で宣言する などの違いが見られる.

このNQPで記述されたRakuの事をRakudoと呼ぶ.
RakudoはMoarVMの他にJVM,Javascriptを動作環境として選択可能である.

Rakuの起動は,MoarVMを起動,nqpをロード,Rakudoをロードもしくはコンパイルし,その後JITしながら実行する.

\section{MoarVM}
MoarVM は Raku に特化した VM である.C言語で実装されている. JITコンパイルなどが現在導入されているが,起動時間などが低速である問題がある. MoarVM 独自の ByteCode があり, NQP からこれを出力する機能などが存在している.

\section{NQP}
NQPとはRakuのサブセットである.
その為基本的な文法などはRakuに準拠しているが,変数を束縛で宣言するなどの違いが見られる.

NQPは最終的にはNQP自身でブートストラップする言語であるが,ビルドの最初にはすでに書かれたMoarvMByteCodeを必要とする.
このMoarVMByteCodeの状態をStage0と言う.
Rakuの一部はNQPを拡張したもので書かれている為,Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる.
NQPは与えられたStage0を使いStage1をビルドし,そのStage1を利用しStage2をビルドする事で生成できる.

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


\section{Abyssサーバー}
ここではAbyssサーバーについて説明する.AbyssサーバーはRakuで書かれている. クライアント側から投げられたRakuを実行するためのサーバーである.
図1はAbyssサーバーを用いたスクリプト言語実行手順である. AbyssサーバーはユーザーがRakuを実行する際,クライアント側から転送されてきたファイルを事前に起動してあるサーバー側が処理し,その実行結果を返す構造となっている.

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


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

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

%ファイルパスを受け取るとファイルパスをバッファーに変換し読み込む,その後読み込んだバッファーを文字列にデコードし,ファイルパスの文字列を読み込み,ファイルの中身を式として評価するEVALFILEを用いて,プログラムを実行する.
%Code1の2行目にあるMONKEY−SEE−NO−EVALはRaku上でEVALFILEを使用可能にするpragmaである.

%\lstinputlisting[label=codeseg,  caption=Abyssサーバーのsource code]{code/abyss.p6}
%\lstinputlisting[label=codeseg,  caption=クライアント側のsource code]{code/client.p6}
%通常、自分でプロセス立ち上げてPerl6を実行する際は,
%\section{問題点}


\section{Abyss Server の利点と欠点}

Abyss Server の利点には以下のようなものが挙げられる. 
\begin{itemize}
\item Abyss Serverを用いて実行することで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Raku スクリプトの実行を行うため, Rakudo の起動時間を短縮できる.
\item 一度投げられたスクリプトのバイトコード, もしくは計算結果をキャッシュで保存しておき, 再度実行する際に, そのキャッシュを用いてコンパイル時間を省くような仕組みを入れやすいと考えられる.
\item 他の起動時間遅いスクリプト言語や, モジュールの読み込みが遅い言語などにも, 応用しやすいと考えられる.
\item 普通のスクリプト言語だと実行するたびにforkして実行しインタプリタの立ち上げという処理になるが, プロセス毎回起動しなくて済む
\end{itemize}

Abyss Server の欠点は以下のようなものが挙げられる.
\begin{itemize}
\item 現在 Abyss Server には 一度スクリプトを実行した後にサーバー内の環境をリセットする機能が存在しないため,スクリプトがサーバー内の環境に影響を及ぼした場合,通常実行と違う挙動をする危険性がある
\item 同時に二つ以上のタスクを与えられると実行順のスケジューリングができない
\item 異常に長いタスクが投げられた場合, 次のタスクが前のタスクが終わるまで実行ができない
\item 起動時のオプションが選択出来ない
\item Client側を Raku で書いてしまうとファイルパスを送信する際に Raku を起動することになるので, 起動時間が通常実行よりかかってしまう
\end{itemize}

\section{スクリプト言語の最適な実行方法}
またOS上でスクリプト言語を実行する際に, OS側で用意されてあるべきAPIとしては以下のようなものが挙げられる
\begin{itemize}
\item 提案手法のように一度立ち上げられたインタプリタを立ち上げたままにする
\item 複数回投げられたスクリプトの実行結果もしくは スクリプトの basic block を保存できる
\item モジュールをRuntimeでロードする
\item 実行するスクリプトの周りにあるJsonファイルをあらかじめParseしておく
\end{itemize}

\section{今後の課題}
また今回例題として用いたものはスクリプト言語Rakuであったが,その他のスクリプト言語にも応用が利くかどうか検討する必要はある


\section{まとめ}
Raku スクリプトを投げて実行するサーバーの実装, および「自分でプロセス立ち上げてPerl6実行する手法」と「既にコンパイラを起動してあるサーバーに投げてPerl6スクリプトを実行する手法」の差を測るために時間の計測を行った.
Raku を通常実行した場合は0.217s, Client側をperl5で書いた場合 0.026s, Client側を Rakuで書いた場合 0.923s となり
Client 側を Perl5 で 書きAbyss Server を使った場合が最も早い結果となった.

%またPerl6の機能としてevalfiel があるが現状出力がサーバー上に返ってしまい
%手元に返ってこないので、evalfileの実装を出力が手元に返ってくるように書き換える必要がある
\begin{thebibliography}{9}
  \bibitem{キー1} Andrew Shitov. Perl6 Deep Dive
  \bibitem{キー2} 清水隆博, 河野真治. CbC を用いた Perl6 処理系. 琉球大学工学部情報工学科平成 30 年度学位論文 (学士), 2018.
  \bibitem{キー3}  Perl6 Documentation\\{https://docs.perl6.org} (2019/10/22 アクセス)
\end{thebibliography}



\nocite{*}
\bibliographystyle{junsrt}
\bibliography{reference}
\end{document}