view Paper/anatofuz.tex @ 11:ea10413281c5

tweak Makefile and create reference.bib
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Tue, 06 Nov 2018 14:17:41 +0900
parents 9c172999d70e
children 02ae2227d0a3
line wrap: on
line source

% withpage: ページ番号をつける (著者確認用)
% english: 英語原稿用フォーマット
\documentclass{ipsjprosym}
%\documentclass[withpage,english]{ipsjprosym}

\usepackage[dvipdfmx]{graphicx}
\usepackage{latexsym}
\usepackage{comment}
\usepackage{url}
\begin{document}

% Title, Author %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title{CbCを用いたPerl6処理系}

%\affiliate{IPSJ}{情報処理学会}
\affiliate{IERYUKYU}{琉球大学工学部情報工学科}

\author{清水 隆博}{Takahiro SHIMIZU}{IERYUKYU}[anatofuz@cr.ie.u-ryukyu.ac.jp]
\author{河野 真治}{Shinji KONO}{IERYUKYU}[kono@ie.u-ryukyu.ac.jp]

%概要
\begin{abstract}
スクリプト言語であるPerl5の後継言語としてPerl6が現在開発されている.
Perl6は設計と実装が区分されており様々な処理系が開発されている.現在主流なPerl6はRakudoと言われるプロジェクトである.
RakudoではPerl6自体をNQP(NotQuitPerl)と言われるPerl6のサブセットで記述し,NQPをVMが解釈するという処理流れになっている.
このVMは任意のVMが選択できるようになっており,現在はMoarVM,JavaVM,Javascriptが動作環境として選択可能である.
主に利用されているVMにCで書かれたMoarVMが存在する.
MoarVMはJITコンパイルなどをサポートしているが,全体的な起動及び処理速度がPerl5と比較し非常に低速である.
この問題を解決するためにContinuation based C (CbC)という言語を一部用いる.
本論文ではMoarVMの一部をCbCを用いて書き直し,実際にどのようなパフォーマンスが出るかを報告する.


\end{abstract}

\begin{jkeyword}
プログラミング言語, コンパイラ, CbC, Perl6, MoarVM
\end{jkeyword}

\maketitle

% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{研究目的}
現在も広く使われているスクリプト言語PerlことPerl5の後継言語としてPerl6が開発されている.
Perl6は設計と実装が区分されており,現在広く使われている実装はRakudoと呼ばれるプロジェクトである.
Rakudoの実装はPerl6コンパイラ開発者用のサブセットであるNQP(NotQuitPerl)で実装されているPerl6の事を指す.
現在RakudoはNQPを解釈できる実行環境として,C言語で実装されたMoarVM,JVM,Javascript上で動作する様に開発されている.
Rakudoとして主に使われている処理系はMoarVMであるが,MoarVMの処理時間がPerl5などの多くのスクリプト言語と比較し非常に低速である.
その為現在日本国内ではPerl6を実務として利用するケースは概ね存在しない.
この問題を解決するために現在当研究室で開発しているContinuation Based C(以下CbC)を用いて改良を行う.
CbCはCよりさらにきめ細やかな記述が可能であるためスクリプト言語などのプログラミング言語の記述と親和性が高い事が推測される.
故に本研究はCbCをスクリプト言語の実装に適応した場合,どのような利点やプログラミング上の問題点に遭遇するかCbCの応用としての側面でも行う.
本稿ではまずCbC,Perl6の特徴及び現在の実装について述べ,次に改良を行うMoarVMの一連の処理流れについて述べる.
そして今回改良した一部分と今後の展開について記す.

\section{CbC}
\subsection{CbCの概要}
CbCは当研究室で開発しているプログラミング言語である.


\subsection{現在の実装}
CbCは現在主要なCコンパイラであるgcc及びllvmをバックエンドとしたclang上の2種類の実装が存在する.
これらは内部的に与えられているソースコードがCbCであるかどうかを判断し,そうでない場合は通常のコンパイラとして動作する.
その為MoarVMのビルドにおいてもCbCで書き換えたソースコードがあるターゲットと,手を加えていないオリジナルのターゲットの2種類を同一のコンパイラでビルドする事が可能である.

\subsection{CbCとCの互換性}


\section{Perl6の概要}
この章では現在までのPerl6の遍歴及びPerl6の言語的な特徴について記載する.
\subsection{Perl6の構想と初期の処理系}
Perl6は2002年にLarryWallがPerlを置き換える言語として設計を開始した.
Perl5の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された.
Perl5は設計と実装が同一であり,Larryらによって書かれたC実装のみだった.Perl6は設計と実装が分離しており様々な処理系が開発されきた.
まず2005年に唐鳳によってHaskellで実装されたPugs\footnote{http://hackage.haskell.org/package/Pugs}が登場した.
Pugsは最初に登場したPerl6実装であり,この実装を基にしてPerl6の仕様も修正された.
現在Pugsは歴史的な実装となっており,更新はされていない.

\subsection{Parrot}
その後Pythonとの共同動作環境としてParrot\footnote{http://parrot.org/}が実装された.
ParrotはPASMと呼ばれるバイトコードを解釈可能なレジスタマシンである.
ParrotでのPerl6の実装はNQP(NotQuitPerl)と呼ばれるPerl6のサブセットでPerl6を記述するというアイディアの基実装された.
ParrotVMは2006年のversion8.1.0が最後のリリースである.
こちらもPugsと同様に現在のPerl6プロジェクトでは歴史的な実装とされている.
現在主に使用されている実装であるRakudoは2010年にRakudo-Starという一連のツール郡としてリリースされた.
Perl6処理系自体は現在も未完成であり,Perl6プロジェクトとして提供しているテストリポジトリ「Roast」\footnote{https://github.com/perl6/roast}で定義されているテストケースを完全に通化する処理系は現在未だ存在しない.

Perl6は言語仕様及び処理実装がPerl5と大幅に異なっており,言語的な互換性が存在しない.
従って現在ではPerl6とPerl5は別言語としての開発方針になっている.
Perl6は現在有力な処理系であるRakudoから名前を取り\texttt{Raku}という言語名に変更しようという動きが一部存在している.

\subsection{Rakudo}

RakudoとはParrotで構想に上がったNQP,NQPに基づくPerl6を基にしたプロジェクトである.
RakudoがPerl6のコンパイラかつインタプリタであると考えても良い.
Rakudoの構成はNQPで記述されたPerl6,NQP自身,そしてNQPを解釈するVMという構成である.
このVMは現在MoarVM,JavaVM,Javascript,GraalVMを選択可能である.
NQPで書かれたPerl6のことをRakudoと呼ぶ.
RakudoStarとはこのMoarVM,NQP,Perl6が一体となったパッケージの事である.

\subsection{NQP}
RakudoにおけるNQP\footnote{https://github.com/perl6/nqp}は現在MoarVM,JVM上で動作し,MoarVMを一部利用することでNodeJSからも動作させる事が可能である.
NQPはPerl6のサブセットであるため主な文法などはPerl6に準拠しているが幾つか異なる点が存在する.
NQP自身はStage0と呼ばれる名前空間上のモジュールのみ動作環境のVMのバイトコードを必要とするが,それ以外はNQPで記述されておりBootstrappingされている言語である.
その為Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる.
現在のNQPではMoarVM,JVMに対応するStage0はそれぞれMoarVMbytecode,jarファイルが用意されており,Javascriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている.
MoarVMのModuleLoaderはStage0あるMoarVMbytecodeで書かれた一連のファイルが該当する.

Stage0にあるファイルはNQPのコンパイラの構成要素そのものである.
NQPは6modelと呼ばれるオブジェクトモデルを採用としているが,これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがmoarvmbytecodeで記述されている.これらMoarVMBytecodeの拡張子は.moarvmである.
MoarVMに対してStage0のディレクトリにライブラリパスを設定し,nqp.moarvmを実行させることでnqpの対話型環境が起動する.

実際にperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にstage0を利用してStage1をビルドしNQPコンパイラを作成する.

Roastやドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている.
現在の公表されているNQPのオペコードはNQPのGitHubリポジトリ\footnote{https://github.com/perl6/nqp/blob/master/docs/ops.markdown}に記述されているものである.


\subsection{Rakudo Perl6}
Rakudo実装上におけるPerl6はRakudo Perl6と呼ばれているGitリポジトリで管理されているプログラムのことである.
前述した通りRakudo Perl6はPerl6のサブセットであるNQPを用いて記述されている.
従ってyaccやlexと言ったPerl5の文字解析,構文解析に利用していたプログラムは利用せず,NQP側で構文定義などを行っている.
NQPはNQP自身でBootstrappingされている為,Rakudo Perl6のbuild時にはNQPの実行環境として要したVM,それに基づいてbuildしたNQPがそれぞれ必要となる.

言語的な特徴としてはPerl5とは違いアトミックに演算を行う事が可能なatom演算子や,すべてがオブジェクトであるオブジェクト指向言語としての進化も見られる.



\section{CbCによるMoarVM}
この章では改良を行ったPerl6処理系であるMoarVMについて述べる. \cite{perl6doc}
\subsection{CbCコンパイラによるバグ}

\section{CbCを用いる事についての評価}
Perl6処理系はまずPerl6の豊富な文法に対応する物を作成せねばならず,類似する他のプログラミング言語処理系と比較してもより複雑となっている.
実際にPerl5を始めとしたスクリプト言語とPerl6がどのような処理時間の違いが見られるかを実測する.


% \subsection{単純なループ処理の測定}
% 簡単な例題としてfor文を用いて100000回ループさせ,ある変数をインクリメントするというプログラムを作成する.
% 今回の評価対象としてPerl6は2018年4月にリリースされたMoarVM,NQP,Rakudoの実装を用いる.
% Perl5は5.26.2を利用した.
% 
% \begin{table}[htb]
% 	\begin{tabular}{|c|c|c|} \hline
% 	 ループ回数 & Perl5 (sec) & Perl6(sec) \\  \hline \hline	 
% 	 1000000 & 0.131 & 1.444 \\ \hline
% 	 10000000 & 0.131 & 1.444 \\ \hline
% 	 100000000 & 3.258 & 124.69 \\ \hline
% 	\end{tabular}
% \end{table}


\section{今後の課題}

\section{まとめ}


%å\subsection{MoarVMの処理流れ}
%MoarVMはC言語で実装されており,Perl5で記述されたConfigure.plを


\begin{acknowledgment}
謝辞が必要であれば,ここに書く.
\end{acknowledgment}

% BibTeX を使用する場合 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\nocite{*}
 \bibliographystyle{ipsjsort}
 \bibliography{reference}

% BibTeX を使用しない場合
%\begin{thebibliography}{9}
%\bibitem{latex} 奥村晴彦, 黒木裕介: \textbf{LaTeX2e美文書作成入門}. 技術評論社, 2013.
%\end{thebibliography}

\end{document}