Mercurial > hg > Papers > 2019 > anatofuz-thesis
changeset 92:007079c53a83
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 19 Feb 2019 14:36:26 +0900 |
parents | a086473c1c99 |
children | 9c5bf7231557 |
files | prepaper/finalpre.pdf prepaper/finalpre.tex presen/slide.html presen/slide.md presen/slide.pdf.html |
diffstat | 5 files changed, 175 insertions(+), 278 deletions(-) [+] |
line wrap: on
line diff
--- a/prepaper/finalpre.tex Tue Feb 19 13:57:04 2019 +0900 +++ b/prepaper/finalpre.tex Tue Feb 19 14:36:26 2019 +0900 @@ -55,25 +55,20 @@ \twocolumn [ \maketitle \begin{onecolabstract} -Current mainstream Perl6 is a project which is said to Rakudo. In Rakudo Perl6 itself written in a subset of Perl6 called NQP (NotQuitPerl). -NQP is interpreted by VM. -This VM is adapted any VM can be selected. -The most commonly used VM is MoarVM written in C language. -Rakudo is slower in startup and evaluation than other scripting programming languages. +NQP Bytecode is interpreted by MoarVM wrriten in C language. We are developing Programing Language that name Continuation based C (CbC). -CbC gives Code Gear and Data Gear as programing units. -A transfer from a Code Gear to another Code Gear is implemented using a CbC's goto statement, +CbC has Code Gear and Data Gear as programing language units. +A transfer from a Code Gear to another Code Gear is performed using a CbC's goto statement, which is compiled as a jump instruction in CbC. -Since MoarVM is wrriten in C language, it can be rewritten in CbC. -In this thesis, -consider rewriting the instruction dispatch part of MoarVM with CbC. +MoarVM is going to implemented in C language, it can be rewritten in CbC. +In this thesis, consider rewriting the instruction dispatch part of MoarVM with CbC. +We successfully MoarVM writtern in CbClang. +CbC is faster than Original MoarVM has CPU cash. \end{onecolabstract}] -\thispagestyle{fancy} - - +\thispagestyle{fancy} \section{Perl6の現在の実装} @@ -82,10 +77,11 @@ MoarVMで動作する主流なPerl6の実装に、 Rakudoがある。 Rakudo実装のPerl6は、 他スクリプト言語と比較すると、 実行速度が低速である。 -また、 MoarVMの実装が巨大なcase文が使用されていたりとモジュール化がし辛い状況にある。 -バイトコードから仮想機械を動作させる際、 バイトコード中のバイト列から、 実行する命令の処理を取得するフェッチ部分が時間的にはボトルネックとなっている。 -今後この部分を改善し、 速度向上を測るために、 命令そのものを巨大なcase文から分離し、 モジュール化するのが望ましい。 -その為、 本研究では、 MoarVMの命令対応部分のモジュール化の検討を行う。 +また、 MoarVMの実装が巨大なcase文が使用されており、 モジュール化が行われていない。 +バイトコードから仮想機械を動作させる際、 バイトコード中のバイト列から、 実行する命令の処理を取得する必要がある。 + +%今後この部分を改善し、 速度向上をめに、 命令そのものを巨大なcase文から分離し、 モジュール化するのが望ましい。 +%その為、 本研究では、 MoarVMの命令対応部分のモジュール化の検討を行う。 \section{CbC} Perl6処理系の改良には、 gccとLLVM/Clang上に実装した、 Continuation based C(CbC)を用いる。 @@ -158,7 +154,7 @@ この方法の利点としてCodeGearは単なる関数として扱える為、元のソースコードの様に同一ファイル内に全ての処理を書く必要がない。 またラベルにはbreak pointを設定する事が出来なかったが、 CodeGearはデバッガからは関数として見る事ができるため通常のCの関数の様にbreak pointを設定する事が可能である。 - +\section{まとめ} 現在はMoarVMを利用しNQP, Perl6のビルドが達成出来た。 またテストコードも、 元のMoarVMと同様の達成率を得た。 処理速度は再帰呼び出しなどを行っている例題では、 オリジナルのMoarVMより低速であるが、単純ループなど、 命令がCPUのキャッシュに残る場合は高速に動く事が測定された。
--- a/presen/slide.html Tue Feb 19 13:57:04 2019 +0900 +++ b/presen/slide.html Tue Feb 19 14:36:26 2019 +0900 @@ -94,12 +94,28 @@ <h2 id="研究目的">研究目的</h2> <ul> <li>現在開発されているPerl6の実装にRakudoがあり, RakudoはNQP(Perl6のサブセット)で記述されたPerl6, NQPで記述されたNQPコンパイラ, NQPを解釈するVMで構成されている</li> - <li>NQPコンパイラはRakudoのVMであるMoarVM用のバイトコードを生成し, MoarVMはこのバイトコードを解釈, 実行する</li> + <li>NQPコンパイラはRakudoのVMであるMoarVM用のバイトコードを生成する</li> + <li>MoarVMはこのバイトコードを解釈, 実行する</li> +</ul> + +<img src="fig/perl6nqp.svg" alt="" /> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="研究目的-1">研究目的</h2> +<ul> <li>Continuation based C (CbC)という言語は継続を基本とするC言語であり, 言語処理系に応用出来ると考えられる</li> - <li>スクリプト言語などは, バイトコードを扱うが, この実行にcae文や, ラベルgotoなどを利用しており, この部分はCbCの機能で書き換える事が可能である</li> - <li>従って, CbC一部用いてPerl6にC処理系であるMoarVMの書き換えを行い, 処理を検討する. -<img src="fig/perl6nqp.svg" alt="" /></li> - <li>(Rakudoの構成図)</li> + <li>スクリプト言語などは, バイトコードを扱うが, この実行にcae文や, ラベルgotoなどを利用している。 + <ul> + <li>この部分はCbCの機能で書き換える事が可能である</li> + </ul> + </li> + <li>命令実行処理部分をモジュール化することで、各命令ごとの最適化や、 命令ディスパッチ部分の最適化を行う事が可能であると考える。</li> + <li>従って, CbC一部用いてPerl6にC処理系であるMoarVMの書き換えを行い, 処理を検討する.</li> </ul> @@ -112,17 +128,8 @@ <ul> <li>Continuation Based C (CbC) はCodeGearを単位として用いたプログラミング言語である.</li> <li>CodeGearはCの通常の関数呼び出しとは異なり,スタックに値を積まず, 次のCodeGearにgoto文によって遷移する.</li> - <li>Cの関数呼び出しとは異なり、 goto文ではスタックを利用しない</li> - <li> - CodeGear同士の移動は、 状態遷移として捉える事が出来る - </li> - <li>CbCは現在3種類の実装がある. - <ul> - <li>gcc (version 9.0.0)</li> - <li>llvm/clang (version 7.0.0)</li> - <li>micro-c</li> - </ul> - </li> + <li>CodeGear同士の移動は、 状態遷移として捉える事が出来る</li> + <li>(図をいれる)</li> </ul> @@ -136,20 +143,10 @@ <ul> <li>CodeGearはCの関数宣言の型名の代わりに<code>__code</code>と書く事で宣言出来る</li> <li>CodeGearの引数は, 各CodeGearの入出力として利用する</li> + <li>gotoしてしまうと、元のCodeGearに戻る事が出来ない</li> </ul> -<pre><code>extern int printf(const char*,...); - -typedef struct test_struct { - int number; - char* string; -} TEST, *TESTP; - - -__code cg1(TEST); -__code cg2(TEST); - -__code cg1(TEST testin){ +<pre><code>__code cg1(TEST testin){ TEST testout; testout.number = testin.number + 1; testout.string = "Hello"; @@ -174,11 +171,15 @@ <!-- _S9SLIDE_ --> <h2 id="言語処理系の応用">言語処理系の応用</h2> <ul> - <li>スクリプト言語処理系は, バイトコードにコンパイルされ, バイトコードをJITを用いてネイティブに変換する</li> - <li>JITを使わない場合, バイトコードに対応した, case文や, ラベルのテーブルにgotoすることで処理を実行する</li> - <li>CbCを言語処理系に応用した場合, バイトコードに対応するCodeGearを生成することが可能である</li> - <li>バイトコードに対応したCodeGearは, CodeGearのテーブルを経由することで実行出来る</li> - <li>CodeGearに分割することで, 処理を複数の関数で記述する事が出来, ファイル分割などのモジュール化が可能となる</li> + <li>スクリプト言語は入力として与えられたソースコードを、 直接評価せずにバイトコードにコンパイルする形式が主流となっている</li> + <li>その為スクリプト言語の実装は大きく2つで構成されている + <ul> + <li>バイトコードに変換するフロントエンド部分</li> + <li>バイトコードを解釈する仮想機械</li> + </ul> + </li> + <li>バイトコードを出力する形式の言語にJavaがあり、 内部的に利用している言語にRubyやPerlなどがある</li> + <li>Perl6も一度バイトコードを生成し、 このバイトコードを専用のVMが評価している</li> </ul> @@ -205,6 +206,34 @@ <ul> <li>Perl6専用のVMであり, Cで記述されている</li> <li>レジスタマシンとして実装されている.</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="moarvmのバイトコード">MoarVMのバイトコード</h2> + +<ul> + <li>MoarVMは16ビットのバイナリを命令バイトコードとして利用している</li> + <li>命令にはその後に16ビットごとにオペランド(引数)を取るものがある</li> +</ul> + +<pre><code>add_i loc_3_int, loc_0_int, loc_1_int +set loc_2_obj, loc_3_obj +</code></pre> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="moarvmのバイトコードインタプリタ">MoarVMのバイトコードインタプリタ</h2> + +<ul> <li> MoarVMはバイトコードインタプリタを <code>src/core/interp.c</code> で定義しており, この中の関数 <code>MVM_interp_run</code> でバイトコードに応じた処理を実行する </li> @@ -214,7 +243,6 @@ </ul> </li> <li>この中では <code>GET_REG</code> などのマクロを用いてMoarVMのレジスタにアクセスする.</li> - <li><code>const_i64</code>に対応する処理で呼び出されている <code>MVM_BC_get_I64</code> は, バイトコードにオフセットを足した箇所で指定されている数値を64gitの整数値として取り出す関数となっている</li> <li><code>cur_op</code>は次のバイトコード列が登録されており, マクロ <code>NEXT</code> で決められた方法で次のバイトコードに対応した処理に遷移する.</li> </ul> @@ -427,6 +455,7 @@ <ul> <li>CodeGearテーブルは引数としてINTERを受け取るCodeGearの配列として定義する</li> + <li>テーブルとして宣言することで、 バイトコードの数をそのままテーブルに反映させる事が可能である</li> </ul> <pre><code>__code (* CODES[])(INTERP) = { @@ -554,66 +583,6 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="moarvmのデバッグ手法">MoarVMのデバッグ手法</h2> - -<ul> - <li>MoarVMはバイトコードをランダムに生成する仕様となっている - <ul> - <li>一旦moarvmバイトコードとして出力したファイルを実行する場合は同じ処理内容となっている</li> - </ul> - </li> - <li>そのため, MoarVMのデバッグは同じバイトコードを入力として与え, オリジナルのMoarVMと並列してgdbを用いてトレースを行う.</li> - <li>この際, 実行するバイトコードの数が膨大となるので, scriptコマンドを用いて実行するバイトコードの番号を吐き出し, ログファイルを用いて比較する.</li> -</ul> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="moarvmのデバッグ時のbreak-point">MoarVMのデバッグ時のbreak point</h2> - -<ul> - <li>CbC側では次のバイトコードの遷移は <code>cbc_next</code> というCodeGearで行う</li> - <li>CodeGearは関数として扱える為, これに直接break pointを設定する</li> -</ul> - -<pre><code>(gdb) b cbc_next -Breakpoint 2 at 0x7ffff7560288: file src/core/cbc-interp.cbc, line 61. -(gdb) command 2 -Type commands for breakpoint(s) 2, one per line. -End with a line saying just "end". ->p CODES[*(MVMuint16 *)i->cur_op] ->p *(MVMuint16 *)i->cur_op ->c ->end -</code></pre> -<ul> - <li>オリジナルの場合マクロである為, dummy関数をマクロに記述し, この関数にbreakpointを設定する</li> -</ul> - -<pre><code>dalmore gdb --args ../../MoarVM_Original/MoarVM/moar --libpath=src/vm/moar/stage0 gen/moar/stage1/nqp -(gdb) b dummy -Function "dummy" not defined. -Make breakpoint pending on future shared library load? (y or [n]) y -Breakpoint 1 (dummy) pending. -(gdb) command 1 -Type commands for breakpoint(s) 1, one per line. -End with a line saying just "end". ->up ->p *(MVMuint16 *)(cur_op) ->c ->end - -</code></pre> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> <h2 id="moarvmのトレース">MoarVMのトレース</h2> <ul>
--- a/presen/slide.md Tue Feb 19 13:57:04 2019 +0900 +++ b/presen/slide.md Tue Feb 19 14:36:26 2019 +0900 @@ -7,41 +7,32 @@ ## 研究目的 - 現在開発されているPerl6の実装にRakudoがあり, RakudoはNQP(Perl6のサブセット)で記述されたPerl6, NQPで記述されたNQPコンパイラ, NQPを解釈するVMで構成されている -- NQPコンパイラはRakudoのVMであるMoarVM用のバイトコードを生成し, MoarVMはこのバイトコードを解釈, 実行する +- NQPコンパイラはRakudoのVMであるMoarVM用のバイトコードを生成する +- MoarVMはこのバイトコードを解釈, 実行する + +![](fig/perl6nqp.svg) + +## 研究目的 - Continuation based C (CbC)という言語は継続を基本とするC言語であり, 言語処理系に応用出来ると考えられる -- スクリプト言語などは, バイトコードを扱うが, この実行にcae文や, ラベルgotoなどを利用しており, この部分はCbCの機能で書き換える事が可能である +- スクリプト言語などは, バイトコードを扱うが, この実行にcae文や, ラベルgotoなどを利用している。 + - この部分はCbCの機能で書き換える事が可能である +- 命令実行処理部分をモジュール化することで、各命令ごとの最適化や、 命令ディスパッチ部分の最適化を行う事が可能であると考える。 - 従って, CbC一部用いてPerl6にC処理系であるMoarVMの書き換えを行い, 処理を検討する. -![](fig/perl6nqp.svg) -- (Rakudoの構成図) + ## Continuation Based C (CbC) - Continuation Based C (CbC) はCodeGearを単位として用いたプログラミング言語である. - CodeGearはCの通常の関数呼び出しとは異なり,スタックに値を積まず, 次のCodeGearにgoto文によって遷移する. -- Cの関数呼び出しとは異なり、 goto文ではスタックを利用しない - CodeGear同士の移動は、 状態遷移として捉える事が出来る - -- CbCは現在3種類の実装がある. - - gcc (version 9.0.0) - - llvm/clang (version 7.0.0) - - micro-c +- (図をいれる) ## Continuation Based C (CbC) - CodeGearはCの関数宣言の型名の代わりに`__code`と書く事で宣言出来る - CodeGearの引数は, 各CodeGearの入出力として利用する +- gotoしてしまうと、元のCodeGearに戻る事が出来ない ``` -extern int printf(const char*,...); - -typedef struct test_struct { - int number; - char* string; -} TEST, *TESTP; - - -__code cg1(TEST); -__code cg2(TEST); - __code cg1(TEST testin){ TEST testout; testout.number = testin.number + 1; @@ -59,13 +50,13 @@ } ``` - ## 言語処理系の応用 -- スクリプト言語処理系は, バイトコードにコンパイルされ, バイトコードをJITを用いてネイティブに変換する -- JITを使わない場合, バイトコードに対応した, case文や, ラベルのテーブルにgotoすることで処理を実行する -- CbCを言語処理系に応用した場合, バイトコードに対応するCodeGearを生成することが可能である -- バイトコードに対応したCodeGearは, CodeGearのテーブルを経由することで実行出来る -- CodeGearに分割することで, 処理を複数の関数で記述する事が出来, ファイル分割などのモジュール化が可能となる +- スクリプト言語は入力として与えられたソースコードを、 直接評価せずにバイトコードにコンパイルする形式が主流となっている +- その為スクリプト言語の実装は大きく2つで構成されている + - バイトコードに変換するフロントエンド部分 + - バイトコードを解釈する仮想機械 +- バイトコードを出力する形式の言語にJavaがあり、 内部的に利用している言語にRubyやPerlなどがある +- Perl6も一度バイトコードを生成し、 このバイトコードを専用のVMが評価している ## Rakudo - Rakudoとは現在のPerl6の主力な実装である. @@ -73,18 +64,31 @@ - コンパイラは, NQPで記述されたPerl6コンパイラ, NQPで記述されたNQPコンパイラ, MoarVMバイトコードを解釈するMoarVMという構成である - - ## MoarVM - Perl6専用のVMであり, Cで記述されている - レジスタマシンとして実装されている. + + +## MoarVMのバイトコード + +- MoarVMは16ビットのバイナリを命令バイトコードとして利用している +- 命令にはその後に16ビットごとにオペランド(引数)を取るものがある + + +``` +add_i loc_3_int, loc_0_int, loc_1_int +set loc_2_obj, loc_3_obj +``` + + +## MoarVMのバイトコードインタプリタ + - MoarVMはバイトコードインタプリタを `src/core/interp.c` で定義しており, この中の関数 `MVM_interp_run` でバイトコードに応じた処理を実行する - マクロDISPATCHで, ラベルgotoかcase文に, バイトコードに対応した処理を行う - この中の `OP` で宣言されたブロックがそれぞれバイトコードに対応する処理となっている. - この中では `GET_REG` などのマクロを用いてMoarVMのレジスタにアクセスする. -- `const_i64`に対応する処理で呼び出されている `MVM_BC_get_I64` は, バイトコードにオフセットを足した箇所で指定されている数値を64gitの整数値として取り出す関数となっている - `cur_op`は次のバイトコード列が登録されており, マクロ `NEXT` で決められた方法で次のバイトコードに対応した処理に遷移する. ``` @@ -240,7 +244,7 @@ ## CbCMoarVMのCodeGearテーブル - CodeGearテーブルは引数としてINTERを受け取るCodeGearの配列として定義する - +- テーブルとして宣言することで、 バイトコードの数をそのままテーブルに反映させる事が可能である ``` __code (* CODES[])(INTERP) = { @@ -325,47 +329,6 @@ -## MoarVMのデバッグ手法 - -- MoarVMはバイトコードをランダムに生成する仕様となっている - - 一旦moarvmバイトコードとして出力したファイルを実行する場合は同じ処理内容となっている -- そのため, MoarVMのデバッグは同じバイトコードを入力として与え, オリジナルのMoarVMと並列してgdbを用いてトレースを行う. -- この際, 実行するバイトコードの数が膨大となるので, scriptコマンドを用いて実行するバイトコードの番号を吐き出し, ログファイルを用いて比較する. - -## MoarVMのデバッグ時のbreak point - -- CbC側では次のバイトコードの遷移は `cbc_next` というCodeGearで行う -- CodeGearは関数として扱える為, これに直接break pointを設定する - -``` -(gdb) b cbc_next -Breakpoint 2 at 0x7ffff7560288: file src/core/cbc-interp.cbc, line 61. -(gdb) command 2 -Type commands for breakpoint(s) 2, one per line. -End with a line saying just "end". ->p CODES[*(MVMuint16 *)i->cur_op] ->p *(MVMuint16 *)i->cur_op ->c ->end -``` -- オリジナルの場合マクロである為, dummy関数をマクロに記述し, この関数にbreakpointを設定する - -``` -dalmore gdb --args ../../MoarVM_Original/MoarVM/moar --libpath=src/vm/moar/stage0 gen/moar/stage1/nqp -(gdb) b dummy -Function "dummy" not defined. -Make breakpoint pending on future shared library load? (y or [n]) y -Breakpoint 1 (dummy) pending. -(gdb) command 1 -Type commands for breakpoint(s) 1, one per line. -End with a line saying just "end". ->up ->p *(MVMuint16 *)(cur_op) ->c ->end - -``` - ## MoarVMのトレース - トレース時には次の様なデバッグ情報の表示を利用する
--- a/presen/slide.pdf.html Tue Feb 19 13:57:04 2019 +0900 +++ b/presen/slide.pdf.html Tue Feb 19 14:36:26 2019 +0900 @@ -78,12 +78,28 @@ <h2 id="研究目的">研究目的</h2> <ul> <li>現在開発されているPerl6の実装にRakudoがあり, RakudoはNQP(Perl6のサブセット)で記述されたPerl6, NQPで記述されたNQPコンパイラ, NQPを解釈するVMで構成されている</li> - <li>NQPコンパイラはRakudoのVMであるMoarVM用のバイトコードを生成し, MoarVMはこのバイトコードを解釈, 実行する</li> + <li>NQPコンパイラはRakudoのVMであるMoarVM用のバイトコードを生成する</li> + <li>MoarVMはこのバイトコードを解釈, 実行する</li> +</ul> + +<p><img src="fig/perl6nqp.svg" alt="" /></p> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="研究目的-1">研究目的</h2> +<ul> <li>Continuation based C (CbC)という言語は継続を基本とするC言語であり, 言語処理系に応用出来ると考えられる</li> - <li>スクリプト言語などは, バイトコードを扱うが, この実行にcae文や, ラベルgotoなどを利用しており, この部分はCbCの機能で書き換える事が可能である</li> - <li>従って, CbC一部用いてPerl6にC処理系であるMoarVMの書き換えを行い, 処理を検討する. -<img src="fig/perl6nqp.svg" alt="" /></li> - <li>(Rakudoの構成図)</li> + <li>スクリプト言語などは, バイトコードを扱うが, この実行にcae文や, ラベルgotoなどを利用している。 + <ul> + <li>この部分はCbCの機能で書き換える事が可能である</li> + </ul> + </li> + <li>命令実行処理部分をモジュール化することで、各命令ごとの最適化や、 命令ディスパッチ部分の最適化を行う事が可能であると考える。</li> + <li>従って, CbC一部用いてPerl6にC処理系であるMoarVMの書き換えを行い, 処理を検討する.</li> </ul> @@ -96,17 +112,8 @@ <ul> <li>Continuation Based C (CbC) はCodeGearを単位として用いたプログラミング言語である.</li> <li>CodeGearはCの通常の関数呼び出しとは異なり,スタックに値を積まず, 次のCodeGearにgoto文によって遷移する.</li> - <li>Cの関数呼び出しとは異なり、 goto文ではスタックを利用しない</li> - <li> - <p>CodeGear同士の移動は、 状態遷移として捉える事が出来る</p> - </li> - <li>CbCは現在3種類の実装がある. - <ul> - <li>gcc (version 9.0.0)</li> - <li>llvm/clang (version 7.0.0)</li> - <li>micro-c</li> - </ul> - </li> + <li>CodeGear同士の移動は、 状態遷移として捉える事が出来る</li> + <li>(図をいれる)</li> </ul> @@ -120,20 +127,10 @@ <ul> <li>CodeGearはCの関数宣言の型名の代わりに<code>__code</code>と書く事で宣言出来る</li> <li>CodeGearの引数は, 各CodeGearの入出力として利用する</li> + <li>gotoしてしまうと、元のCodeGearに戻る事が出来ない</li> </ul> -<pre><code>extern int printf(const char*,...); - -typedef struct test_struct { - int number; - char* string; -} TEST, *TESTP; - - -__code cg1(TEST); -__code cg2(TEST); - -__code cg1(TEST testin){ +<pre><code>__code cg1(TEST testin){ TEST testout; testout.number = testin.number + 1; testout.string = "Hello"; @@ -158,11 +155,15 @@ <!-- _S9SLIDE_ --> <h2 id="言語処理系の応用">言語処理系の応用</h2> <ul> - <li>スクリプト言語処理系は, バイトコードにコンパイルされ, バイトコードをJITを用いてネイティブに変換する</li> - <li>JITを使わない場合, バイトコードに対応した, case文や, ラベルのテーブルにgotoすることで処理を実行する</li> - <li>CbCを言語処理系に応用した場合, バイトコードに対応するCodeGearを生成することが可能である</li> - <li>バイトコードに対応したCodeGearは, CodeGearのテーブルを経由することで実行出来る</li> - <li>CodeGearに分割することで, 処理を複数の関数で記述する事が出来, ファイル分割などのモジュール化が可能となる</li> + <li>スクリプト言語は入力として与えられたソースコードを、 直接評価せずにバイトコードにコンパイルする形式が主流となっている</li> + <li>その為スクリプト言語の実装は大きく2つで構成されている + <ul> + <li>バイトコードに変換するフロントエンド部分</li> + <li>バイトコードを解釈する仮想機械</li> + </ul> + </li> + <li>バイトコードを出力する形式の言語にJavaがあり、 内部的に利用している言語にRubyやPerlなどがある</li> + <li>Perl6も一度バイトコードを生成し、 このバイトコードを専用のVMが評価している</li> </ul> @@ -189,6 +190,34 @@ <ul> <li>Perl6専用のVMであり, Cで記述されている</li> <li>レジスタマシンとして実装されている.</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="moarvmのバイトコード">MoarVMのバイトコード</h2> + +<ul> + <li>MoarVMは16ビットのバイナリを命令バイトコードとして利用している</li> + <li>命令にはその後に16ビットごとにオペランド(引数)を取るものがある</li> +</ul> + +<pre><code>add_i loc_3_int, loc_0_int, loc_1_int +set loc_2_obj, loc_3_obj +</code></pre> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="moarvmのバイトコードインタプリタ">MoarVMのバイトコードインタプリタ</h2> + +<ul> <li> <p>MoarVMはバイトコードインタプリタを <code>src/core/interp.c</code> で定義しており, この中の関数 <code>MVM_interp_run</code> でバイトコードに応じた処理を実行する</p> </li> @@ -198,7 +227,6 @@ </ul> </li> <li>この中では <code>GET_REG</code> などのマクロを用いてMoarVMのレジスタにアクセスする.</li> - <li><code>const_i64</code>に対応する処理で呼び出されている <code>MVM_BC_get_I64</code> は, バイトコードにオフセットを足した箇所で指定されている数値を64gitの整数値として取り出す関数となっている</li> <li><code>cur_op</code>は次のバイトコード列が登録されており, マクロ <code>NEXT</code> で決められた方法で次のバイトコードに対応した処理に遷移する.</li> </ul> @@ -411,6 +439,7 @@ <ul> <li>CodeGearテーブルは引数としてINTERを受け取るCodeGearの配列として定義する</li> + <li>テーブルとして宣言することで、 バイトコードの数をそのままテーブルに反映させる事が可能である</li> </ul> <pre><code>__code (* CODES[])(INTERP) = { @@ -538,66 +567,6 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="moarvmのデバッグ手法">MoarVMのデバッグ手法</h2> - -<ul> - <li>MoarVMはバイトコードをランダムに生成する仕様となっている - <ul> - <li>一旦moarvmバイトコードとして出力したファイルを実行する場合は同じ処理内容となっている</li> - </ul> - </li> - <li>そのため, MoarVMのデバッグは同じバイトコードを入力として与え, オリジナルのMoarVMと並列してgdbを用いてトレースを行う.</li> - <li>この際, 実行するバイトコードの数が膨大となるので, scriptコマンドを用いて実行するバイトコードの番号を吐き出し, ログファイルを用いて比較する.</li> -</ul> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="moarvmのデバッグ時のbreak-point">MoarVMのデバッグ時のbreak point</h2> - -<ul> - <li>CbC側では次のバイトコードの遷移は <code>cbc_next</code> というCodeGearで行う</li> - <li>CodeGearは関数として扱える為, これに直接break pointを設定する</li> -</ul> - -<pre><code>(gdb) b cbc_next -Breakpoint 2 at 0x7ffff7560288: file src/core/cbc-interp.cbc, line 61. -(gdb) command 2 -Type commands for breakpoint(s) 2, one per line. -End with a line saying just "end". ->p CODES[*(MVMuint16 *)i->cur_op] ->p *(MVMuint16 *)i->cur_op ->c ->end -</code></pre> -<ul> - <li>オリジナルの場合マクロである為, dummy関数をマクロに記述し, この関数にbreakpointを設定する</li> -</ul> - -<pre><code>dalmore gdb --args ../../MoarVM_Original/MoarVM/moar --libpath=src/vm/moar/stage0 gen/moar/stage1/nqp -(gdb) b dummy -Function "dummy" not defined. -Make breakpoint pending on future shared library load? (y or [n]) y -Breakpoint 1 (dummy) pending. -(gdb) command 1 -Type commands for breakpoint(s) 1, one per line. -End with a line saying just "end". ->up ->p *(MVMuint16 *)(cur_op) ->c ->end - -</code></pre> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> <h2 id="moarvmのトレース">MoarVMのトレース</h2> <ul>