view midterm/midterm.tex @ 3:84b10c91ca43 default tip

提出ずみ中間予稿
author Fukuda Kouki <k.fukuda@cr.ie.u-ryukyu.ac.jp>
date Wed, 23 Oct 2019 17:04:02 +0900
parents 10b5e6b8583d
children
line wrap: on
line source

\documentclass[twocolumn,twoside,9.5pt]{jarticle}
\usepackage[dvipdfmx]{graphicx}
\usepackage{picins}
\usepackage{fancyhdr}
\usepackage{url}
\usepackage{bussproofs}
\usepackage{listings,jlisting}
\usepackage{cite}
\usepackage{here}
\lhead{\parpic{\includegraphics[height=1zw,keepaspectratio,bb=0 0 251 246]{./images/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}
\renewcommand{\lstlistingname}{Code}

\lstset{
  frame=single,
  keepspaces=true,
  breaklines=true,
  xleftmargin=0zw,
  xrightmargin=0zw,
  framerule=.2pt,
  columns=[l]{fullflexible},
  language={},
  tabsize=4,
  lineskip=-0.5zw,
  escapechar={@},
}


\begin{document}
\title{Raku(Perl6) のサーバーを使った高速実行 \\
Running Raku using Raku server}
\author{165727F 氏名: 福田 光希 指導教員: 河野 真治}
\date{2019/10}
\maketitle

\thispagestyle{fancy}

\section{スクリプト言語の高速実行}

スクリプト言語RakuはMoarVMというVM上で動作するが,起動時間がPerl5やPython,Rubyなどの主要なスクリプト言語に比べて非常に低速である.この問題を解決するために,Rakuプログラムの,サーバーを用いた実行手法の提案を行う.
ここでいうサーバーとは転送したスクリプトを実行する環境のことである.

またサーバーでは,サーバーに投げられたRakuをコンパイラで実行する際に,そのスクリプトが次に実行するスクリプトに影響を与えないことを保証する必要がある.
この問題を解決するために,サーバーのコンテナ化を行う.

\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しながら実行する.

\begin{figure}[H]
     \begin{center}
     \includegraphics[width=80mm]{images/Raku.pdf}
     \end{center}
     \caption{Rakuの構成}
    \label{fig:perl6cbcinter}
\end{figure}

\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を起動した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である.
現状のRakuのEVALFILEでは,出力がサーバー側に返っているので,クライアント側から出力を見るためにクライアント側に返す必要がある.

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

\section{まとめ}
中間予稿までにPerl6スクリプトを投げて実行するサーバーの実装、および「自分でプロセス立ち上げてPerl6実行する手法」と「既にあるサーバーに投げてPerl6スクリプトを実行する手法」の差を測るために時間の計測を行った。

今回実装したサーバーでは,別のスクリプトを実行する前にサーバーのコンテナ化をできていないので次回以降の課題とする.
今回の実装ではTCPソケットを用いたがTCPソケットを用いるとサーバーを立ち上げた際に外部からファイルを転送される可能性があるので,Unix domain socketの実装を行い,それを用いたクライアント・サーバーを作成することで安全性が高まると考えた
Rakuには現状Unix domainソケットの実装がないので、Unix domainソケットを実装し、自分以外が実行できないようにすることが今後の課題に挙げられる.
また今回例題として用いたものはスクリプト言語Rakuであったが,その他のスクリプト言語にも応用が利くかどうか検討する必要はある

今回用いたRakuのEVALFILE自体にクライアント側に出力を返す実装追加することも今後の課題に挙げられる.

%また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}