# HG changeset patch # User Takahiro SHIMIZU # Date 1542609236 -32400 # Node ID 1b870498dedb334412dc35793455007bcdd5deca # Parent 39906cf074cf7cec8ce731e1ee8b624afc304af8 tweak diff -r 39906cf074cf -r 1b870498dedb Paper/anatofuz.pdf Binary file Paper/anatofuz.pdf has changed diff -r 39906cf074cf -r 1b870498dedb Paper/anatofuz.tex --- a/Paper/anatofuz.tex Mon Nov 19 14:28:37 2018 +0900 +++ b/Paper/anatofuz.tex Mon Nov 19 15:33:56 2018 +0900 @@ -142,6 +142,8 @@ その為従来のスクリプト言語では主にcase文で記述していた命令コードディスパッチの箇所をCodeGearの遷移として記述する事が可能である. 通常の言語処理系では命令コードディスパッチ部分は巨大なcase文となり, この部分を実装したCファイルが巨大化してしまう. CodeGearを導入することで巨大なcase文をCodeGearとして分割する事が可能となり, 処理のモジュール化が可能となる. +また, CodeGearとCodeGear間の遷移は軽量継続で行われる為, レジスタレベルでの最適化も可能となる. + CbCは状態を単位として記述が可能であるため, 命令コードなどにおける状態を利用するスクリプト言語の実装は応用例として適していると考えられる. \section{Perl6の概要} @@ -201,9 +203,9 @@ RakudoにおけるNQP\cite{nqp}は現在MoarVM, JVM上で動作し, MoarVMを一部利用することでNodeJSからも動作させる事が可能である. NQPはPerl6のサブセットであるため, 主な文法などはPerl6に準拠しているが幾つか異なる点が存在する. NQPは最終的にはNQP自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれたMoarVMのバイトコードを必要とする. -このMoarVMByteCodeの状態をStage0と言い, ディレクトリ名として設定されている. +このMoarVMのバイトコードの状態をStage0と言う.%い, バイトコードが付随するソースディレクトリ内のディレクトリ名として設定されている. Perl6の一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM, VMに対応させる様にビルドしたNQPがそれぞれ必要となる. -現在のNQPではMoarVM, JVMに対応するStage0はそれぞれMoarVMBytecode, jarファイルが用意されており, JavaScriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. +現在のNQPではMoarVM, JVMに対応するStage0はそれぞれMoarVMのバイトコード, jarファイルが用意されており, JavaScriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. MoarVMのModuleLoaderはStage0にあるMoarVMのバイトコードで書かれた一連のファイルが該当する. @@ -407,7 +409,7 @@ \subsection{MoarVMのバイトコードのデバッグ} MoarVMの実行バイナリであるコマンドmoarに対して, MoarVMのバイトコードをdumpオプションを付けて読み込ませると, MoarVMのバイトコードがアセンブラの様に出力される. -しかしこれはMoarVMが実行したbytecodeのトレースではなくMoarVMのバイトコードを変換したものに過ぎない. +しかしこれはMoarVMが実行したバイトコードのトレースではなく, MoarVMのバイトコードを変換したものに過ぎない. また, 明らかに異なる挙動を示すオリジナルのMoarVMと, CbCで書き換えたCbCMoarVM両者のmoarを利用しても同じ結果が返ってきてしまう. そのため今回のMoarVMのバイトコードインタプリタの実装のデバッグにはこの方法は適さない. 従って実際に実行した命令を確認するにはgdbなどのCデバッガを利用してMoarVMを直接トレースする必要がある.