view Paper/chapter2.tex @ 19:7d8aa97ff754

update Paper
author e165727 <e165727@ie.u-ryukyu.ac.jp>
date Sun, 16 Feb 2020 13:28:38 +0900
parents 4c121d8b0354
children
line wrap: on
line source

\chapter{Raku の概要}

\section{Raku}
Raku は 2002 年に LarryWall が Perl を置き換える言語として設計を開始した. Perl5 の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された. Perl5 は設計と実装が同一であり, Larry らによって書かれた C 実装のみだった. 言語的な特徴としては, 独自に Raku の文法の拡張が可能な Grammar, Perl5 と比較した場合のオブジェクト指向言語としての進化も見られる. また Perl6 は漸進的型付け言語である. 従来の Perl の様に変数に代入する対象の型や, 文脈に応じて型を変更する動的型言語としての側面を持ちつつ, 独自に定義した型を始めとする様々な型に, 静的に変数の型を設定する事が可能である.
Raku は元々は Perl6 という名称であったが, 言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しない. 従って現在では Raku と Perl5 は別言語としての開発方針になっている. Raku は現在有力な処理系である Rakudo から名前を取り Raku という名前がつけられている.

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

\newpage
\section{Rakudo}
Rakudo とは Raku の現在の主流な実装である. (Raku は言語名, Rakudo はコンパイラ) \\
Raku は仕様と実装が明確に区分されており, Rakudo という実装, roast という Raku の仕様(テストスイートがある). \\
Rakudo は MoarVM, NQP と呼ばれる Raku のサブセット, NQPと Raku 自身で記述された Raku という構成である. \\
Rakudo は MoarVMの他に JVM やJava Script を動作環境として選択可能である.

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

\section{Rakudoの語源}
ちなみに Rakudo の語源は, 楽土と駱駝道で \\
楽土の方は日本語で「楽園」という意味で \\
駱駝道の方は Perlのマスコットキャラクターがラクダだったからである \\
%\ref{Perl6-rename}

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

MoarVM は NQP と Byte Code を解釈する. 

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

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

Rakudo における NQP は現在 MoarVM, JVM 上で動作する.
NQP は最終的には NQP 自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれた MoarVM のバイトコードを必要とする.
Raku の一部は NQP を拡張したもので書かれている為, Rakudo を動作させる為には MoarVM などの VM, VM に対応させる様にビルドした NQP がそれぞれ必要となる.
現在の NQP では MoarVM, JVM に対応する Stage0 はそれぞれ MoarVM のバイトコード, jarファイルが用意されている.

Perl6 のテストスイートであるRoastやドキュメントなどによって設計が定まっている Perl6 とは異なり NQP 自身の設計は今後も変更になる可能性が開発者から公表されている.
現在の公表されている NQP のオペコードは NQP のリポジトリに記述されているものである.
%\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がそれぞれ必要となる.

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

\newpage
\section{Raku と他言語との起動時間の比較}
Raku と他言語の起動時間の比較行なった.
題材として perl5, ruby, raku, python で helloworld を出力するプログラムを用いて行なった実行結果である.

\subsection{実行環境}
\begin{itemize}
\item macOS Mojave version 10.14.5
\item メモリ8GB
\item プロセッサ2.7GHz Intel Core i5
\end{itemize}

\subsection{起動時間の比較}
\begin{table}[H]
  \begin{center}
    \begin{tabular}{|l|l|l|} \hline
      Language& version & Time \\  \hline
      Raku & 2019.03.1& 249 ms \\
      Perl5 & v5.18.4 & 4 ms \\
      Python & 2.7.10 & 13 ms \\
      Ruby & 2.3.7p456 & 83 ms\\ \hline
    \end{tabular}
  \end{center}
  \caption{起動時間の比較}
\end{table}

Raku は 最も早いperl5 の約62.25倍, pythonの約19倍, rubyの約3倍起動速度が遅いことがわかる.