comparison Paper/anatofuz.tex @ 16:ed882dba29f6

add about threaded code and jlisting.sty
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Wed, 07 Nov 2018 12:58:24 +0900
parents 8580ad6c50dd
children b2a795a294c4
comparison
equal deleted inserted replaced
15:8580ad6c50dd 16:ed882dba29f6
88 CbCではCodeSegment,DetaSegmentを基本単位として記述するプログラミングスタイルを取る. 88 CbCではCodeSegment,DetaSegmentを基本単位として記述するプログラミングスタイルを取る.
89 89
90 \subsection{CodeSegmentとDataSegment} 90 \subsection{CodeSegmentとDataSegment}
91 CbCではCの関数の代わりにCodeSegmentを導入する. 91 CbCではCの関数の代わりにCodeSegmentを導入する.
92 CodeSegmentはCの関数宣言の型名の代わりに\_\_codeと書くことで 宣言できる. 92 CodeSegmentはCの関数宣言の型名の代わりに\_\_codeと書くことで 宣言できる.
93 \_\_codeはCbCコンパイラの扱いはvoidと同じ型であるが,CbCプログラミングではCodeSegmentである事を示す識別子としての意味で利用する.
94
93 95
94 \subsection{現在の実装} 96 \subsection{現在の実装}
95 CbCは現在主要なCコンパイラであるgcc及びllvmをバックエンドとしたclang上の2種類の実装が存在する. 97 CbCは現在主要なCコンパイラであるgcc及びllvmをバックエンドとしたclang上の2種類の実装が存在する.
96 gccはバージョン9.0.0に,clangは7.0.0に対応している. 98 gccはバージョン9.0.0に,clangは7.0.0に対応している.
97 99
101 その為DSの構造体の値が書き換わり,CからDSにreturnした際にDSの構造体が破壊されるバグである. 103 その為DSの構造体の値が書き換わり,CからDSにreturnした際にDSの構造体が破壊されるバグである.
102 現状ではCbCコンパイラがプログラマの意図と反する挙動を取るためCbCコンパイラのバグを回避するプログラミングが要求されている. 104 現状ではCbCコンパイラがプログラマの意図と反する挙動を取るためCbCコンパイラのバグを回避するプログラミングが要求されている.
103 本来コンパイラ側のバグを回避するプログラミングをプログラマに要求するスタイルは好ましくない. 105 本来コンパイラ側のバグを回避するプログラミングをプログラマに要求するスタイルは好ましくない.
104 従ってCbCコンパイラ自身の信頼性を向上させる事も今後の課題となっている. 106 従ってCbCコンパイラ自身の信頼性を向上させる事も今後の課題となっている.
105 \subsection{CbCとCの互換性} 107 \subsection{CbCとCの互換性}
106 CbCはCコンパイラ上に実装している為,CSを利用しない場合は通常のCプログラムとして動作する. 108 CbCコンパイラは内部的に与えられているソースコードがCbCであるかどうかを判断する.
107 CbCコンパイラは内部的に与えられているソースコードがCbCであるかどうかを判断し,そうでない場合は通常のコンパイラとして動作する. 109 この際にCodeSegmentを利用していない場合は通常のCプログラムとして動作する.
110 これはCbCコンパイラがCコンパイラであるgccとllvm/clang上に実装している為である.
108 その為MoarVMのビルドにおいてもCbCで書き換えたソースコードがあるターゲットと,手を加えていないオリジナルのターゲットの2種類を同一のCbCコンパイラでビルドする事が可能である. 111 その為MoarVMのビルドにおいてもCbCで書き換えたソースコードがあるターゲットと,手を加えていないオリジナルのターゲットの2種類を同一のCbCコンパイラでビルドする事が可能である.
109 112
110 113
111 \subsection{言語処理系におけるCbCの応用} 114 \subsection{言語処理系におけるCbCの応用}
112 CbCを言語処理系,特にスクリプト言語に応用すると幾つかの箇所に置いて利点があると推測される. 115 CbCを言語処理系,特にスクリプト言語に応用すると幾つかの箇所に置いて利点があると推測される.
190 その為まず比較的CbCで書き換えることが容易な箇所を修正する. 193 その為まず比較的CbCで書き換えることが容易な箇所を修正する.
191 前章までに述べた通りCbCのCodeSegmentはコンパイラの基本ブロックに該当する. 194 前章までに述べた通りCbCのCodeSegmentはコンパイラの基本ブロックに該当する.
192 従ってMoarVMにおける基本ブロックの箇所をCodeSegmentに書き換える事が可能である. 195 従ってMoarVMにおける基本ブロックの箇所をCodeSegmentに書き換える事が可能である.
193 MoarVMにおける基本ブロックはインタプリタが実行するバイトコードごとの処理に該当する. 196 MoarVMにおける基本ブロックはインタプリタが実行するバイトコードごとの処理に該当する.
194 \subsection{CbCコンパイラによるバグ} 197 \subsection{CbCコンパイラによるバグ}
198
199 \subsection{Threaded Code}
200 CbCはCodeSegmentで末尾最適化(Tail call optimization)を行う.
201 これはCodeSegmentは必ず関数呼び出しではなくgotoで次の状態に遷移する為にスタック領域の操作が必要とならない為である.
202 現在のCbCコンパイラの実装ではCodeSegmentからCの関数に戻る場合は末尾最適化を切り,CodeSegment間の遷移では末尾最適化が行われる.
203 末尾最適化を応用することでContinuation-passingスタイルのThreaded Codeの実装が可能となる.\cite{threadedcode}
204
205 現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextというCodeSegmentで処理している.
206 これは元のMoarVMの命令ディスパッチで行われる現在のオペコードを示すcur\_opと命令列opの操作及び次のラベルに遷移するマクロに該当する.
207 CbCMoarVMではラベルに対しての遷移の代わりにMoarVMの命令のCodeSegmentの集合体である配列CODESにアクセスし,その要素であるCodeSegmentに対して遷移する形を取っている.
208 この一連の処理がオーバーヘッドになる為,今後はcbc\_fixt\_nextというCodeSegmentを導入し直接次の命令に該当するCodeSegmentへgotoする様に実装する予定である.
209
195 210
196 \section{CbCを用いる事についての評価} 211 \section{CbCを用いる事についての評価}
197 Perl6処理系はまずPerl6の豊富な文法に対応する物を作成せねばならず,類似する他のプログラミング言語処理系と比較してもより複雑となっている. 212 Perl6処理系はまずPerl6の豊富な文法に対応する物を作成せねばならず,類似する他のプログラミング言語処理系と比較してもより複雑となっている.
198 実際にPerl5を始めとしたスクリプト言語とPerl6がどのような処理時間の違いが見られるかを実測する. 213 実際にPerl5を始めとしたスクリプト言語とPerl6がどのような処理時間の違いが見られるかを実測する.
199 214
213 % \end{table} 228 % \end{table}
214 229
215 230
216 \section{今後の課題} 231 \section{今後の課題}
217 232
218 \section{まとめ}
219
220 233
221 %å\subsection{MoarVMの処理流れ} 234 %å\subsection{MoarVMの処理流れ}
222 %MoarVMはC言語で実装されており,Perl5で記述されたConfigure.plを 235 %MoarVMはC言語で実装されており,Perl5で記述されたConfigure.plを
223 236
224 237