view text/raku.tex @ 2:6056683ef01e

Modify the correct template.
author Kaito Okura <e175748@ie.u-ryukyu.ac.jp>
date Tue, 15 Sep 2020 01:12:57 +0900
parents
children 246b5d78aa68
line wrap: on
line source

\section{Rakuの概要}
\subsection{Raku}
Rakuは元はPerl5の後継言語のPerl6として開発されていたが, 言語仕様及び処理実装がPerl5と大幅に異なっており, 言語的な互換性が存在しない. 従って現在ではRakuとPerl5は別言語としての開発方針になっている. Rakuという名称は, 現在有力な処理系であるRakudoが由来となっている. \par
Rakuの起動は, MoarVMを起動, nqpをロード, Rakudoをロードもしくはコンパイルし, その後JITしながら実行する.

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

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

\subsection{NQP}
NQPとはNot Quite Perlの略でRakuのサブセットである. その為基本的な文法などはRakuに準拠しているが,変数を束縛で宣言するなどの違いが見られる. このNQPで記述されたRakuの事をRakudoと呼ぶ. \par
RakudoにおけるNQPは現在MoarVM, JVM上で動作する.NQPは最終的にはNQP自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれたMoarVMのバイトコードを必要とする. Rakuの一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM, VMに対応させる様にビルドしたNQPがそれぞれ必要となる.

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