comparison Paper/anatofuz.tex @ 59:7a8024855249

tweak
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 19 Nov 2018 13:44:50 +0900
parents 8e5e2521d1db
children 99092907d3ea
comparison
equal deleted inserted replaced
58:8e5e2521d1db 59:7a8024855249
337 interp.cはCode\ref{dispatch_c}に示すスタイルで記述されている. 337 interp.cはCode\ref{dispatch_c}に示すスタイルで記述されている.
338 338
339 339
340 340
341 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為, バイトコードの名前はLABELSの配列の添字に変換されている. 341 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為, バイトコードの名前はLABELSの配列の添字に変換されている.
342 そのため対象となるCodeGearをLABLESの並びと対応させ, Code\ref{cbcoplabelsh}に示すCodeGearの配列CODESとして設定すればCodeGearの名前は問わない. 342 そのため対象となるCodeGearをLABELSの並びと対応させ, Code\ref{cbcoplabelsh}に示すCodeGearの配列CODESとして設定すればCodeGearの名前は問わない.
343 今回はCodeGearである事を示す為に接頭辞としてcbc\_をつける. 343 今回はCodeGearである事を示す為に接頭辞としてcbc\_をつける.
344 344
345 \lstinputlisting[label=cbcoplabelsh, caption=CodeGear配列の一部分]{./src/oplables-cbc-codes.h} 345 \lstinputlisting[label=cbcoplabelsh, caption=CodeGear配列の一部分]{./src/oplables-cbc-codes.h}
346 346
347 命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが, これらはMVM\_interp\_run内のローカル変数として利用している. 347 命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが, これらはMVM\_interp\_run内のローカル変数として利用している.
413 413
414 \subsection{MoarVMの並列デバッグ手法} 414 \subsection{MoarVMの並列デバッグ手法}
415 しかしMoarVMが実行する命令は膨大な数がある. 415 しかしMoarVMが実行する命令は膨大な数がある.
416 その為gdbでMoarVMをCbCとオリジナル版での並列デバッグを人間が同時に行うことは困難である. 416 その為gdbでMoarVMをCbCとオリジナル版での並列デバッグを人間が同時に行うことは困難である.
417 Perlなどのスクリプトを用いて自動的に解析したいため, ログを残す為にscriptコマンドを実行した状態でgdbを起動する. 417 Perlなどのスクリプトを用いて自動的に解析したいため, ログを残す為にscriptコマンドを実行した状態でgdbを起動する.
418 トレースでは実行した命令名のみ取得できれば良い為, Code\ref{cbc_b}, \ref{orig_b}でdebug pointにcommandとして設定している様に,設定されたcur\_opの値を出力し続けるのみの動きを導入する. 418 トレースでは実行した命令名のみ取得できれば良い為, Code\ref{cbc_b}, \ref{orig_b}でbreak pointにcommandとして設定している様に,設定されたcur\_opの値を出力し続けるのみの動きを導入する.
419 419
420 実際に実行したログ・ファイルの一部をそれぞれCode\ref{debug_origmoar}, \ref{debug_cbcmoar}に示す. 420 実際に実行したログ・ファイルの一部をそれぞれCode\ref{debug_origmoar}, \ref{debug_cbcmoar}に示す.
421 \lstinputlisting[label=debug_origmoar, caption=オリジナル版MoarVMのバイトコードのトレース]{./src/origin_breakpoint.txt} 421 \lstinputlisting[label=debug_origmoar, caption=オリジナル版MoarVMのバイトコードのトレース]{./src/origin_breakpoint.txt}
422 \lstinputlisting[label=debug_cbcmoar, caption=CbCMoarVMのバイトコードのトレース]{./src/trace_cbc.txt} 422 \lstinputlisting[label=debug_cbcmoar, caption=CbCMoarVMのバイトコードのトレース]{./src/trace_cbc.txt}
423 423
477 これもCodeGearが関数単位として分離できる事からの利点である. 477 これもCodeGearが関数単位として分離できる事からの利点である.
478 478
479 479
480 MoarVMのバイトコードインタプリタの箇所はオリジナルの実装ではラベルジャンプを用いて実装されている. 480 MoarVMのバイトコードインタプリタの箇所はオリジナルの実装ではラベルジャンプを用いて実装されている.
481 その為, 直接ラベルにbreak pointをかける事が出来ない. 481 その為, 直接ラベルにbreak pointをかける事が出来ない.
482 作業者がデバッガが読み込んでいるCソースコードの位置を把握し, 行番号を指定してdebug pointを設定する必要があった. 482 作業者がデバッガが読み込んでいるCソースコードの位置を把握し, 行番号を指定してbreak pointを設定する必要があった.
483 483
484 CbCMoarVMの場合, CodeGear単位でバイトコードの処理単位を記述している為, 通常の関数と同じく直接CodeGearにデバッグポイントをかける事が可能である. 484 CbCMoarVMの場合, CodeGear単位でバイトコードの処理単位を記述している為, 通常の関数と同じく直接CodeGearにbreak pointをかける事が可能である.
485 これはCプログラミングの関数に対してのデバッグで, 状態ごとにbreak pointをかける事が出来ることを意味する. 485 これはCプログラミングの関数に対してのデバッグで, 状態ごとにbreak pointをかける事が出来ることを意味する.
486 通常のC言語で言語処理系を実装した場合と比較して扱いやすくなっていると言える. 486 通常のC言語で言語処理系を実装した場合と比較して扱いやすくなっていると言える.
487 さらにラベルテーブルでの管理の場合, 次のバイトコード箇所は数値でしか確認できず, 実際にどこに飛ぶのかはラベルテーブル内と数値を作業者が手作業で確認する必要があった. 487 さらにラベルテーブルでの管理の場合, 次のバイトコード箇所は数値でしか確認できず, 実際にどこに飛ぶのかはラベルテーブル内と数値を作業者が手作業で確認する必要があった.
488 スクリプトなどを組めば効率化は出来るがデバッガ上で完結しない為手間がかかる. 488 スクリプトなどを組めば効率化は出来るがデバッガ上で完結しない為手間がかかる.
489 CbC実装ではCODESテーブル内は次のCodeGearの名前が入っている為, 数値からCodeGearの名前をデバッガ上で確認する事が出来る 489 CbC実装ではCODESテーブル内は次のCodeGearの名前が入っている為, 数値からCodeGearの名前をデバッガ上で確認する事が出来る
539 %この一連の処理がオーバーヘッドになる為, 今後はcbc\_fixt\_nextというCodeGearを導入し直接次の命令に該当するCodeSegmentへgotoする様に実装する予定である. 539 %この一連の処理がオーバーヘッドになる為, 今後はcbc\_fixt\_nextというCodeGearを導入し直接次の命令に該当するCodeSegmentへgotoする様に実装する予定である.
540 540
541 Perl5においてはperlccというモジュールが開発されている. 541 Perl5においてはperlccというモジュールが開発されている.
542 これはPerl5内部で利用しているPerlバイトコードを, PerlのC APIであるXS言語の様なCのソースファイルに埋め込み,それをCコンパイルでコンパイルするというものである. 542 これはPerl5内部で利用しているPerlバイトコードを, PerlのC APIであるXS言語の様なCのソースファイルに埋め込み,それをCコンパイルでコンパイルするというものである.
543 perlccを利用することでPerlインタプリタが無い状況でも可動するバイナリファイルを作成する事が可能である. 543 perlccを利用することでPerlインタプリタが無い状況でも可動するバイナリファイルを作成する事が可能である.
544 しかしPerlccはPerlスクリプトが複雑になるほど正確にCに移植を行う事が出来ず, 現在ではPerlのコアモジュールから外されている. 544 しかしperlccはPerlスクリプトが複雑になるほど正確にCに移植を行う事が出来ず, 現在ではPerlのコアモジュールから外されている.
545 PerlccはPerlのバイトコードをCへの変換のみ行う為, Cで実装されているPerl経由で実行した場合と処理速度はほぼ変わらない. 545 perlccはPerlのバイトコードをCへの変換のみ行う為, Cで実装されているPerl経由で実行した場合と処理速度はほぼ変わらない.
546 またPerlccで生成されたCのソースコードは難解であり, これをデバッグするのが困難でもある. 546 またperlccで生成されたCのソースコードは難解であり, これをデバッグするのが困難でもある.
547 MoarVMでthreaded codeを実現出来た場合, その箇所のみCbCプログラムとして切り出す事が可能である為perlccと似たツールを作成することも可能である. 547 MoarVMでthreaded codeを実現出来た場合, その箇所のみCbCプログラムとして切り出す事が可能である為perlccと似たツールを作成することも可能である.
548 CレベルでもPerlccの様に内部構造をCの関数化すればThrededCodeの様な物を構築できるが, CbCと比較して処理の単位が明確ではない為高速化は見込めない. 548 Cレベルでもperlccの様に内部構造をCの関数化すればThrededCodeの様な物を構築できるが, CbCと比較して処理の単位が明確ではない為高速化は見込めない.
549 CbCを用いたThrededCodeでPerlccの様なツールを作成した場合, CodeGearの単位が正常に機能すればCbCのCodeGearがThrededCodeをより効率化出来ると推測できる. 549 CbCを用いたThrededCodeでperlccの様なツールを作成した場合, CodeGearの単位が正常に機能すればCbCのCodeGearがThrededCodeをより効率化出来ると推測できる.
550 550
551 551
552 CbCのCodeGearはgoto文で遷移するため, 次のCodeGearが一意に決定している場合Cコンパイラ側でインライン展開する事が可能である. 552 CbCのCodeGearはgoto文で遷移するため, 次のCodeGearが一意に決定している場合Cコンパイラ側でインライン展開する事が可能である.
553 CodeGearがインライン展開される限界については別途研究する必要があるが, CbCを利用した場合CodeGear単位でインライン展開が可能である. 553 CodeGearがインライン展開される限界については別途研究する必要があるが, CbCを利用した場合CodeGear単位でインライン展開が可能である.
554 その為, ThrededCodeを実装する場合に決定した次のCodeGearをインライン展開する事が可能である. 554 その為, ThrededCodeを実装する場合に決定した次のCodeGearをインライン展開する事が可能である.
555 従ってThreadeCodeを実現するにあたり新たな処理系を開発する必要がなく, 既存の資源を利用してThreadeCodeが実現出来る. 555 従ってThreadeCodeを実現するにあたり新たな処理系を開発する必要がなく, 既存の資源を利用してThreadeCodeが実現出来る.
556 これを繰り返す事でPerlccなどと比較してより高速化したThrededCodeが実現できる. 556 これを繰り返す事でperlccなどと比較してより高速化したThrededCodeが実現できる.
557 557
558 558
559 \section{まとめ} 559 \section{まとめ}
560 本論文ではCbCによってPerl6の処理系であるMoarVMインタプリタの一部改良とその手法を示した. 560 本論文ではCbCによってPerl6の処理系であるMoarVMインタプリタの一部改良とその手法を示した.
561 CbCMoarVMではオリジナルのMoarVMと比較して以下の様な利点が見られた. 561 CbCMoarVMではオリジナルのMoarVMと比較して以下の様な利点が見られた.
562 562
563 \begin{itemize} 563 \begin{itemize}
564 \item CodeGear単位で命令処理を記述する事が可能となり, モジュール化が可能となった. 564 \item CodeGear単位で命令処理を記述する事が可能となり, モジュール化が可能となった.
565 \item ThreadeCodeを実装する際に効率的に実装ができる見込みが立った. 565 \item ThreadeCodeを実装する際に効率的に実装ができる見込みが立った.
566 \item CodeGearを導入した命令単位での最適化が可能となった. 566 \item CodeGearを導入した命令単位での最適化が可能となった.
567 \item break pointを命令の処理単位でかける事可能となった. 567 \item break pointを命令の処理単位でかける事が可能となった.
568 \end{itemize} 568 \end{itemize}
569 569
570 今後CbCでの開発をより深く行っていくにあたり, CbCコンパイラそのものの信頼性を向上させる必要がある. 570 今後CbCでの開発をより深く行っていくにあたり, CbCコンパイラそのものの信頼性を向上させる必要がある.
571 MoarVMの開発を行うにあたり新たに発見された複数のバグを修正し, より安定するコンパイラにする為に改良を行う. 571 MoarVMの開発を行うにあたり新たに発見された複数のバグを修正し, より安定するコンパイラにする為に改良を行う.
572 572