comparison Paper/anatofuz.tex @ 55:a854cbfff245

update
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 19 Nov 2018 11:55:37 +0900
parents b3982cc4b0dc
children 6f876697210c
comparison
equal deleted inserted replaced
54:b3982cc4b0dc 55:a854cbfff245
12 tabsize=2, 12 tabsize=2,
13 frame=single, 13 frame=single,
14 basicstyle={\tt\footnotesize}, % 14 basicstyle={\tt\footnotesize}, %
15 identifierstyle={\footnotesize}, % 15 identifierstyle={\footnotesize}, %
16 commentstyle={\footnotesize\itshape}, % 16 commentstyle={\footnotesize\itshape}, %
17 keywordstyle={\footnotesize\bfseries}, % 17 keywordstyle={\footnotesize\ttfamily}, %
18 ndkeywordstyle={\footnotesize}, % 18 ndkeywordstyle={\footnotesize\ttfamily}, %
19 stringstyle={\footnotesize\ttfamily}, 19 stringstyle={\footnotesize\ttfamily},
20 breaklines=true, 20 breaklines=true,
21 captionpos=b, 21 captionpos=b,
22 columns=[l]{fullflexible}, % 22 columns=[l]{fullflexible}, %
23 xrightmargin=0zw, % 23 xrightmargin=0zw, %
114 gccはバージョン9.0.0に, clangは7.0.0に対応している. 114 gccはバージョン9.0.0に, clangは7.0.0に対応している.
115 115
116 \subsection{CbCコンパイラのバグ} 116 \subsection{CbCコンパイラのバグ}
117 % 局所変数のポインタを握ったままgotoするとtail callにならない 117 % 局所変数のポインタを握ったままgotoするとtail callにならない
118 CbCコンパイラは現在も開発中であり幾つかのバグが発見されている. 118 CbCコンパイラは現在も開発中であり幾つかのバグが発見されている.
119 まずCodeGear内で宣言した局所変数のポインタを別の変数などで確保した状態でgotoしてしまうとtail call最適化が切られる. 119 まずCodeGear内で宣言した局所変数のポインタを大域変数の配列などに保存した状態でgotoしてしまうとtail call最適化が無効となる.
120 これはただの関数呼び出しになってしまう為, 直接的な被害はないもののCbCとしての利点が損なわれてしまう. 120 これはただの関数呼び出しになってしまう為, 直接的な被害はないもののCbCとしての利点が損なわれてしまう.
121 また本来は操作しないはずのスタック領域の操作が入ってしまうため, プログラマの意図と反したスタックポインタなのど操作が行われてしまいバグが発生する可能性が存在する. 121 %また本来は操作しないはずのスタック領域の操作が入ってしまうため, プログラマの意図と反したスタックポインタなのど操作が行われてしまいバグが発生する可能性が存在する.
122 また, CbCの挙動としてCodeGearへの遷移時には軽量継続を行う為スタック領域の操作は行われないはずである.
123 しかし, 現状は配列にCodeGearのアドレスを代入し, 間接的に軽量継続を行おうとすると, スタック領域の操作が通常の関数呼び出しの様に行われてしまう.
122 124
123 \subsection{CbCとCの互換性} 125 \subsection{CbCとCの互換性}
124 CbCコンパイラは内部的に与えられているソースコードがCbCであるかどうかを判断する. 126 CbCコンパイラはコンパイル対象のソースコードがCbCであるかどうかを判断する.
125 この際にCodeGearを利用していない場合は通常のCプログラムとして動作する. 127 この際にCodeGearを利用していない場合は通常のCプログラムとして動作する.
126 その為今回検証するMoarVMのビルドにおいてもCbCで書き換えたソースコードがあるMoarVMと, 手を加えていないオリジナルのMoarVMの2種類を同一のCbCコンパイラでビルドする事が可能である. 128 その為今回検証するMoarVMのビルドにおいてもCbCで書き換えたソースコードがあるMoarVMと, 手を加えていないオリジナルのMoarVMの2種類を同一のCbCコンパイラでビルドする事が可能である.
127 129
128 またCからCbCへの遷移時に, 再びCの関数に戻るように実装したい場合がある. 130 またCからCbCへの遷移時に, 再びCの関数に戻るように実装したい場合がある.
129 その際は環境付きgotoと呼ばれる手法を取る.これは\_CbC\_return及び\_CbC\_environmentという変数を渡す. 131 その際は環境付きgotoと呼ばれる手法を取る.これは\_CbC\_return及び\_CbC\_environmentという変数を渡す.
184 \end{figure} 186 \end{figure}
185 187
186 \subsection{NQP} 188 \subsection{NQP}
187 189
188 RakudoにおけるNQP\cite{nqp}は現在MoarVM, JVM上で動作し,MoarVMを一部利用することでNodeJSからも動作させる事が可能である. 190 RakudoにおけるNQP\cite{nqp}は現在MoarVM, JVM上で動作し,MoarVMを一部利用することでNodeJSからも動作させる事が可能である.
189 NQPはPerl6のサブセットであるため主な文法などはPerl6に準拠しているが幾つか異なる点が存在する. 191 NQPはPerl6のサブセットであるため, 主な文法などはPerl6に準拠しているが幾つか異なる点が存在する.
190 NQPは最終的にはNQP自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれたMoarvMByteCodeを必要とする. 192 NQPは最終的にはNQP自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれたMoarvMByteCodeを必要とする.
191 このMoarVMByteCodeの状態をStage0と言い, ディレクトリ名として設定されている. 193 このMoarVMByteCodeの状態をStage0と言い, ディレクトリ名として設定されている.
192 Perl6の一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる. 194 Perl6の一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM, VMに対応させる様にビルドしたNQPがそれぞれ必要となる.
193 現在のNQPではMoarVM, JVMに対応するStage0はそれぞれMoarVMBytecode,jarファイルが用意されており,JavaScriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. 195 現在のNQPではMoarVM, JVMに対応するStage0はそれぞれMoarVMBytecode, jarファイルが用意されており, JavaScriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている.
194 MoarVMのModuleLoaderはStage0にあるMoarVMBytecodeで書かれた一連のファイルが該当する. 196 MoarVMのModuleLoaderはStage0にあるMoarVMBytecodeで書かれた一連のファイルが該当する.
195 197
196 198
197 Stage0にあるファイルをMoarVMに与えることでNQPのインタプリタが実行される様になっている. 199 Stage0にあるファイルをMoarVMに与えることで, NQPのインタプリタが実行される様になっている.
198 これはStage0の一連のファイルはMoarVMBytecodeなどで記述されたNQPコンパイラのモジュールである為である. 200 これはStage0の一連のファイルは, MoarVMBytecodeなどで記述されたNQPコンパイラのモジュールである為である.
199 NQPのインタプリタはセルフビルドが完了するとnqpというシェルスクリプトとして提供される. 201 NQPのインタプリタはセルフビルドが完了すると, nqpというシェルスクリプトとして提供される.
200 このシェルスクリプトはイブラリパスなどを設定してのバイナリであるmoarを起動するものである. 202 このシェルスクリプトは, ライブラリパスなどを設定してのバイナリであるmoarを起動するものである.
201 %NQPは6modelと呼ばれるオブジェクトモデルを採用としている.%が, これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.MoarVMである. 203 %NQPは6modelと呼ばれるオブジェクトモデルを採用としている.%が, これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.MoarVMである.
202 %MoarVMに対してStage0のディレクトリにライブラリパスを設定し, nqp.MoarVMを実行させることでnqpの対話型環境が起動する. 204 %MoarVMに対してStage0のディレクトリにライブラリパスを設定し, nqp.MoarVMを実行させることでnqpの対話型環境が起動する.
203 205
204 \begin{figure}[ht] 206 \begin{figure}[ht]
205 \begin{center} 207 \begin{center}
434 またNQPのリポジトリに付随するテストはnqpで書かれている為, NQPをビルド出来ない場合MoarVMのテストを行う事が出来ない. 436 またNQPのリポジトリに付随するテストはnqpで書かれている為, NQPをビルド出来ない場合MoarVMのテストを行う事が出来ない.
435 その為, 正常に動作しているMoarVMとNQPを用意し, このNQP側からMoarVMByteCodeにNQPのテストを変換する. 437 その為, 正常に動作しているMoarVMとNQPを用意し, このNQP側からMoarVMByteCodeにNQPのテストを変換する.
436 変換されたMoarVMByteCodeはMoarバイナリに渡す事で実行可能であり, テストを行う事が出来る. 438 変換されたMoarVMByteCodeはMoarバイナリに渡す事で実行可能であり, テストを行う事が出来る.
437 439
438 \subsection{CbCコンパイラによるバグ} 440 \subsection{CbCコンパイラによるバグ}
439 現在までのCbCは複数個の入出力をCodeGearに与えるユースケースで利用していた. 441 これまでのCbCに関する研究においては, 複数個の入出力をCodeGearに与えるユースケースで利用していた.
440 CbCコンパイラ自身はそれぞれ用意したテストスイートを通化するものの, MoarVMの様な巨大なプロジェクトのCodeGearをコンパイルを実行する場合,予期せぬバグが発生した. 442 CbCコンパイラ自身はそれぞれ用意したテストスイートを通化するものの, MoarVMの様な巨大なプロジェクトのCodeGearをコンパイルを実行する場合,予期せぬバグが発生した.
441 主にCodeGear間のgotoにおけるtail callフラグの除去や, DataGearとして渡している構造体の変数のアドレスがスタックポインタの値より上位に来てしまい,通常のCの関数をcallした際にローカル変数の領域がDataGearのアドレスの周辺を利用してしまう. 443 主にCodeGear間のgotoにおけるtail callフラグの除去や, DataGearとして渡している構造体の変数のアドレスがスタックポインタの値より上位に来てしまい,通常のCの関数をcallした際にローカル変数の領域がDataGearのアドレスの周辺を利用してしまう.
442 その為DataGearの構造体の値が書き換わり, CからDataGearにreturnした際にDataGearの構造体が破壊されるバグである. 444 その為DataGearの構造体の値が書き換わり, CからDataGearにreturnした際にDataGearの構造体が破壊されるバグである.
443 このバグは先程の並列デバッグを行いながらプログラムカウンタや変数の動きをトレースする事などで発見することが出来る. 445 このバグは先程の並列デバッグを行いながらプログラムカウンタや変数の動きをトレースする事などで発見することが出来る.
444 現状ではCbCコンパイラがプログラマの意図と反する挙動を取るためCbCコンパイラのバグを回避するプログラミングが要求されている. 446 現状ではCbCコンパイラがプログラマの意図と反する挙動を取るためCbCコンパイラのバグを回避するプログラミングが要求されている.