# HG changeset patch # User Takahiro SHIMIZU # Date 1542596137 -32400 # Node ID a854cbfff245628bf90937896dd1a2a29630ab30 # Parent b3982cc4b0dc83ae86838a25c5a9d96b5aeb754b update diff -r b3982cc4b0dc -r a854cbfff245 Paper/anatofuz.pdf Binary file Paper/anatofuz.pdf has changed diff -r b3982cc4b0dc -r a854cbfff245 Paper/anatofuz.tex --- a/Paper/anatofuz.tex Mon Nov 19 10:54:44 2018 +0900 +++ b/Paper/anatofuz.tex Mon Nov 19 11:55:37 2018 +0900 @@ -14,8 +14,8 @@ basicstyle={\tt\footnotesize}, % identifierstyle={\footnotesize}, % commentstyle={\footnotesize\itshape}, % - keywordstyle={\footnotesize\bfseries}, % - ndkeywordstyle={\footnotesize}, % + keywordstyle={\footnotesize\ttfamily}, % + ndkeywordstyle={\footnotesize\ttfamily}, % stringstyle={\footnotesize\ttfamily}, breaklines=true, captionpos=b, @@ -116,12 +116,14 @@ \subsection{CbCコンパイラのバグ} % 局所変数のポインタを握ったままgotoするとtail callにならない CbCコンパイラは現在も開発中であり幾つかのバグが発見されている. -まずCodeGear内で宣言した局所変数のポインタを別の変数などで確保した状態でgotoしてしまうとtail call最適化が切られる. +まずCodeGear内で宣言した局所変数のポインタを大域変数の配列などに保存した状態でgotoしてしまうとtail call最適化が無効となる. これはただの関数呼び出しになってしまう為, 直接的な被害はないもののCbCとしての利点が損なわれてしまう. -また本来は操作しないはずのスタック領域の操作が入ってしまうため, プログラマの意図と反したスタックポインタなのど操作が行われてしまいバグが発生する可能性が存在する. +%また本来は操作しないはずのスタック領域の操作が入ってしまうため, プログラマの意図と反したスタックポインタなのど操作が行われてしまいバグが発生する可能性が存在する. +また, CbCの挙動としてCodeGearへの遷移時には軽量継続を行う為スタック領域の操作は行われないはずである. +しかし, 現状は配列にCodeGearのアドレスを代入し, 間接的に軽量継続を行おうとすると, スタック領域の操作が通常の関数呼び出しの様に行われてしまう. \subsection{CbCとCの互換性} -CbCコンパイラは内部的に与えられているソースコードがCbCであるかどうかを判断する. +CbCコンパイラはコンパイル対象のソースコードがCbCであるかどうかを判断する. この際にCodeGearを利用していない場合は通常のCプログラムとして動作する. その為今回検証するMoarVMのビルドにおいてもCbCで書き換えたソースコードがあるMoarVMと, 手を加えていないオリジナルのMoarVMの2種類を同一のCbCコンパイラでビルドする事が可能である. @@ -186,18 +188,18 @@ \subsection{NQP} RakudoにおけるNQP\cite{nqp}は現在MoarVM, JVM上で動作し,MoarVMを一部利用することでNodeJSからも動作させる事が可能である. -NQPはPerl6のサブセットであるため主な文法などはPerl6に準拠しているが幾つか異なる点が存在する. +NQPはPerl6のサブセットであるため, 主な文法などはPerl6に準拠しているが幾つか異なる点が存在する. NQPは最終的にはNQP自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれたMoarvMByteCodeを必要とする. このMoarVMByteCodeの状態をStage0と言い, ディレクトリ名として設定されている. -Perl6の一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる. -現在のNQPではMoarVM, JVMに対応するStage0はそれぞれMoarVMBytecode,jarファイルが用意されており,JavaScriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. +Perl6の一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM, VMに対応させる様にビルドしたNQPがそれぞれ必要となる. +現在のNQPではMoarVM, JVMに対応するStage0はそれぞれMoarVMBytecode, jarファイルが用意されており, JavaScriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. MoarVMのModuleLoaderはStage0にあるMoarVMBytecodeで書かれた一連のファイルが該当する. -Stage0にあるファイルをMoarVMに与えることでNQPのインタプリタが実行される様になっている. -これはStage0の一連のファイルはMoarVMBytecodeなどで記述されたNQPコンパイラのモジュールである為である. -NQPのインタプリタはセルフビルドが完了するとnqpというシェルスクリプトとして提供される. -このシェルスクリプトはイブラリパスなどを設定してのバイナリであるmoarを起動するものである. +Stage0にあるファイルをMoarVMに与えることで, NQPのインタプリタが実行される様になっている. +これはStage0の一連のファイルは, MoarVMBytecodeなどで記述されたNQPコンパイラのモジュールである為である. +NQPのインタプリタはセルフビルドが完了すると, nqpというシェルスクリプトとして提供される. +このシェルスクリプトは, ライブラリパスなどを設定してのバイナリであるmoarを起動するものである. %NQPは6modelと呼ばれるオブジェクトモデルを採用としている.%が, これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.MoarVMである. %MoarVMに対してStage0のディレクトリにライブラリパスを設定し, nqp.MoarVMを実行させることでnqpの対話型環境が起動する. @@ -436,7 +438,7 @@ 変換されたMoarVMByteCodeはMoarバイナリに渡す事で実行可能であり, テストを行う事が出来る. \subsection{CbCコンパイラによるバグ} -現在までのCbCは複数個の入出力をCodeGearに与えるユースケースで利用していた. +これまでのCbCに関する研究においては, 複数個の入出力をCodeGearに与えるユースケースで利用していた. CbCコンパイラ自身はそれぞれ用意したテストスイートを通化するものの, MoarVMの様な巨大なプロジェクトのCodeGearをコンパイルを実行する場合,予期せぬバグが発生した. 主にCodeGear間のgotoにおけるtail callフラグの除去や, DataGearとして渡している構造体の変数のアドレスがスタックポインタの値より上位に来てしまい,通常のCの関数をcallした際にローカル変数の領域がDataGearのアドレスの周辺を利用してしまう. その為DataGearの構造体の値が書き換わり, CからDataGearにreturnした際にDataGearの構造体が破壊されるバグである. diff -r b3982cc4b0dc -r a854cbfff245 Paper/reference.bib --- a/Paper/reference.bib Mon Nov 19 10:54:44 2018 +0900 +++ b/Paper/reference.bib Mon Nov 19 11:55:37 2018 +0900 @@ -8,7 +8,7 @@ @Misc{pugs, title = {Pugs: A Perl 6 Implementation}, - howpublished = {\url{http://hackage.haskell.org/package/Pugs}}, + howpublished = {\url{http://hackage.haskell.org/package/Pugs/}}, } @misc{perl6doc,