changeset 8:e35adb402a6a

update
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 12 Nov 2018 14:12:44 +0900
parents 5c8e88841a30
children e348dc526774
files Makefile mid_thesis.pdf mid_thesis.tex pic/stagenqp.pdf src/cbc_example.cbc src/dispatch.c
diffstat 6 files changed, 24 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- 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) $<
Binary file mid_thesis.pdf has changed
--- 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を引数として入力する.
Binary file pic/stagenqp.pdf has changed
--- 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);
--- 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;
+}