# HG changeset patch # User anatofuz # Date 1550558094 -32400 # Node ID 28030986f575c5a46cba7460ea1cee54695649a8 # Parent f12222e300431dc6a1a77f3608c2616ffd6b3816 update diff -r f12222e30043 -r 28030986f575 prepaper/finalpre.pdf Binary file prepaper/finalpre.pdf has changed diff -r f12222e30043 -r 28030986f575 prepaper/finalpre.tex --- a/prepaper/finalpre.tex Tue Feb 19 15:18:18 2019 +0900 +++ b/prepaper/finalpre.tex Tue Feb 19 15:34:54 2019 +0900 @@ -65,23 +65,27 @@ MoarVM is going to implemented in C language, it can be rewritten in CbC. In this thesis, consider rewriting the instruction dispatch part of MoarVM with CbC. -We successfully MoarVM writtern in CbClang. -CbC is faster than Original MoarVM has CPU cash. +We successfully writtern MoarVM in CbC. +When an instruction executed by CbC enters the CPU cache, it runs faster than the original MoarVM. \end{onecolabstract}] \thispagestyle{fancy} \section{Perl6の現在の実装} -現在開発が進んでいるプログラミング言語 Perl6 は、 入力されたソースコードを複数の仮想機械で実行可能なバイトコードにコンパイルする。 -仮想機械はPerl6専用のVMである、 MoarVMと、 JVMが選択可能である。 -MoarVMで動作する主流なPerl6の実装に、 Rakudoがある。 +現在開発が進んでいるプログラミング言語にPerl6がある。 +Perl6は、 入力されたソースコードを複数の仮想機械で実行可能なバイトコードにコンパイルする。 +コンパイルされたバイトコードは、 Perl6専用のVMであるMoarVMやJavaVMが評価する。 +MoarVMで動作する主流なPerl6の実装に、Rakudoがある。 -Rakudo実装のPerl6は、 他スクリプト言語と比較すると、 実行速度が低速である。 -また、 MoarVMの実装が巨大なcase文が使用されており、 モジュール化が行われていない。 +RakudoそのものはPerl6のサブセットであるNQPで実装されている。 +RakudoやNQPが動作するMoarVMはC言語で実装されている。 バイトコードから仮想機械を動作させる際、 バイトコード中のバイト列から、 実行する命令の処理を取得する必要がある。 +この部分の実装が巨大なcase文やラベルgotoが使用されており、 モジュール化が行われていない。 +モジュール化を行うことで、 それぞれに対して最適化を行うことが可能となる。 +このモジュール化では、 Cの関数より小さな単位であるCbCが適していると考えられる。 +その為、 本研究では、 MoarVMの命令対応部分のモジュール化の検討を行う。 %今後この部分を改善し、 速度向上をめに、 命令そのものを巨大なcase文から分離し、 モジュール化するのが望ましい。 -%その為、 本研究では、 MoarVMの命令対応部分のモジュール化の検討を行う。 \section{CbC} Perl6処理系の改良には、 gccとLLVM/Clang上に実装した、 Continuation based C(CbC)を用いる。 @@ -125,7 +129,6 @@ この一連の処理を命令コードのディスパッチと呼ぶ。 命令コードの実行の中では、 現在のMoarVMのレジスタであるreg\_baseやスレッドごとの環境である構造体tcなどを参照する。 この方法の問題点として、 巨大なcase文に変換されてしまう事から、 命令に対応する処理のモジュール化が出来ない。 -ディスパッチ部分の処理が都度走る為に、 低速になる。 ラベルにbreak pointを設定できない為に、 デバッグし辛いなどが挙げられる。 \lstinputlisting[label=origdis, caption=MoarVM内のインタプリタのディスパッチ]{src/dispatch.c}