changeset 88:9aff6e24950e

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Tue, 19 Feb 2019 12:21:32 +0900
parents 7cdec0f78715
children 9c1cbf7c0ec7
files paper/chapter4.tex paper/codes/add.moarvmasm paper/main.pdf
diffstat 3 files changed, 99 insertions(+), 71 deletions(-) [+]
line wrap: on
line diff
--- 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(.*)と書かれている部分が、 それぞれのバイトコードが示す命令名となっている。
--- 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 : <dependencies+deserialize>
@@ -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'
Binary file paper/main.pdf has changed