view text/raku.tex @ 14:9b3f9bff4911

copletion.
author Kaito Okura <e175748@ie.u-ryukyu.ac.jp>
date Tue, 15 Sep 2020 16:19:40 +0900
parents 077fb40023ba
children
line wrap: on
line source

\section{プログラミング言語Raku}
Rakuは元はPerl5の後継言語のPerl6として開発されていたが, 言語仕様及び処理実装がPerl5と大幅に異なっており, 言語的な互換性が存在しない.
従って現在ではRakuとPerl5は別言語としての開発方針になっている.
Rakuという名称は, 現在有力な処理系であるRakudoが由来となっている.

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


RakudoとはRakuの現在の主流な実装である. (Rakuは言語名, Rakudoはコンパイラ)
Rakuは仕様と実装が明確に区分されており, Rakudoという実装, roastというRakuの仕様 (テストスイートがある).

Rakudoの構成は, MoarVMと呼ばれるRakudoのために構築されたVM, NQPと呼ばれるRakuのサブセット, NQPとRaku自身で記述されたRakuである.
RakudoはMoarVMの他にJVMやJavaScriptを動作環境として選択可能である.


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

MoarVMはNQPとByteCodeを解釈する.


NQPとはNot Quite Perlの略でRakuのサブセットである.
その為基本的な文法などはRakuに準拠しているが,変数を束縛で宣言するなどの違いが見られる.
このNQPで記述されたRakuの事をRakudoと呼ぶ.

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


通常, Rubyのようなスクリプト言語ではまずVMが起動し, その後スクリプトをバイトコードに変換して実行という手順を踏む.

対してRakuは, コンパイラのRakudo自体がRakuとNQPで書かれているため, MoarVMを起動し, RakudoとNQPのバイトコードを読み取り, Rakudoを起動し, その後スクリプトをバイトコードに変換して実行という手順を踏む.

そのため, Rakudoはインタプリタの起動時間及び、全体的な処理時間が他のスクリプト言語と比較して非常に低速である.

また, Rakuは実行時の情報が必要であり, メソッドを実行する際にinvokeが走ることも遅い原因である.
invokeはMoarVMのmethod呼び出しのバイトコードである.

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