# HG changeset patch # User Takahiro SHIMIZU # Date 1541999564 -32400 # Node ID e35adb402a6a1d708951305dc6bf9b50ad0f6dc7 # Parent 5c8e88841a30ec80073b3960f4c5945b126c62c8 update diff -r 5c8e88841a30 -r e35adb402a6a Makefile --- a/Makefile Mon Nov 12 10:11:16 2018 +0900 +++ b/Makefile Mon Nov 12 14:12:44 2018 +0900 @@ -18,6 +18,7 @@ $(BIBTEX) $(TARGET) $(LATEX) $< $(LATEX) $< + cp $(TARGET).pdf 155730B_mid_thesis.pdf .dvi.pdf: $(DVIPDF) $(DVIPDF_OPT) $< diff -r 5c8e88841a30 -r e35adb402a6a mid_thesis.pdf Binary file mid_thesis.pdf has changed diff -r 5c8e88841a30 -r e35adb402a6a mid_thesis.tex --- a/mid_thesis.tex Mon Nov 12 10:11:16 2018 +0900 +++ b/mid_thesis.tex Mon Nov 12 14:12:44 2018 +0900 @@ -106,6 +106,10 @@ Perl6の一部はNQPを拡張したもので書かれている為,Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる. NQPは与えられたStage0を使いStage1をビルドし,そのStage1を利用しStage2をビルドする事で生成できる. +\section{MoarVM} +MoarVMはPerl6に特化したVMである.C言語で実装されている. +JITコンパイルなどが現在導入されているが,起動時間などが低速である問題がある. +MoarVM独自のByteCodeがあり,NQPからこれを出力する機能などが存在している. % IT図をいれる @@ -122,6 +126,7 @@ ディスパッチ部分の処理が都度走る為低速になる. Cファイルでの可読性とモジュール化が損なわれてしまう. ラベルにbreak pointを設定できない為デバッグし辛いなどがあげられる. +\lstinputlisting[label=origdis, caption=MoarVM内のインタプリタのディスパッチ]{src/dispatch.c} \section{CbCMoarVMのディスパッチ} 本研究ではMoarVMは2018.04.01のバージョンで実装している. @@ -133,12 +138,19 @@ \begin{figure}[ht] \begin{center} - \includegraphics[width=70mm]{pic/cbc_next.pdf} + \includegraphics[width=50mm]{pic/cbc_next.pdf} \end{center} \caption{CbCにおけるMoarVMバイトコードインタプリタ内の状態遷移} \label{fig:perl6cbcinter} \end{figure} +\begin{figure}[ht] + \begin{center} + \includegraphics[width=50mm]{pic/stagenqp.pdf} + \end{center} + \caption{NQPのビルドフロー} + \label{fig:perl6cbcinter2} +\end{figure} オリジナルのMoarVMとは異なり,同一関数上で実行する訳では無い為,MVM\_interp\_runで定義している局所変数のレジスタreg\_baseなどにアクセスすることは通常では出来ない. その為CodeGearの遷移において,これら必要なインタプリタの情報を纏めた構造体INTERを宣言し,このポインタであるINTERPを引数として入力する. diff -r 5c8e88841a30 -r e35adb402a6a pic/stagenqp.pdf Binary file pic/stagenqp.pdf has changed diff -r 5c8e88841a30 -r e35adb402a6a src/cbc_example.cbc --- a/src/cbc_example.cbc Mon Nov 12 10:11:16 2018 +0900 +++ b/src/cbc_example.cbc Mon Nov 12 14:12:44 2018 +0900 @@ -1,5 +1,3 @@ -extern int printf(const char*,...); - int main (){ int data = 0; goto cg1(&data); diff -r 5c8e88841a30 -r e35adb402a6a src/dispatch.c --- a/src/dispatch.c Mon Nov 12 10:11:16 2018 +0900 +++ b/src/dispatch.c Mon Nov 12 14:12:44 2018 +0900 @@ -1,25 +1,10 @@ - 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; - } - } +DISPATCH(NEXT_OP) { + OP(no_op): + goto NEXT; + 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; +}