Mercurial > hg > Papers > 2019 > anatofuz-prosym
comparison Paper/anatofuz.tex @ 31:5b5fb929c67f
update abotu MoarBM
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 09 Nov 2018 10:19:09 +0900 |
parents | 765dc5c49ae1 |
children | 43e0cf46d40b |
comparison
equal
deleted
inserted
replaced
30:abc5a12b8761 | 31:5b5fb929c67f |
---|---|
260 | 260 |
261 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為,バイトコードの名前はLABELSの配列の添字に変換されている. | 261 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為,バイトコードの名前はLABELSの配列の添字に変換されている. |
262 そのため対象となるCodeSegmentをLABLESの並びと対応させ,配列CODESに設定すればCodeSegmentの名前は問わない. | 262 そのため対象となるCodeSegmentをLABLESの並びと対応させ,配列CODESに設定すればCodeSegmentの名前は問わない. |
263 今回はCodeSegmentである事を示す為にsuffixとしてcbc\_をつける. | 263 今回はCodeSegmentである事を示す為にsuffixとしてcbc\_をつける. |
264 | 264 |
265 | |
265 命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが,これらはMVM\_interp\_run内のローカル変数として利用している. | 266 命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが,これらはMVM\_interp\_run内のローカル変数として利用している. |
266 ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが,CodeSegment間の移動で命令を表現するCbCではアクセスできない. | 267 ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが,CodeSegment間の移動で命令を表現するCbCではアクセスできない. |
267 その為インタプリタの情報を集約した構造体interを定義し,この構造体へのポインタであるINTERP型の変数iをCodeSegmentの入出力として与える. | 268 その為インタプリタの情報を集約した構造体interを定義し,この構造体へのポインタであるINTERP型の変数iをCodeSegmentの入出力として与える. |
268 CodeSegment内ではINTERPを経由することでインタプリタの各種情報にアクセスする. | 269 CodeSegment内ではINTERPを経由することでインタプリタの各種情報にアクセスする. |
269 CodeSegment間の遷移ではレジスタの値の調整は行われない為,入力引数を使ってレジスタマッピングを管理できる. | 270 CodeSegment間の遷移ではレジスタの値の調整は行われない為,入力引数を使ってレジスタマッピングを管理できる. |
284 \includegraphics[width=70mm]{fig/cbc_next.pdf} | 285 \includegraphics[width=70mm]{fig/cbc_next.pdf} |
285 \end{center} | 286 \end{center} |
286 \caption{CbCにおけるインタプリタの関数遷移} | 287 \caption{CbCにおけるインタプリタの関数遷移} |
287 \label{fig:perl6cbcinter} | 288 \label{fig:perl6cbcinter} |
288 \end{figure} | 289 \end{figure} |
290 | |
291 バイトコードの数は膨大である為,すべてを手作業で変換する事は望ましくない. | |
292 本研究ではPerlScriptを用いてinterp.cからCbCのCodeSegmentを自動生成するスクリプトを作成した. | |
293 このスクリプトでは以下の修正手続きを実行する. | |
294 | |
295 \begin{itemize} | |
296 \item OP(.*)の.*部分をCodeSegmentの名前として,先頭にcbc\_をつけた上で設定する. | |
297 \item cur\_opなど構造体INTERのメンバ変数はポインタiから参照するように修正する | |
298 \item GC対策のためマクロMVMROOTを使い局所変数のポインタをスタックに積む箇所は,局所変数をstatic化する | |
299 \item 末尾のgoto NEXTをgoto cbc\_next(i)に修正する | |
300 \item case文で下のcase文に落ちている箇所は,case文に対応するCodeSegmentに遷移する様に末尾を付け加える | |
301 \end{itemize} | |
302 | |
289 | 303 |
290 現在CbCで記述されたOSであるGearsOSにはInterfaceが導入されている. | 304 現在CbCで記述されたOSであるGearsOSにはInterfaceが導入されている. |
291 これはJavaのinterface,Haskellの型クラスに該当する概念であり,次のCodeSegmentにInterface経由で継続する事が可能である. | 305 これはJavaのinterface,Haskellの型クラスに該当する概念であり,次のCodeSegmentにInterface経由で継続する事が可能である. |
292 Interfaceは現在のMoarVMには実装されていない為,今後ThreadeCodeの実装を行うにあたり導入を検討している. | 306 Interfaceは現在のMoarVMには実装されていない為,今後ThreadeCodeの実装を行うにあたり導入を検討している. |
293 | 307 |
320 PerlccはPerlのバイトコードをCへの変換のみ行う為,Cで実装されているPerl経由で実行した場合と処理速度はほぼ変わらない. | 334 PerlccはPerlのバイトコードをCへの変換のみ行う為,Cで実装されているPerl経由で実行した場合と処理速度はほぼ変わらない. |
321 またPerlccで生成されたCのソースコードは難解であり,これをデバッグするのが困難でもある. | 335 またPerlccで生成されたCのソースコードは難解であり,これをデバッグするのが困難でもある. |
322 MoarVMでthreaded codeを実現出来た場合,その箇所のみCbCプログラムとして切り出す事が可能である為perlccと似たツールを作成することも可能である. | 336 MoarVMでthreaded codeを実現出来た場合,その箇所のみCbCプログラムとして切り出す事が可能である為perlccと似たツールを作成することも可能である. |
323 この場合,Perl6を通常動かした際とは異なりバイトコードインタプリタに到達する前の処理が無くなる為多少の高速化が望めると推測できる. | 337 この場合,Perl6を通常動かした際とは異なりバイトコードインタプリタに到達する前の処理が無くなる為多少の高速化が望めると推測できる. |
324 | 338 |
339 \subsection{Cのインライン展開} | |
340 CbCのCodeSegmentはgoto文で遷移するため,次のCodeSegmentが一意に決定している場合Cコンパイラ側でインライン展開する事が可能である. | |
341 CodeSegmentがインライン展開される限界については別途研究する必要があるが,CbCを利用した場合その箇所でもコストを低く設計する事が可能である. | |
342 | |
325 \section{MoarVMのデバッグ} | 343 \section{MoarVMのデバッグ} |
326 | 344 |
327 MoarVM自体のデバッグはMoarVMのリポジトリにテストコードが付随していない為単体では実行不可能である. | 345 MoarVM自体のデバッグはMoarVMのリポジトリにテストコードが付随していない為単体では実行不可能である. |
328 本研究ではMoarVMのデバッグにおけるCデバッガの使用方法とMoarVMのテスト方法についても考案する. | 346 本研究ではMoarVMのデバッグにおけるCデバッガの使用方法とMoarVMのテスト方法についても考案する. |
329 | 347 |
394 \subsection{ThreadeCode} | 412 \subsection{ThreadeCode} |
395 ThrededCodeを実装する場合,通常命令ディスパッチの箇所と,実際に実行される命令処理を大幅に変更しなければならない. | 413 ThrededCodeを実装する場合,通常命令ディスパッチの箇所と,実際に実行される命令処理を大幅に変更しなければならない. |
396 CbCを用いた実装の場合,命令処理はただのCodeSegmentの集合である. | 414 CbCを用いた実装の場合,命令処理はただのCodeSegmentの集合である. |
397 その為CodeSegmentをThrededCodeに対応した並びとして選択する事ができれば命令処理部分の修正をほぼせずにThrededCodeを実現する事が可能である. | 415 その為CodeSegmentをThrededCodeに対応した並びとして選択する事ができれば命令処理部分の修正をほぼせずにThrededCodeを実現する事が可能である. |
398 | 416 |
417 またCodeSegmentはバイトコードレベルと同じ扱いができるため,ThrededCodeそのものを分離して最適化をかける事が可能である. | |
418 これもCodeSegmentが関数単位として分離できる事からの利点である. | |
399 | 419 |
400 | 420 |
401 \subsubsection{MoarVMのデバッグ} | 421 \subsubsection{MoarVMのデバッグ} |
402 MoarVMのバイトコードインタプリタの箇所はオリジナルの実装ではラベルジャンプを用いて実装されている. | 422 MoarVMのバイトコードインタプリタの箇所はオリジナルの実装ではラベルジャンプを用いて実装されている. |
403 その為,直接ラベルにbreak pointをかける事が出来ない. | 423 その為,直接ラベルにbreak pointをかける事が出来ない. |
407 これはCプログラミングの関数に対してのデバッグで,状態ごとにbreak pointをかける事が出来ることを意味する. | 427 これはCプログラミングの関数に対してのデバッグで,状態ごとにbreak pointをかける事が出来ることを意味する. |
408 通常のC言語で言語処理系を実装した場合と比較して扱いやすくなっていると言える. | 428 通常のC言語で言語処理系を実装した場合と比較して扱いやすくなっていると言える. |
409 さらにラベルテーブルでの管理場合,次のバイトコード箇所は数値でしか確認できず,実際にどこに飛ぶのかはラベルテーブル内と数値を作業者が手作業で確認する必要があった. | 429 さらにラベルテーブルでの管理場合,次のバイトコード箇所は数値でしか確認できず,実際にどこに飛ぶのかはラベルテーブル内と数値を作業者が手作業で確認する必要があった. |
410 スクリプトなどを組めば効率化は出来るがデバッガ上で完結しない為手間がかかる. | 430 スクリプトなどを組めば効率化は出来るがデバッガ上で完結しない為手間がかかる. |
411 CbC実装ではCODESテーブル内は次のCodeSegmentの名前が入っている為,数値からCodeSegmentの名前をデバッガ上で確認する事が出来る. | 431 CbC実装ではCODESテーブル内は次のCodeSegmentの名前が入っている為,数値からCodeSegmentの名前をデバッガ上で確認する事が出来る. |
432 | |
433 \subsection{JITコンパイルの応用} | |
434 現在MoarVMはLuaJit\cite{luajit}を搭載しJITコンパイルを行っている. | |
435 LuaJITそのものをCbCに適応させるわけではないが,CbCのABIにJITされたコードを合わせる事が可能であると推測できる. | |
412 % \subsection{単純なループ処理の測定} | 436 % \subsection{単純なループ処理の測定} |
413 % 簡単な例題としてfor文を用いて100000回ループさせ,ある変数をインクリメントするというプログラムを作成する. | 437 % 簡単な例題としてfor文を用いて100000回ループさせ,ある変数をインクリメントするというプログラムを作成する. |
414 % 今回の評価対象としてPerl6は2018年4月にリリースされたMoarVM,NQP,Rakudoの実装を用いる. | 438 % 今回の評価対象としてPerl6は2018年4月にリリースされたMoarVM,NQP,Rakudoの実装を用いる. |
415 % Perl5は5.26.2を利用した. | 439 % Perl5は5.26.2を利用した. |
416 | 440 |
422 % 100000000 & 3.258 & 124.69 \\ \hline | 446 % 100000000 & 3.258 & 124.69 \\ \hline |
423 % \end{tabular} | 447 % \end{tabular} |
424 % \end{table} | 448 % \end{table} |
425 | 449 |
426 \subsection{欠点} | 450 \subsection{欠点} |
427 \subsubsection{CbCコンパイラ} | |
428 本来処理系は広く使われる為に著名なOSSなどを利用して開発するのが良いが,CbCプロジェクトの認知度が低いという現状がある. | 451 本来処理系は広く使われる為に著名なOSSなどを利用して開発するのが良いが,CbCプロジェクトの認知度が低いという現状がある. |
429 | 452 |
430 また,前章までに複数述べた通りCbCコンパイラが現在非常にバグを発生させやすい状態になっている. | 453 また,前章までに複数述べた通りCbCコンパイラが現在非常にバグを発生させやすい状態になっている. |
431 CbCコンパイラはgccとllvm/clangに実装している為,これらのアップデートに追従する必要がある. | 454 CbCコンパイラはgccとllvm/clangに実装している為,これらのアップデートに追従する必要がある. |
432 しかしコンパイラのバージョンに応じてCbCで利用するコンパイラ内のAPIが異なる場合が多く,APIの変更に伴う修正作業などを行う必要がある. | 455 しかしコンパイラのバージョンに応じてCbCで利用するコンパイラ内のAPIが異なる場合が多く,APIの変更に伴う修正作業などを行う必要がある. |
433 | 456 |
434 CbCMoarVMではCからCodeSegmentへ,CodeSegmentからCへの遷移などが複数回繰り返されているが,この処理中のCodeSegmentでのtail callの強制が非常に難関である. | 457 CbCMoarVMではCからCodeSegmentへ,CodeSegmentからCへの遷移などが複数回繰り返されているが,この処理中のCodeSegmentでのtail callの強制が非常に難関である. |
435 tail callの強制には関数定義の箇所や引数,スタック領域のサイズ修正などを行う必要がある. | 458 tail callの強制には関数定義の箇所や引数,スタック領域のサイズ修正などを行う必要がある. |
436 現在のバグではCodeSegment内部での不要なスタック操作命令を完全に排除しきれていない. | 459 現在のバグではCodeSegment内部での不要なスタック操作命令を完全に排除しきれていない. |
437 | 460 |
461 またCodeSegmentからCに帰る場合,環境付き継続を行う必要がある. | |
462 Cの関数の末尾でCodeSegmentを呼び出している場合など環境付き継続を使用しなくても良いケースは存在するが,頻繁にCとCbCを行き来する場合記述が冗長になる可能性はある. | |
438 | 463 |
439 \section{今後の課題} | 464 \section{今後の課題} |
440 本論文ではCbCによってPerl6の処理系であるMoarVMインタプリタの一部改良とその手法を示した. | 465 本論文ではCbCによってPerl6の処理系であるMoarVMインタプリタの一部改良とその手法を示した. |
441 CbCのCodeSegment部分を用いることできめ細やかな記述が出来,デバッグし辛い箇所もbreakpointの設定などが容易になった. | 466 CbCのCodeSegment部分を用いることできめ細やかな記述が出来,デバッグし辛い箇所もbreakpointの設定などが容易になった. |
442 | 467 |