comparison Paper/anatofuz.tex @ 77:ddf88af2253e

update
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Thu, 29 Nov 2018 17:19:19 +0900
parents 57547b9cbf5f
children 6656f4c3dfa0
comparison
equal deleted inserted replaced
76:57547b9cbf5f 77:ddf88af2253e
328 328
329 MoarVMそのものをCbCで書き換えることも考えられるがMoarVM自体既に巨大なプロジェクトである為すべてを書き換える事は困難である. 329 MoarVMそのものをCbCで書き換えることも考えられるがMoarVM自体既に巨大なプロジェクトである為すべてを書き換える事は困難である.
330 その為まず比較的CbCで書き換えることが容易な箇所を修正する. 330 その為まず比較的CbCで書き換えることが容易な箇所を修正する.
331 前章までに述べた通りCbCのCodeGearはコンパイラの基本ブロックに該当する. 331 前章までに述べた通りCbCのCodeGearはコンパイラの基本ブロックに該当する.
332 従ってMoarVMにおける基本ブロックの箇所をCodeGearに書き換える事が可能である. 332 従ってMoarVMにおける基本ブロックの箇所をCodeGearに書き換える事が可能である.
333 MoarVMにおける基本ブロックはインタプリタが実行するバイトコードごとの処理に該当する.
334 333
335 \subsection{MoarVMのバイトコードのディスパッチ} 334 \subsection{MoarVMのバイトコードのディスパッチ}
336 MoarVMのバイトコードインタプリタはsrc/core/interp.cで定義されている. 335 MoarVMのバイトコードインタプリタはsrc/core/interp.cで定義されている.
337 この中の関数MVM\_interp\_runで命令に応じた処理を実行する. 336 この中の関数MVM\_interp\_runで命令に応じた処理を実行する.
338 関数内では命令列が保存されているcur\_op, 現在と次の命令を指し示すop, Threadの環境が保存されているThreadcontextなどの変数を利用する. 337 関数内では命令列が保存されているcur\_op, 現在と次の命令を指し示すop, Threadの環境が保存されているThreadcontextなどの変数を利用する.
345 このラベルテーブルの中身はラベルが変換されたアドレスであるため, 実際に呼ばれている命令コードの名前はデバッガレベルでは確認できない. 344 このラベルテーブルの中身はラベルが変換されたアドレスであるため, 実際に呼ばれている命令コードの名前はデバッガレベルでは確認できない.
346 Cレベルでのデバッグ時にはアドレスと実際に呼ばれる箇所を確認する事に手間がかかる. 345 Cレベルでのデバッグ時にはアドレスと実際に呼ばれる箇所を確認する事に手間がかかる.
347 巨大なcase文として実行された場合, 実行時間が遅いだけでなく, ラベル遷移と共存させて記述を行っている為Cのソースコードにおける可読性も低下する. 346 巨大なcase文として実行された場合, 実行時間が遅いだけでなく, ラベル遷移と共存させて記述を行っている為Cのソースコードにおける可読性も低下する.
348 347
349 348
349 \lstinputlisting[label=orig_macro, caption=interp.cのマクロ部分]{./src/orig_macro.c}
350 \lstinputlisting[label=oplabelsh, caption=ラベルテーブルの一部分]{./src/oplabels.h} 350 \lstinputlisting[label=oplabelsh, caption=ラベルテーブルの一部分]{./src/oplabels.h}
351 \lstinputlisting[label=orig_macro, caption=interp.cのマクロ部分]{./src/orig_macro.c}
352 351
353 \lstinputlisting[label=dispatch_c, caption=オリジナル版MoarVMのバイトコードディスパッチ]{./src/dispatch.c} 352 \lstinputlisting[label=dispatch_c, caption=オリジナル版MoarVMのバイトコードディスパッチ]{./src/dispatch.c}
354 353
355 interp.cでは命令コードのディスパッチはマクロを利用したcur\_opの計算及びラベルの遷移, もしくはマクロDISPATCHが展開するswitch文で行われていた. 354 interp.cでは命令コードのディスパッチはマクロを利用したcur\_opの計算及びラベルの遷移, もしくはマクロDISPATCHが展開するswitch文で行われていた.
356 この為MoarVM内の命令コードに対応する処理は, 命令ディスパッチが書かれているCソースファイルの, 特定の場所のみに記述せざるを得ない. 355 この為MoarVM内の命令コードに対応する処理は, 命令ディスパッチが書かれているCソースファイルの, 特定の場所のみに記述せざるを得ない.
555 % 1000000 & 0.131 & 1.444 \\ \hline 554 % 1000000 & 0.131 & 1.444 \\ \hline
556 % 10000000 & 0.131 & 1.444 \\ \hline 555 % 10000000 & 0.131 & 1.444 \\ \hline
557 % 100000000 & 3.258 & 124.69 \\ \hline 556 % 100000000 & 3.258 & 124.69 \\ \hline
558 % \end{tabular} 557 % \end{tabular}
559 % \end{table} 558 % \end{table}
560 本来処理系は広く使われる為に著名なOSSなどを利用して開発するのが良いが, CbCプロジェクトの認知度が低いという現状がある. 559 しかし, 言語処理系は広く使われる為に著名なOSSなどを利用して開発するのが望ましいが, CbCプロジェクトの認知度が低いという現状がある.
561 560
562 また, 前章までに複数述べた通りCbCコンパイラが現在非常にバグを発生させやすい状態になっている. 561 また, 前章までに複数述べた通りCbCコンパイラが現在非常にバグを発生させやすい状態になっている.
563 CbCコンパイラはgccとllvm/clangに実装している為, これらのアップデートに追従する必要がある. 562 CbCコンパイラはgccとllvm/clang上に実装している為, これらのアップデートに追従する必要がある.
564 しかしコンパイラのバージョンに応じてCbCで利用するコンパイラ内のAPIが異なる場合が多く, APIの変更に伴う修正作業などを行う必要がある. 563 しかしコンパイラのバージョンに応じてCbCで利用するコンパイラ内のAPIが異なる場合が多く, APIの変更に伴う修正作業などを行う必要がある.
565 564
566 CbCMoarVMではCからCodeGearへ, CodeGearからCへの遷移などが複数回繰り返されているが, この処理中のCodeGearでのtail callの強制が非常に難関である. 565 CbCMoarVMではCからCodeGearへ, CodeGearからCへの遷移などが複数回繰り返されているが, この処理中のCodeGearでのtail callの強制が非常に難関である.
567 tail callの強制には関数定義の箇所や引数, スタック領域のサイズ修正などを行う必要がある. 566 tail callの強制には関数定義の箇所や引数, スタック領域のサイズ修正などを行う必要がある.
568 現在のバグではCodeGear内部での不要なスタック操作命令を完全に排除しきれていない. 567 現在のバグではCodeGear内部での不要なスタック操作命令を完全に排除しきれていない.