comparison Paper/anatofuz.tex @ 46:b2d28fb0b7a3

tweak anatofuz.tex
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 09 Nov 2018 16:11:54 +0900
parents e9d84f38fd2a
children 6fc015dd380b
comparison
equal deleted inserted replaced
45:e9d84f38fd2a 46:b2d28fb0b7a3
131 通常c\_funcの返り値は-1であるが,csから環境付き継続でmainに帰る為にcsから渡される1がtestの値となる. 131 通常c\_funcの返り値は-1であるが,csから環境付き継続でmainに帰る為にcsから渡される1がtestの値となる.
132 132
133 133
134 \subsection{言語処理系におけるCbCの応用} 134 \subsection{言語処理系におけるCbCの応用}
135 CbCを言語処理系,特にスクリプト言語に応用すると幾つかの箇所に置いて利点があると推測される. 135 CbCを言語処理系,特にスクリプト言語に応用すると幾つかの箇所に置いて利点があると推測される.
136 CbCにおけるCSはコンパイラの基本ブロックに相当する. 136 CbCにおけるCodeGearはコンパイラの基本ブロックに相当する.
137 その為従来のスクリプト言語では主にcase文で記述していた命令コードディスパッチの箇所をCodeGearの遷移として記述する事が可能である. 137 その為従来のスクリプト言語では主にcase文で記述していた命令コードディスパッチの箇所をCodeGearの遷移として記述する事が可能である.
138 CbCは状態を単位として記述が可能であるため,命令コードなどにおける状態を利用するスクリプト言語の実装は応用例として適していると考えられる. 138 CbCは状態を単位として記述が可能であるため,命令コードなどにおける状態を利用するスクリプト言語の実装は応用例として適していると考えられる.
139 139
140 \section{Perl6の概要} 140 \section{Perl6の概要}
141 この章では現在までのPerl6の遍歴及びPerl6の言語的な特徴について記載する. 141 この章では現在までのPerl6の遍歴及びPerl6の言語的な特徴について記載する.
142 \subsection{Perl6の構想と初期の処理系} 142 \subsection{Perl6の構想と初期の処理系}
143 Perl6は2002年にLarryWallがPerlを置き換える言語として設計を開始した. 143 Perl6は2002年にLarryWallがPerlを置き換える言語として設計を開始した.
144 Perl5の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された. 144 Perl5の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された.
145 Perl5は設計と実装が同一であり,Larryらによって書かれたC実装のみだった.Perl6は設計と実装が分離しており様々な処理系が開発されきた. 145 Perl5は設計と実装が同一であり,Larryらによって書かれたC実装のみだった.Perl6は設計と実装が分離しており様々な処理系が開発されてきた.
146 まず2005年に唐鳳によってHaskellで実装されたPugs\cite{pugs}が登場した. 146 まず2005年に唐鳳によってHaskellで実装されたPugs\cite{pugs}が登場した.
147 Pugsは最初に登場したPerl6実装であり,この実装を基にしてPerl6の仕様も修正された. 147 Pugsは最初に登場したPerl6実装であり,この実装を基にしてPerl6の仕様も修正された.
148 現在Pugsは歴史的な実装となっており,更新はされていない. 148 現在Pugsは歴史的な実装となっており,更新はされていない.
149 149
150 \subsection{Parrot} 150 \subsection{Parrot}
186 NQPはPerl6のサブセットであるため主な文法などはPerl6に準拠しているが幾つか異なる点が存在する. 186 NQPはPerl6のサブセットであるため主な文法などはPerl6に準拠しているが幾つか異なる点が存在する.
187 NQPは最終的にはNQP自身でブートストラップする言語であるが,ビルドの最初にはすでに書かれたMoarvMByteCodeを必要とする. 187 NQPは最終的にはNQP自身でブートストラップする言語であるが,ビルドの最初にはすでに書かれたMoarvMByteCodeを必要とする.
188 このMoarVM~yteCodeの状態をStage0と言い,ディレクトリ名として設定されている. 188 このMoarVM~yteCodeの状態をStage0と言い,ディレクトリ名として設定されている.
189 Perl6の一部はNQPを拡張したもので書かれている為,Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる. 189 Perl6の一部はNQPを拡張したもので書かれている為,Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる.
190 現在のNQPではMoarVM,JVMに対応するStage0はそれぞれMoarVMBytecode,jarファイルが用意されており,Javascriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. 190 現在のNQPではMoarVM,JVMに対応するStage0はそれぞれMoarVMBytecode,jarファイルが用意されており,Javascriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている.
191 MoarVMのModuleLoaderはStage0あるMoarVMBytecodeで書かれた一連のファイルが該当する. 191 MoarVMのModuleLoaderはStage0にあるMoarVMBytecodeで書かれた一連のファイルが該当する.
192 192
193 193
194 Stage0にあるファイルをmoarvmに与えることでnqpのインタプリタが実行される様になっている. 194 Stage0にあるファイルをMoarVMに与えることでnqpのインタプリタが実行される様になっている.
195 これはStage0の一連のファイルはmoarvm bytecodeなどで記述されたNQPコンパイラのモジュールである為である. 195 これはStage0の一連のファイルはMoarVM bytecodeなどで記述されたNQPコンパイラのモジュールである為である.
196 NQPは6modelと呼ばれるオブジェクトモデルを採用としているが,これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.moarvmである. 196 NQPは6modelと呼ばれるオブジェクトモデルを採用としているが,これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.MoarVMである.
197 MoarVMに対してStage0のディレクトリにライブラリパスを設定し,nqp.moarvmを実行させることでnqpの対話型環境が起動する. 197 MoarVMに対してStage0のディレクトリにライブラリパスを設定し,nqp.MoarVMを実行させることでnqpの対話型環境が起動する.
198 198
199 \begin{figure}[ht] 199 \begin{figure}[ht]
200 \begin{center} 200 \begin{center}
201 \includegraphics[width=70mm]{fig/stagenqp.pdf} 201 \includegraphics[width=70mm]{fig/stagenqp.pdf}
202 \end{center} 202 \end{center}
223 またPerl6は漸進的型付け言語である. 223 またPerl6は漸進的型付け言語である.
224 従来のPerlの様に変数に代入する対象の型や文脈に応じて型を変更する動的型言語としての側面を持ちつつ独自に定義した型を始めとする様々な型に静的に変数の型を設定する事が可能である. 224 従来のPerlの様に変数に代入する対象の型や文脈に応じて型を変更する動的型言語としての側面を持ちつつ独自に定義した型を始めとする様々な型に静的に変数の型を設定する事が可能である.
225 225
226 226
227 \subsection{現在のPerl6} 227 \subsection{現在のPerl6}
228 Perl6の言語仕様\cite{perl6design}とその時点での実装状況を纏めた公式ドキュメント\cite{perl6doc}は分離している. 228 Perl6の言語仕様\cite{perl6design}とその時点での実装状況をまとめた公式ドキュメント\cite{perl6doc}は分離している.
229 従来は言語仕様は自然言語の仕様書であったが,現在はテストスイートである「Roast\cite{roast}」そのものと定義されている. 229 従来は言語仕様は自然言語の仕様書であったが,現在はテストスイートである「Roast\cite{roast}」そのものと定義されている.
230 現在のPerl6の仕様を読む場合Roastを確認し,現在rakudo上に実装されている機能を見る場合は公式ドキュメントを確認する必要がある. 230 現在のPerl6の仕様を読む場合Roastを確認し,現在rakudo上に実装されている機能を見る場合は公式ドキュメントを確認する必要がある.
231 231
232 \subsection{処理速度} 232 \subsection{処理速度}
233 現在のPerl6が他のプログラミング言語と比較した場合どのような違いがでるのか計測した. 233 現在のPerl6が他のプログラミング言語と比較した場合どのような違いがでるのか計測した.
344 この中で実線で書かれている部分はCbCのgoto文で遷移し,波線の箇所は通常のCの関数呼び出しとなっている. 344 この中で実線で書かれている部分はCbCのgoto文で遷移し,波線の箇所は通常のCの関数呼び出しとなっている.
345 345
346 現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextが行っていた. 346 現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextが行っていた.
347 その為cbc\_nextから命令コードに対応するCodeGearに継続し,CodeGearからcbc\_nextに継続するサイクルが基本の流れである. 347 その為cbc\_nextから命令コードに対応するCodeGearに継続し,CodeGearからcbc\_nextに継続するサイクルが基本の流れである.
348 CodeGear内からCの関数は問題なく呼ぶ事が可能であるため,Cの関数を利用する処理は変更せず記述する事ができる. 348 CodeGear内からCの関数は問題なく呼ぶ事が可能であるため,Cの関数を利用する処理は変更せず記述する事ができる.
349 また変換対象はswitch文であるため,breakせず下に落ちた場合に対応するように別のCodeGearに継続し,その後cbc\_nextに継続するパターンも存在する. 349 また変換対象はswitch文であるため,breakせず次のcaseに移行した場合に対応するように別のCodeGearに継続し,その後cbc\_nextに継続するパターンも存在する.
350 350
351 \lstinputlisting[label=cbc_codesegs_c, caption=CbCMoarVMのバイトコードに対応するCodeGear]{./src/cbc_codesegs.cbc} 351 \lstinputlisting[label=cbc_codesegs_c, caption=CbCMoarVMのバイトコードに対応するCodeGear]{./src/cbc_codesegs.cbc}
352 352
353 \begin{figure}[ht] 353 \begin{figure}[ht]
354 \begin{center} 354 \begin{center}
417 417
418 MoarVM自体のデバッグはMoarVMのリポジトリにテストコードが付随していない為単体では実行不可能である. 418 MoarVM自体のデバッグはMoarVMのリポジトリにテストコードが付随していない為単体では実行不可能である.
419 本研究ではMoarVMのデバッグにおけるCデバッガの使用方法とMoarVMのテスト方法についても考案する. 419 本研究ではMoarVMのデバッグにおけるCデバッガの使用方法とMoarVMのテスト方法についても考案する.
420   420  
421 \subsection{MoarVMのBytecodeのデバッグ} 421 \subsection{MoarVMのBytecodeのデバッグ}
422 moarに対してmoarvm bytecodeをdumpオプションを付けて読み込ませるとmoarvmのbytecodeがアセンブラの様に出力される. 422 moarに対してMoarVM bytecodeをdumpオプションを付けて読み込ませるとMoarVMのbytecodeがアセンブラの様に出力される.
423 しかしこれはmoarvmが実行したbytecodeのトレースではなくmoarvm bytecodeを変換したものに過ぎない. 423 しかしこれはMoarVMが実行したbytecodeのトレースではなくMoarVM bytecodeを変換したものに過ぎない.
424 また,明らかに異なる挙動を示す両者のmoarを利用しても同じ結果が返ってきてしまう. 424 また,明らかに異なる挙動を示す両者のmoarを利用しても同じ結果が返ってきてしまう.
425 そのため今回のMoarVMBytecodeインタプリタの実装のデバッグにはこの方法は適さない. 425 そのため今回のMoarVMBytecodeインタプリタの実装のデバッグにはこの方法は適さない.
426 従って実際に実行した命令を確認するにはgdbなどのCデバッガを利用してMoarVMを直接トレースする必要がある. 426 従って実際に実行した命令を確認するにはgdbなどのCデバッガを利用してMoarVMを直接トレースする必要がある.
427 427
428 CbC側はCode\ref{cbc_b}に示す様にcbc\_nextにbreak pointを設定する. 428 CbC側はCode\ref{cbc_b}に示す様にcbc\_nextにbreak pointを設定する.
457 457
458 458
459 \subsection{CbCコンパイラによるバグ} 459 \subsection{CbCコンパイラによるバグ}
460 現在までのCbCは複数個の入出力をCodeGearに与えるユースケースで利用していた. 460 現在までのCbCは複数個の入出力をCodeGearに与えるユースケースで利用していた.
461 CbCコンパイラ自身はそれぞれ用意したテストスイートを通化するものの,MoarVMの様な巨大なプロジェクトのCSをコンパイルを実行する場合,予期せぬバグが発生した. 461 CbCコンパイラ自身はそれぞれ用意したテストスイートを通化するものの,MoarVMの様な巨大なプロジェクトのCSをコンパイルを実行する場合,予期せぬバグが発生した.
462 主にCS間のgotoにおけるtail callフラグの除去や,DSとして渡している構造体の変数のアドレスがスタックポインタの値より上位に来てしまい,通常のCの関数をcallした際にローカル変数の領域がDSのアドレスの周辺を利用してしまう. 462 主にCodeGear間のgotoにおけるtail callフラグの除去や,DataGearとして渡している構造体の変数のアドレスがスタックポインタの値より上位に来てしまい,通常のCの関数をcallした際にローカル変数の領域がDataGearのアドレスの周辺を利用してしまう.
463 その為DSの構造体の値が書き換わり,CからDSにreturnした際にDSの構造体が破壊されるバグである. 463 その為DataGearの構造体の値が書き換わり,CからDataGearにreturnした際にDataGearの構造体が破壊されるバグである.
464 このバグは先程の並列デバッグを行いながらプログラムカウンタや変数の動きをトレースする事などで発見することが出来る. 464 このバグは先程の並列デバッグを行いながらプログラムカウンタや変数の動きをトレースする事などで発見することが出来る.
465 現状ではCbCコンパイラがプログラマの意図と反する挙動を取るためCbCコンパイラのバグを回避するプログラミングが要求されている. 465 現状ではCbCコンパイラがプログラマの意図と反する挙動を取るためCbCコンパイラのバグを回避するプログラミングが要求されている.
466 本来コンパイラ側のバグを回避するプログラミングをプログラマに要求する事は好ましくない. 466 本来コンパイラ側のバグを回避するプログラミングをプログラマに要求する事は好ましくない.
467 従ってCbCコンパイラ自身の信頼性を向上させる事も今後の課題となっている. 467 従ってCbCコンパイラ自身の信頼性を向上させる事も今後の課題となっている.
468 468
545 545
546 今後CbCでの開発をより深く行っていくにあたり,CbCコンパイラそのものの信頼性を向上させる必要がある. 546 今後CbCでの開発をより深く行っていくにあたり,CbCコンパイラそのものの信頼性を向上させる必要がある.
547 MoarVMの開発を行うにあたり新たに発見された複数のバグを修正し,より安定するコンパイラにする為に改良を行う. 547 MoarVMの開発を行うにあたり新たに発見された複数のバグを修正し,より安定するコンパイラにする為に改良を行う.
548 548
549 現在CbCMoarVMで直接バイトコードを入力した場合のnqpのテストはおおよそパスする. 549 現在CbCMoarVMで直接バイトコードを入力した場合のnqpのテストはおおよそパスする.
550 また数値の計算と出力などの簡単なNQPの例題を作成し,オリジナルのNQP,moarvmでバイトコード化したものを入力した際も正常に動作している. 550 また数値の計算と出力などの簡単なNQPの例題を作成し,オリジナルのNQP,MoarVMでバイトコード化したものを入力した際も正常に動作している.
551 しかしNQPのセルフビルドは現在オブジェクトの生成に一部失敗している為成功していない. 551 しかしNQPのセルフビルドは現在オブジェクトの生成に一部失敗している為成功していない.
552 今後はさらに複雑な例題やNQPのセルフビルド,Perl6の動作を行っていく. 552 今後はさらに複雑な例題やNQPのセルフビルド,Perl6の動作を行っていく.
553 553
554 MoarVMではGCからオブジェクトを守る為にMVMROOTというマクロを利用し,局所変数のポインタをスタックに登録する処理を行っている. 554 MoarVMではGCからオブジェクトを守る為にMVMROOTというマクロを利用し,局所変数のポインタをスタックに登録する処理を行っている.
555 GCの制御を効率的に行えば本来は必要ない処理であり,実行するとCodeGearの優位性が損なわれてしまう. 555 GCの制御を効率的に行えば本来は必要ない処理であり,実行するとCodeGearの優位性が損なわれてしまう.