# HG changeset patch # User anatofuz # Date 1550546492 -32400 # Node ID 9aff6e24950e6c9db78996cecfc38cef127b90f6 # Parent 7cdec0f787151f34880e2adef12537b3a8503d6d update diff -r 7cdec0f78715 -r 9aff6e24950e paper/chapter4.tex --- a/paper/chapter4.tex Mon Feb 18 23:56:07 2019 +0900 +++ b/paper/chapter4.tex Tue Feb 19 12:21:32 2019 +0900 @@ -75,25 +75,49 @@ \lstinputlisting[frame=lrbt, label=test_nqp, caption=2引数の加算とインクリメントを行うNQPサンプルコード]{./codes/add.nqp} -このコードは test\_funcというサブルーチンを定義し、 int型引数leftとrightを受け取る。 -leftとrightを足した結果を、 変数sumに束縛する。 -3行目でsumの値をインクリメントし、 その値を返り値として渡している。 +このコードは test\_funcというサブルーチンを定義し、 int型引数\verb|$left|と\verb|$right|を受け取る。 +leftとrightを足した結果を、 int型変数sumに代入する。 +3行目で\verb|sum|の値をインクリメントし、 その値を返り値として渡している。 -サブルーチンtest\_funcはソースコード中の8、 9行目でそれぞれ1と8に設定した変数arg1とarg2を渡している。 +サブルーチン\verb|test_func|はソースコード中の8、 9行目でそれぞれ1と8に設定した変数\verb|arg1|と\verb|arg2|を渡している。 サブルーチンの返り値はsay関数で表示する。 -このスクリプトをバイトコード化したものをディスアセンブルの様にダンプしたものを示す。 +このスクリプトをバイトコード化したものを、 アセンブリ言語の様に出力を行った。 -ソースコード\ref{test_nqp}内の行と実際のMoarVMバイトコードの対応を、 一部図示した物を図\ref{fig:bytecode2code}に示す。 +ソースコード\ref{test_nqp}内のサブルーチンの行と実際のMoarVMバイトコードの対応を、 図示した物を図\ref{fig:bytecode2code}に示す。 \begin{figure}[ht] \caption{NQPソースコードとMoarVMバイトコードの対応} \begin{center} - \includegraphics[width=120mm]{./fig/code_to_bytecode.pdf} + \includegraphics[width=130mm]{./fig/code_to_bytecode.pdf} \end{center} \label{fig:bytecode2code} \end{figure} +この図の中の左の枠がNQPソースコードであり、 右側が対応するMoarVMバイトコードをディスアセンブルしたものである。 +例えば最初の \verb|my int $sum := $left + $right|に着目する。 +この行に対応するバイトコード命令は\verb|add_i| と \verb|set| である。 +命令の右側 \verb|loc_3_int| などはオペランドであり、 今回はそれぞれレジスタを意味している。 +\verb|add_i|は図\ref{fig:add_i}に示す処理を行う。 + +\begin{figure}[ht] +\caption{add\_i命令} + \begin{center} + \includegraphics[width=100mm]{./fig/add_i.pdf} + \end{center} + \label{fig:add_i} +\end{figure} + +MoarVMのレジスタは、 型やオブジェクトを指定することが可能となっている。 +\verb|loc_3|や \verb|loc_0| などがレジスタを示しており、 末尾の \verb|_int| で型を指定している。 +図\ref{fig:add_i}ではint型整数の加算と代入を行っている為、 使用するレジスタがint型となっている。 +\verb|add_i|で加算を行った結果は、 レジスタ\verb|loc_3|に代入される。 +この結果をset命令で、 \verb|loc_2| レジスタに代入している。 +\verb|loc_2| に \verb|_obj| がついているのは、 変数 \verb|$sum| はオブジェクトである。 +setは加算ではなく、 オブジェクトへの値の代入を行うため、 レジスタをint型整数ではなくオブジェクトそのものとして設定している。 + +この様にNQPレベルのソースコードでは、1処理あたり1ないし1以上のバイトコード命令に変換される。 + \section{オリジナルのMoarVMの処理} MoarVMのバイトコードインタプリタはsrc/core/interp.c中の関数 MVM\_interp\_runで定義されている。 @@ -101,6 +125,7 @@ 関数内では、 解釈するべきバイトコード列が格納されている変数 cur\_op や、現在と次の命令を指し示すop、 命令に対して受け渡す現在のVM情報であるThreadContex tcなどが変数として利用されている。 実際に命令ディスパッチを行っている箇所の一部をソースコード\ref{origin_dispatch}に示す。 + \lstinputlisting[frame=lrbt, label=origin_dispatch, caption=オリジナルのMoarVMの命令ディスパッチ部分]{./codes/src/dispatch.c} ソースコード\ref{origin_dispatch}中のOP(.*)と書かれている部分が、 それぞれのバイトコードが示す命令名となっている。 diff -r 7cdec0f78715 -r 9aff6e24950e paper/codes/add.moarvmasm --- a/paper/codes/add.moarvmasm Mon Feb 18 23:56:07 2019 +0900 +++ b/paper/codes/add.moarvmasm Tue Feb 19 12:21:32 2019 +0900 @@ -1,15 +1,16 @@ MoarVM dump of binary compilation unit: - SC_0 : 853A0174C908BE23450CBE426C36E2A42F69DD24-0 + SC_0 : D180E910D13D0F8063BBC8EA3DDF32D9509BE85A-0 Callsite_0 : num_pos: 1 arg_count: 1 Arg 1 : positional obj Callsite_1 : - num_pos: 1 - arg_count: 1 - Arg 1 : positional int + num_pos: 2 + arg_count: 2 + Arg 1 : positional obj + Arg 2 : positional obj Callsite_2 : num_pos: 2 arg_count: 2 @@ -29,12 +30,14 @@ 0: loc_0_obj 1: loc_1_obj 2: loc_2_obj - 3: loc_3_str + 3: loc_3_obj 4: loc_4_obj - 5: loc_5_int - 6: loc_6_int - 7: loc_7_obj - 8: loc_8_obj + 5: loc_5_str + 6: loc_6_obj + 7: loc_7_int + 8: loc_8_int + 9: loc_9_obj + 10: loc_10_obj Lexicals : 0: lex_Frame_0__obj 1: lex_Frame_0__obj @@ -47,39 +50,49 @@ 00003 param_sp loc_0_obj, 0 00004 paramnamesused 00005 bindlex lex_Frame_0__obj, loc_1_obj -00006 const_s loc_3_str, '$*CTXSAVE' -00007 getdynlex loc_4_obj, loc_3_str -00008 set loc_2_obj, loc_4_obj -00009 isnull loc_5_int, loc_2_obj -00010 if_i loc_5_int, label_1(00020) -00011 decont loc_4_obj, loc_2_obj -00012 const_s loc_3_str, 'ctxsave' -00013 can_s loc_6_int, loc_4_obj, loc_3_str -00014 unless_i loc_6_int, label_1(00020) -00015 decont loc_7_obj, loc_2_obj -00016 findmeth loc_4_obj, loc_7_obj, 'ctxsave' +00006 const_s loc_5_str, '$*CTXSAVE' +00007 getdynlex loc_6_obj, loc_5_str +00008 set loc_4_obj, loc_6_obj +00009 isnull loc_7_int, loc_4_obj +00010 if_i loc_7_int, label_1(00020) +00011 decont loc_6_obj, loc_4_obj +00012 const_s loc_5_str, 'ctxsave' +00013 can_s loc_8_int, loc_6_obj, loc_5_str +00014 unless_i loc_8_int, label_1(00020) +00015 decont loc_9_obj, loc_4_obj +00016 findmeth loc_6_obj, loc_9_obj, 'ctxsave' 00017 prepargs Callsite_0 -00018 arg_o 0, loc_2_obj -00019 invoke_o loc_4_obj, loc_4_obj +00018 arg_o 0, loc_4_obj +00019 invoke_o loc_6_obj, loc_6_obj + annotation: add.nqp:7 + label_1: +00020 const_i64_16 loc_7_int, 1 +00021 hllboxtype_i loc_9_obj +00022 box_i loc_9_obj, loc_7_int, loc_9_obj +00023 set loc_2_obj, loc_9_obj + annotation: add.nqp:8 +00024 const_i64_16 loc_7_int, 8 +00025 hllboxtype_i loc_9_obj +00026 box_i loc_9_obj, loc_7_int, loc_9_obj +00027 set loc_3_obj, loc_9_obj annotation: add.nqp:10 - label_1: -00020 getlex_no loc_7_obj, '&say' -00021 decont loc_7_obj, loc_7_obj -00022 const_s loc_3_str, '&add_test' -00023 getlexstatic_o loc_8_obj, loc_3_str -00024 decont loc_8_obj, loc_8_obj -00025 const_i64_16 loc_5_int, 10 -00026 prepargs Callsite_1 -00027 arg_i 0, loc_5_int -00028 invoke_o loc_8_obj, loc_8_obj -00029 prepargs Callsite_0 -00030 arg_o 0, loc_8_obj -00031 invoke_v loc_7_obj -00032 null loc_8_obj -00033 return_o loc_8_obj +00028 getlex_no loc_9_obj, '&say' +00029 decont loc_9_obj, loc_9_obj +00030 const_s loc_5_str, '&test_func' +00031 getlexstatic_o loc_10_obj, loc_5_str +00032 decont loc_10_obj, loc_10_obj +00033 prepargs Callsite_1 +00034 arg_o 0, loc_2_obj +00035 arg_o 1, loc_3_obj +00036 invoke_o loc_10_obj, loc_10_obj +00037 prepargs Callsite_0 +00038 arg_o 0, loc_10_obj +00039 invoke_v loc_9_obj +00040 null loc_10_obj +00041 return_o loc_10_obj Frame_1 : cuuid : 2 - name : add_test + name : test_func outer : Frame_0 Locals : 0: loc_0_int @@ -89,35 +102,25 @@ 4: loc_4_obj 5: loc_5_obj Instructions : -00000 checkarity 1, 1 +00000 checkarity 2, 2 00001 param_rp_i loc_0_int, 0 -00002 paramnamesused +00002 param_rp_i loc_1_int, 1 +00003 paramnamesused annotation: add.nqp:2 -00003 const_i64_16 loc_2_int, 0 -00004 set loc_1_int, loc_2_int +00004 add_i loc_3_int, loc_0_int, loc_1_int +00005 set loc_2_int, loc_3_int annotation: add.nqp:3 +00006 const_i64_16 loc_3_int, 1 +00007 add_i loc_3_int, loc_2_int, loc_3_int +00008 set loc_2_int, loc_3_int +00009 hllboxtype_i loc_4_obj +00010 box_i loc_4_obj, loc_2_int, loc_4_obj +00011 throwpayloadlex loc_4_obj, 32, loc_4_obj +00012 goto label_1(00015) +00013 lastexpayload loc_5_obj +00014 set loc_4_obj, loc_5_obj label_1: -00005 const_i64_16 loc_2_int, 1 -00006 gt_i loc_2_int, loc_0_int, loc_2_int -00007 unless_i loc_2_int, label_2(00015) -00008 osrpoint - annotation: add.nqp:4 -00009 add_i loc_3_int, loc_1_int, loc_0_int -00010 set loc_1_int, loc_3_int - annotation: add.nqp:5 -00011 const_i64_16 loc_3_int, 1 -00012 sub_i loc_3_int, loc_0_int, loc_3_int -00013 set loc_0_int, loc_3_int -00014 goto label_1(00005) - label_2: -00015 hllboxtype_i loc_4_obj -00016 box_i loc_4_obj, loc_1_int, loc_4_obj -00017 throwpayloadlex loc_4_obj, 32, loc_4_obj -00018 goto label_3(00021) -00019 lastexpayload loc_5_obj -00020 set loc_4_obj, loc_5_obj - label_3: -00021 return_o loc_4_obj +00015 return_o loc_4_obj Frame_2 : cuuid : 3 name : @@ -170,7 +173,7 @@ 00030 arg_o 0, loc_2_obj 00031 arg_s 1, loc_1_str 00032 invoke_o loc_2_obj, loc_4_obj -00033 const_s loc_1_str, '853A0174C908BE23450CBE426C36E2A42F69DD24-0' +00033 const_s loc_1_str, 'D180E910D13D0F8063BBC8EA3DDF32D9509BE85A-0' 00034 createsc loc_4_obj, loc_1_str 00035 set loc_6_obj, loc_4_obj 00036 const_s loc_1_str, 'add.nqp' diff -r 7cdec0f78715 -r 9aff6e24950e paper/main.pdf Binary file paper/main.pdf has changed