# HG changeset patch # User anatofuz # Date 1550567320 -32400 # Node ID 793ee68da7fa45895ce68609eebb276bad6b01b9 # Parent eaa12816b3e3ca2c9758870ab46c94fc3855dae3 update diff -r eaa12816b3e3 -r 793ee68da7fa presen/fig/cbc_next.pdf Binary file presen/fig/cbc_next.pdf has changed diff -r eaa12816b3e3 -r 793ee68da7fa presen/slide.html --- a/presen/slide.html Tue Feb 19 17:45:30 2019 +0900 +++ b/presen/slide.html Tue Feb 19 18:08:40 2019 +0900 @@ -110,14 +110,15 @@

研究目的

- - @@ -194,7 +195,7 @@
  • Rakudoとは現在のPerl6の主力な実装である.
  • Rakudoは次の構成になっている @@ -263,7 +264,7 @@
  • gccやclangを利用してコンパイルした場合、 ラベルgotoで命令ディスパッチが実行される
  • -<img src=”fig/origin_label_goto.svg” width=”30%” text-align:center;padding-left: 300px;> + @@ -280,7 +281,6 @@
  • この中の OP で宣言されたブロックがそれぞれバイトコードに対応する処理となっている.
  • -
  • cur_opは次のバイトコード列が登録されており, マクロ NEXT で決められた方法で次のバイトコードに対応した処理に遷移する.
  • DISPATCH(NEXT_OP) {
    @@ -329,26 +329,43 @@
       
     

    MVM_interp_runで使用されているマクロ

    +
        OP(const_i64):
    +        GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2);
    +        cur_op += 10;
    +        goto NEXT;
    +
    + +
      +
    • cur_opは次のバイトコード列が登録されており, マクロ NEXT で決められた方法で次のバイトコードに対応した処理に遷移する.
    • +
    + + + + + +
    + +

    MVM_interp_runで使用されているマクロ

    + +
        OP(const_i64):
    +        GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2);
    +        cur_op += 10;
    +        goto NEXT;
    +
    +
    • 次の命令に移動する NEXTはラベルテーブルにアクセスし, ラベルを取り出す
      • 取り出したNEXTはラベルなので、 ラベルgotoの拡張が実装されている場合はgoto文でジャンプ出来る
    • -
    • 次の命令を計算する処理は, NEXT_OP というマクロが担っている
    • +
    • 次の命令に対応する数値は, NEXT_OP というマクロで取り出す
    #define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op)
     #define NEXT *LABELS[NEXT_OP]
     
     
    -
      -
    • マクロ NEXT は次の様に展開される
    • -
    • これは現在のバイトコードを指すポインタをインクリメントし、 命令に対応する変数に代入をする
    • -
    - -
    goto *LABELS[(op = *(MVMuint16 *)(cur_op), cur_op += 2, op)];
    -
    @@ -452,7 +469,17 @@
    • MoarVMではレジスタの集合や命令列などをMVM_interp_runのローカル変数として利用し, 各命令実行箇所で参照している
    • CodeGearに書き換えた場合, このローカル変数にはアクセスする事が不可能となる.
    • -
    • その為, 入出力としてMoarVMの情報をまとめた構造体interpのポインタであるINTERPを受け渡し, これを利用してアクセスする
    • +
    + + + +
    + +
    + +

    CodeGearの入出力インターフェイス

    +
      +
    • 入出力としてMoarVMの情報をまとめた構造体interpのポインタであるINTERPを受け渡し, これを利用してアクセスする
    typedef struct interp {
    @@ -503,6 +530,16 @@
     
     
    +

    CbCMoarVMの状態遷移

    + + + + + +
    + +
    +

    MoarVMとCbCMoarVMのトレース

      @@ -566,9 +603,18 @@
    • その為、 NQP, Rakudoの実行コマンドであるnqp perl6が起動する様になった
    + + + + +
    + +
    + +

    現在のCbCMoarVM

    +
    • moarの起動時のオプションとして --cbc を与えることによりCbCかオリジナルを選択可能である
    • -
    • Perl6の実行バイナリperl6, NQPの実行バイナリnqp は, それぞれmoarを起動するシェルスクリプトである
    • -
    • --cbc オプションをシェルスクリプト内に書き加えることで, Perl6, NQPがそれぞれCbCで起動する
    • +
    • --cbc オプションをmoarの起動時に設定することでCbCで書き換えたインタプリタが起動する
    #!/bin/sh
    diff -r eaa12816b3e3 -r 793ee68da7fa presen/slide.md
    --- a/presen/slide.md	Tue Feb 19 17:45:30 2019 +0900
    +++ b/presen/slide.md	Tue Feb 19 18:08:40 2019 +0900
    @@ -13,12 +13,11 @@
     - 命令実行処理部分をモジュール化することで、各命令ごとの最適化や、 命令ディスパッチ部分の最適化を行う事が可能であると考える。
     
     ## 研究目的
    -- 現在開発されているPerl6の実装にRakudoがあり, RakudoはNQP(Perl6のサブセット)で記述されたPerl6, NQPで記述されたNQPコンパイラ, NQPを解釈するVMで構成されている
    -- NQPコンパイラはRakudoのVMであるMoarVM用のバイトコードを生成する
    -- MoarVMはこのバイトコードを解釈, 実行する
    +- 現在開発されているPerl6の実装にRakudoがある
    +- Rakudoはバイトコードを生成する
    +    - このバイトコードはMoarVMという専用の仮想機械が評価する
     - 本研究では, CbC用いてPerl6にC処理系であるMoarVMの一部書き換えを行い, 命令のモジュール化を検討する.
     
    -![](fig/perl6nqp.svg)
     
     
     ## Continuation Based C (CbC)
    @@ -65,7 +64,7 @@
     ## Rakudo
     - Rakudoとは現在のPerl6の主力な実装である.
     - Rakudoは次の構成になっている
    -    - 実行環境のVM
    +    - 実行環境のVM (MoarVM)
         - Perl6のサブセットであるNQP(NotQuitPerl)
         - NQPで記述されたPerl6(Rakudo)
     
    @@ -98,14 +97,13 @@
     - MoarVMは関数 `MVM_interp_run` でバイトコードに応じた処理を実行する
     - gccやclangを利用してコンパイルした場合、 ラベルgotoで命令ディスパッチが実行される
     
    -
    +
     
     ## MoarVMのバイトコードインタプリタ
     
     - マクロDISPATCHで, ラベルgotoかcase文に変換が行われる
         - バイトコードは数値として見る事が出来る為、 case文に対応する事が出来る
         - この中の `OP` で宣言されたブロックがそれぞれバイトコードに対応する処理となっている.
    -- `cur_op`は次のバイトコード列が登録されており, マクロ `NEXT` で決められた方法で次のバイトコードに対応した処理に遷移する.
     
     ```
     DISPATCH(NEXT_OP) {
    @@ -144,21 +142,33 @@
     
     ## MVM_interp_runで使用されているマクロ
     
    +```
    +    OP(const_i64):
    +        GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2);
    +        cur_op += 10;
    +        goto NEXT;
    +```
    +
    +- `cur_op`は次のバイトコード列が登録されており, マクロ `NEXT` で決められた方法で次のバイトコードに対応した処理に遷移する.
    +
    +## MVM_interp_runで使用されているマクロ
    +
    +```
    +    OP(const_i64):
    +        GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2);
    +        cur_op += 10;
    +        goto NEXT;
    +```
    +
     - 次の命令に移動する `NEXT`はラベルテーブルにアクセスし, ラベルを取り出す
         - 取り出したNEXTはラベルなので、 ラベルgotoの拡張が実装されている場合はgoto文でジャンプ出来る
    -- 次の命令を計算する処理は, `NEXT_OP` というマクロが担っている
    +- 次の命令に対応する数値は, `NEXT_OP` というマクロで取り出す
     
     ```
     #define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op)
     #define NEXT *LABELS[NEXT_OP]
     
     ```
    -- マクロ `NEXT` は次の様に展開される
    -- これは現在のバイトコードを指すポインタをインクリメントし、 命令に対応する変数に代入をする
    -
    -```
    -goto *LABELS[(op = *(MVMuint16 *)(cur_op), cur_op += 2, op)];
    -```
     
     
     ## MVM_interp_runのラベルテーブル
    @@ -202,6 +212,8 @@
     - その為、 従来は関数化出来なかった単位をCodeGearに変換する事が出来る
     - CbCをMoarVMに適応すると, ラベルなどで制御していた命令に対応する処理をCodeGearで記述する事が可能である
     
    +
    +
     ## CbCMoarVMのバイトコードディスパッチ
     
     - オリジナルでは, マクロ `NEXT` が担当していた、  次のバイトコードへの移動は, NEXT相当のCodeGear `cbc_next`で処理を行う
    @@ -222,11 +234,14 @@
     
     ```
     
    +
     ## CodeGearの入出力インターフェイス
     
     - MoarVMではレジスタの集合や命令列などをMVM_interp_runのローカル変数として利用し, 各命令実行箇所で参照している
     - CodeGearに書き換えた場合, このローカル変数にはアクセスする事が不可能となる.
    -- その為, 入出力としてMoarVMの情報をまとめた構造体interpのポインタであるINTERPを受け渡し, これを利用してアクセスする
    +
    +## CodeGearの入出力インターフェイス
    +- 入出力としてMoarVMの情報をまとめた構造体interpのポインタであるINTERPを受け渡し, これを利用してアクセスする
     
     
     ```
    @@ -265,6 +280,9 @@
       cbc_extend_u16,
     ```
     
    +## CbCMoarVMの状態遷移
    +
    +
     
     
     ## MoarVMとCbCMoarVMのトレース
    @@ -311,9 +329,10 @@
     
     - 現在はNQP, Rakudoのセルフビルドが達成でき, オリジナルと同等のテスト達成率を持っている
         - その為、 NQP, Rakudoの実行コマンドであるnqp perl6が起動する様になった
    +
    +## 現在のCbCMoarVM
     - moarの起動時のオプションとして `--cbc` を与えることによりCbCかオリジナルを選択可能である
    -- Perl6の実行バイナリperl6, NQPの実行バイナリnqp は, それぞれmoarを起動するシェルスクリプトである
    -- `--cbc` オプションをシェルスクリプト内に書き加えることで, Perl6, NQPがそれぞれCbCで起動する
    +- `--cbc` オプションをmoarの起動時に設定することでCbCで書き換えたインタプリタが起動する
     
     ```
     #!/bin/sh
    diff -r eaa12816b3e3 -r 793ee68da7fa presen/slide.pdf
    Binary file presen/slide.pdf has changed
    diff -r eaa12816b3e3 -r 793ee68da7fa presen/slide.pdf.html
    --- a/presen/slide.pdf.html	Tue Feb 19 17:45:30 2019 +0900
    +++ b/presen/slide.pdf.html	Tue Feb 19 18:08:40 2019 +0900
    @@ -94,14 +94,15 @@
       
     

    研究目的

      -
    • 現在開発されているPerl6の実装にRakudoがあり, RakudoはNQP(Perl6のサブセット)で記述されたPerl6, NQPで記述されたNQPコンパイラ, NQPを解釈するVMで構成されている
    • -
    • NQPコンパイラはRakudoのVMであるMoarVM用のバイトコードを生成する
    • -
    • MoarVMはこのバイトコードを解釈, 実行する
    • +
    • 現在開発されているPerl6の実装にRakudoがある
    • +
    • Rakudoはバイトコードを生成する +
        +
      • このバイトコードはMoarVMという専用の仮想機械が評価する
      • +
      +
    • 本研究では, CbC用いてPerl6にC処理系であるMoarVMの一部書き換えを行い, 命令のモジュール化を検討する.
    -

    -
    @@ -178,7 +179,7 @@
  • Rakudoとは現在のPerl6の主力な実装である.
  • Rakudoは次の構成になっている
      -
    • 実行環境のVM
    • +
    • 実行環境のVM (MoarVM)
    • Perl6のサブセットであるNQP(NotQuitPerl)
    • NQPで記述されたPerl6(Rakudo)
    @@ -247,7 +248,7 @@
  • gccやclangを利用してコンパイルした場合、 ラベルgotoで命令ディスパッチが実行される
  • -

    <img src=”fig/origin_label_goto.svg” width=”30%” text-align:center;padding-left: 300px;>

    +

    @@ -264,7 +265,6 @@
  • この中の OP で宣言されたブロックがそれぞれバイトコードに対応する処理となっている.
  • -
  • cur_opは次のバイトコード列が登録されており, マクロ NEXT で決められた方法で次のバイトコードに対応した処理に遷移する.
  • DISPATCH(NEXT_OP) {
    @@ -313,26 +313,43 @@
       
     

    MVM_interp_runで使用されているマクロ

    +
        OP(const_i64):
    +        GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2);
    +        cur_op += 10;
    +        goto NEXT;
    +
    + +
      +
    • cur_opは次のバイトコード列が登録されており, マクロ NEXT で決められた方法で次のバイトコードに対応した処理に遷移する.
    • +
    + + + +
    + +
    + +

    MVM_interp_runで使用されているマクロ

    + +
        OP(const_i64):
    +        GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2);
    +        cur_op += 10;
    +        goto NEXT;
    +
    +
    • 次の命令に移動する NEXTはラベルテーブルにアクセスし, ラベルを取り出す
      • 取り出したNEXTはラベルなので、 ラベルgotoの拡張が実装されている場合はgoto文でジャンプ出来る
    • -
    • 次の命令を計算する処理は, NEXT_OP というマクロが担っている
    • +
    • 次の命令に対応する数値は, NEXT_OP というマクロで取り出す
    #define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op)
     #define NEXT *LABELS[NEXT_OP]
     
     
    -
      -
    • マクロ NEXT は次の様に展開される
    • -
    • これは現在のバイトコードを指すポインタをインクリメントし、 命令に対応する変数に代入をする
    • -
    - -
    goto *LABELS[(op = *(MVMuint16 *)(cur_op), cur_op += 2, op)];
    -
    @@ -436,7 +453,17 @@
    • MoarVMではレジスタの集合や命令列などをMVM_interp_runのローカル変数として利用し, 各命令実行箇所で参照している
    • CodeGearに書き換えた場合, このローカル変数にはアクセスする事が不可能となる.
    • -
    • その為, 入出力としてMoarVMの情報をまとめた構造体interpのポインタであるINTERPを受け渡し, これを利用してアクセスする
    • +
    + + + +
    + +
    + +

    CodeGearの入出力インターフェイス

    +
      +
    • 入出力としてMoarVMの情報をまとめた構造体interpのポインタであるINTERPを受け渡し, これを利用してアクセスする
    typedef struct interp {
    @@ -487,6 +514,16 @@
     
     
    +

    CbCMoarVMの状態遷移

    + +

    + + + +
    + +
    +

    MoarVMとCbCMoarVMのトレース

      @@ -550,9 +587,18 @@
    • その為、 NQP, Rakudoの実行コマンドであるnqp perl6が起動する様になった
    + + + + +
    + +
    + +

    現在のCbCMoarVM

    +
    • moarの起動時のオプションとして --cbc を与えることによりCbCかオリジナルを選択可能である
    • -
    • Perl6の実行バイナリperl6, NQPの実行バイナリnqp は, それぞれmoarを起動するシェルスクリプトである
    • -
    • --cbc オプションをシェルスクリプト内に書き加えることで, Perl6, NQPがそれぞれCbCで起動する
    • +
    • --cbc オプションをmoarの起動時に設定することでCbCで書き換えたインタプリタが起動する
    #!/bin/sh