view Prepaper/pre.tex @ 22:b96b3244307b

update paper & slide
author e165727 <e165727@ie.u-ryukyu.ac.jp>
date Sun, 16 Feb 2020 18:20:36 +0900
parents e234acddcfab
children 27f7561b1135
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}

We use VR technologies in computer music game which competes with the musical performance of instruments. HMD (Head Mount Display) and LeapMotion (Hands Tracking Device) are used with UnrealEngine4 (UE4). In this game, bare hands work well in HMD reality without annoying controller in hands. We have solved interferences between hands and HMD visual using transparent display of hands.This game is implememted on UE4 BluePrints which is a visual programming language with wires and boxes. The effectiveness of convination of VR and LeapMotion in music game is confirmed.  

\end{onecolabstract}] \thispagestyle{fancy} 

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

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

%Raku のような言語に JITコンパイラを持ち, 起動時間が遅い PyPy などの言語がある.
本研究では, スクリプト言語 Raku の起動時間及び, 処理速度の改善を図り, 研究をするにあたり得られた, OS上で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しながら実行する.

\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を再利用し,投げられた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{まとめ}
Perl6スクリプトを投げて実行するサーバーの実装, および「自分でプロセス立ち上げてPerl6実行する手法」と「既にあるサーバーに投げてPerl6スクリプトを実行する手法」の差を測るために時間の計測を行った.


\section{今後の課題}

また今回例題として用いたものはスクリプト言語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}