# HG changeset patch # User Takahiro SHIMIZU # Date 1541985076 -32400 # Node ID 5c8e88841a30ec80073b3960f4c5945b126c62c8 # Parent 2964605b812fa90f85868c1140ae14e4461ab171 fix pic path and remove about moarvm diff -r 2964605b812f -r 5c8e88841a30 cbc_codesegs.cbc --- a/cbc_codesegs.cbc Fri Nov 09 22:20:47 2018 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -__code cbc_no_op(INTERP i){ - goto cbc_next(i); -} -__code cbc_const_i32(INTERP i){ - MVM_exception_throw_adhoc(i->tc, "const_iX NYI"); - goto cbc_const_i64(i); -} -__code cbc_const_i64(INTERP i){ - GET_REG(i->cur_op, 0,i).i64 = MVM_BC_get_I64(i->cur_op, 2); - i->cur_op += 10; - goto cbc_next(i); -} diff -r 2964605b812f -r 5c8e88841a30 cbc_example.cbc --- a/cbc_example.cbc Fri Nov 09 22:20:47 2018 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -int main (){ - int data = 0; - goto cg1(&data); -} - -__code cg1(int *datap){ - (*datap)++; - goto cg2(datap); -} - -__code cg2(int *datap){ - (*datap)++; - printf("%d\n",*datap); -} diff -r 2964605b812f -r 5c8e88841a30 cbc_next.pdf Binary file cbc_next.pdf has changed diff -r 2964605b812f -r 5c8e88841a30 mid_thesis.pdf Binary file mid_thesis.pdf has changed diff -r 2964605b812f -r 5c8e88841a30 mid_thesis.tex --- a/mid_thesis.tex Fri Nov 09 22:20:47 2018 +0900 +++ b/mid_thesis.tex Mon Nov 12 10:11:16 2018 +0900 @@ -68,12 +68,12 @@ Perl6処理系の改良にはgccとLLVM/Clang上に実装したContinuation based C(CbC)を用いる. CbCはCodeGearを基本的な処理単位とし,CodeGearの遷移でプログラムを記述するCの下位言語である. CodeGearの宣言は\_\_codeという型を持つ関数として宣言する. -ただしこの関数は\_\_codeという型を返すわけではなく,CodeGearである事を示す指示子のような役割である. +\_\_codeは内部的にはvoid型として扱っているが,プログラマからの扱いはCodeGearである事を示す指示子のような役割である. CodeGearはCの関数とは異なり返り値を持たず,呼び差し元の関数に戻る代わりに別のCodeGearへ遷移する. CbCにおけるCodeGear間の継続はスタックに値を積まず,環境も遷移時に持たない為軽量継続と呼ぶ. CbCは軽量継続を中心にプログラミングする事が可能であるため,レジスタの移動などが行われない. その為並列化やループ制御,関数呼び出しにおけるスタック制御などを意識したプログラミングスタイルでプログラミングする事が可能である. -\lstinputlisting[label=cbcexample, caption=cbc\_example.cbc]{cbc_example.cbc} +\lstinputlisting[label=cbcexample, caption=cbc\_example.cbc]{src/cbc_example.cbc} @@ -106,22 +106,16 @@ Perl6の一部はNQPを拡張したもので書かれている為,Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる. NQPは与えられたStage0を使いStage1をビルドし,そのStage1を利用しStage2をビルドする事で生成できる. +% IT図をいれる -\section{MoarVM} -MoarVMはPerl6のVMであり,Rakudoプロジェクトとして開発されているVMである. -このVMはOSレベルの仮想化を行うVMではなく,擬似的なアセンブラを解釈するソフトウェアとしての擬似機械のことである. -MoarVMはC言語で実装されておりPerl6に特化した仮想機械となっている. -MoarVMは個別で起動することが出来ず,NQPもしくはPerl6をMoarVMに入力として与え実行する. -またMoarVMはレジスタマシンであり仮想的なレジスタ利用し計算を行う. \section{MoarVMのディスパッチ} MoarVMはNQPから変換されたバイトコードを読み取り,都度実行する. -MoaRVMの場合この処理はMVM\_interp\_runという関数で行われている. +MoarVMの場合この処理はMVM\_interp\_runという関数で行われている. この関数内ではMoarVMが実行すべき命令が並んだ命令列を持ち,その値で巨大なcase文,またはCのラベルジャンプによって分岐させる. 分岐後は命令に応じた処理をMoarVMが行い,次の命令を実行する. -次の命令に遷移する為には,現在の命令列から,実行した命令の長さ分プログラムカウンタの様な変数をインクリメントする. -インクリメント後の命令列が指す値を,実行すべき命令として設定し,その値がなんであるかを読み取る. -読み取りが終了後,再びswitch文,またはラベルジャンプでその処理へと遷移する. +分岐後は命令にごとの処理を実行し,現在の命令列から,実行した命令の長さ分命令列を進める. +進めた後にcase文の先頭もしくはCのラベルジャンプを利用して次の処理に遷移する. これを命令コードのディスパッチと呼ぶ. 命令コードの実行の中では,現在のMoarVMのレジスタであるreg\_baseやスレッドごとの環境である構造体tcなどを参照する. この方法の問題点として,巨大なcase文になっている為命令列の分割が出来ない. @@ -131,19 +125,15 @@ \section{CbCMoarVMのディスパッチ} 本研究ではMoarVMは2018.04.01のバージョンで実装している. -命令コードの実行すべき単位はCbCのCodeGearの単位として見れる. -その為この処理を命令ごとCodeGearとして変換する. -この変換作業は莫大である為PerlScriptなどを用いて自動化している. -変換されたCodeGearはオリジナルのMoarVMの命令コードと対応させる為に -CodeGearの配列に格納する. +命令コードの実行すべき単位はCbCのCodeGearの単位として扱える為命令処理をCodeGearに変換する. +変換されたCodeGearはオリジナルのMoarVMの命令コードと対応させる為にCodeGearの配列に格納する. MoarVMはこの配列を参照し,要素として得られるCodeGearに軽量継続を行う. -CodeGearでの処理が終了すると,次のCodeGearを決定する為に必要な計算をcbc\_nextというCodeGearで行う. -cbc\_nextで次の遷移先が決定すると,そのCodeGearに軽量継続を行う.CbCMoarVMではこれを繰り返す. -\lstinputlisting[label=codeseg, caption=CbCMoarVM内のインタプリタの状態遷移]{cbc_codesegs.cbc} +CodeGearでの処理が終了すると,次のCodeGearを決定する為に必要な計算をcbc\_nextというCodeGearで行い,次の命令列に軽量継続する. +\lstinputlisting[label=codeseg, caption=CbCMoarVM内のインタプリタの状態遷移]{src/cbc_codesegs.cbc} \begin{figure}[ht] \begin{center} - \includegraphics[width=70mm]{cbc_next.pdf} + \includegraphics[width=70mm]{pic/cbc_next.pdf} \end{center} \caption{CbCにおけるMoarVMバイトコードインタプリタ内の状態遷移} \label{fig:perl6cbcinter} diff -r 2964605b812f -r 5c8e88841a30 pic/cbc_next.pdf Binary file pic/cbc_next.pdf has changed diff -r 2964605b812f -r 5c8e88841a30 src/cbc_codesegs.cbc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cbc_codesegs.cbc Mon Nov 12 10:11:16 2018 +0900 @@ -0,0 +1,12 @@ +__code cbc_no_op(INTERP i){ + goto cbc_next(i); +} +__code cbc_const_i32(INTERP i){ + MVM_exception_throw_adhoc(i->tc, "const_iX NYI"); + goto cbc_const_i64(i); +} +__code cbc_const_i64(INTERP i){ + GET_REG(i->cur_op, 0,i).i64 = MVM_BC_get_I64(i->cur_op, 2); + i->cur_op += 10; + goto cbc_next(i); +} diff -r 2964605b812f -r 5c8e88841a30 src/cbc_example.cbc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cbc_example.cbc Mon Nov 12 10:11:16 2018 +0900 @@ -0,0 +1,16 @@ +extern int printf(const char*,...); + +int main (){ + int data = 0; + goto cg1(&data); +} + +__code cg1(int *datap){ + (*datap)++; + goto cg2(datap); +} + +__code cg2(int *datap){ + (*datap)++; + printf("%d\n",*datap); +} diff -r 2964605b812f -r 5c8e88841a30 src/dispatch.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dispatch.c Mon Nov 12 10:11:16 2018 +0900 @@ -0,0 +1,25 @@ + DISPATCH(NEXT_OP) { + OP(no_op): + goto NEXT; + OP(const_i8): + OP(const_i16): + OP(const_i32): + MVM_exception_throw_adhoc(tc, "const_iX NYI"); + OP(const_i64): + GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); + cur_op += 10; + goto NEXT; + OP(pushcompsc): { + MVMObject * const sc = GET_REG(cur_op, 0).o; + if (REPR(sc)->ID != MVM_REPR_ID_SCRef) + MVM_exception_throw_adhoc(tc, "Can only push an SCRef with pushcompsc"); + if (MVM_is_null(tc, tc->compiling_scs)) { + MVMROOT(tc, sc, { + tc->compiling_scs = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); + }); + } + MVM_repr_unshift_o(tc, tc->compiling_scs, sc); + cur_op += 2; + goto NEXT; + } + }