Mercurial > hg > Papers > 2019 > anatofuz-prosym
comparison Paper/anatofuz.tex @ 22:fb4c1b408c9f
add sample codes and tweak tex
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 08 Nov 2018 17:49:04 +0900 |
parents | 5ba21dfc6e0c |
children | 7689b70a1a79 |
comparison
equal
deleted
inserted
replaced
21:5ba21dfc6e0c | 22:fb4c1b408c9f |
---|---|
83 CbCは当研究室で開発しているプログラミング言語である. | 83 CbCは当研究室で開発しているプログラミング言語である. |
84 Cレベルでのプログラミングを行う場合,本来プログラマが行いたい処理の他にmallocなどを利用したメモリのアロケートやエラーハンドリングなどが存在する. | 84 Cレベルでのプログラミングを行う場合,本来プログラマが行いたい処理の他にmallocなどを利用したメモリのアロケートやエラーハンドリングなどが存在する. |
85 これらをmeta computationと呼ぶ.これらmeta computationと通常の処理を分離することでバグの原因がmeta computation側にあるか処理側にあるかの分離などが可能となる. | 85 これらをmeta computationと呼ぶ.これらmeta computationと通常の処理を分離することでバグの原因がmeta computation側にあるか処理側にあるかの分離などが可能となる. |
86 しかしC言語などを用いたプログラミングで分離を行おうとすると,それぞれ事細かに関数やクラスを分割せねばならず容易ではない. | 86 しかしC言語などを用いたプログラミングで分離を行おうとすると,それぞれ事細かに関数やクラスを分割せねばならず容易ではない. |
87 CbCでは関数よりmeta computationを細かく記述する為にCodeSegmentという単位を導入した. | 87 CbCでは関数よりmeta computationを細かく記述する為にCodeSegmentという単位を導入した. |
88 またCodeSegmentの実行に必要なデータをDataSegmentという単位で受け渡す. | |
88 CbCではCodeSegment,DetaSegmentを基本単位として記述するプログラミングスタイルを取る. | 89 CbCではCodeSegment,DetaSegmentを基本単位として記述するプログラミングスタイルを取る. |
89 | 90 |
90 \subsection{CodeSegmentとDataSegment} | 91 \subsection{CodeSegmentとDataSegment} |
91 CbCではCの関数の代わりにCodeSegmentを導入する. | 92 CbCではCの関数の代わりにCodeSegmentを導入する. |
92 CodeSegmentはCの関数宣言の型名の代わりに\_\_codeと書くことで 宣言できる. | 93 CodeSegmentはCの関数宣言の型名の代わりに\_\_codeと書くことで 宣言できる. |
93 \_\_codeはCbCコンパイラの扱いはvoidと同じ型であるが,CbCプログラミングではCodeSegmentである事を示す識別子としての意味で利用する. | 94 \_\_codeはCbCコンパイラの扱いはvoidと同じ型であるが,CbCプログラミングではCodeSegmentである事を示す識別子としての意味で利用する. |
95 CodeSegment間の移動はgoto文によって記述する. | |
96 \lstinputlisting[label=cbcexample, caption=cbc\_example.cbc]{./src/cbc_example.cbc} | |
97 Code\ref{cbcexample}に示すCbCのコードではmain関数からcs1,cs2に遷移し,最終的にdataの値が2となる. | |
98 CodeSegment間の入出力の受け渡しは引数を利用する.この引数は小さなDataSegmentであると言える. | |
94 | 99 |
95 \subsection{軽量継続} | 100 \subsection{軽量継続} |
96 CbCでは次のCodeSegmentに移行する際,Cの | 101 %TBD |
102 CbCでは次のCodeSegmentに移行する際,Cのgoto文を利用する. | |
103 通常のCの関数呼び出しの場合,スタックポインタを操作しローカル変数などをスタックに保存する. | |
104 CbCの場合スタックフレームを操作せず,レジスタの値を変更せずそのまま次のCodeSegmentに遷移する事が可能である. | |
105 これは通常の継続と比較し軽量に動作するため軽量継続と呼ぶ. | |
106 CbCは軽量継続を利用するためレジスタレベルでのきめ細やかな実装が可能となっている. | |
97 | 107 |
98 \subsection{現在の実装} | 108 \subsection{現在の実装} |
99 CbCは現在主要なCコンパイラであるgcc及びllvmをバックエンドとしたclang上の2種類の実装が存在する. | 109 CbCは現在主要なCコンパイラであるgcc及びllvmをバックエンドとしたclang上の2種類の実装が存在する. |
100 gccはバージョン9.0.0に,clangは7.0.0に対応している. | 110 gccはバージョン9.0.0に,clangは7.0.0に対応している. |
101 | 111 |
107 また本来は操作しないはずのスタック領域の操作が入ってしまうため,プログラマの意図と反したスタックポインタなのど操作が行われてしまいバグが発生する可能性が存在する. | 117 また本来は操作しないはずのスタック領域の操作が入ってしまうため,プログラマの意図と反したスタックポインタなのど操作が行われてしまいバグが発生する可能性が存在する. |
108 | 118 |
109 \subsection{CbCとCの互換性} | 119 \subsection{CbCとCの互換性} |
110 CbCコンパイラは内部的に与えられているソースコードがCbCであるかどうかを判断する. | 120 CbCコンパイラは内部的に与えられているソースコードがCbCであるかどうかを判断する. |
111 この際にCodeSegmentを利用していない場合は通常のCプログラムとして動作する. | 121 この際にCodeSegmentを利用していない場合は通常のCプログラムとして動作する. |
112 これはCbCコンパイラがCコンパイラであるgccとllvm/clang上に実装している為である. | |
113 その為MoarVMのビルドにおいてもCbCで書き換えたソースコードがあるターゲットと,手を加えていないオリジナルのターゲットの2種類を同一のCbCコンパイラでビルドする事が可能である. | 122 その為MoarVMのビルドにおいてもCbCで書き換えたソースコードがあるターゲットと,手を加えていないオリジナルのターゲットの2種類を同一のCbCコンパイラでビルドする事が可能である. |
114 | 123 |
115 | 124 |
116 \subsection{言語処理系におけるCbCの応用} | 125 \subsection{言語処理系におけるCbCの応用} |
117 CbCを言語処理系,特にスクリプト言語に応用すると幾つかの箇所に置いて利点があると推測される. | 126 CbCを言語処理系,特にスクリプト言語に応用すると幾つかの箇所に置いて利点があると推測される. |
139 現在主に使用されている実装であるRakudoは2010年にRakudo-Starという一連のツール郡としてリリースされた. | 148 現在主に使用されている実装であるRakudoは2010年にRakudo-Starという一連のツール郡としてリリースされた. |
140 Perl6処理系自体は現在も未完成であり,Perl6プロジェクトとして提供しているテストリポジトリ「Roast\cite{roast}」で定義されているテストケースを完全に通化する処理系は現在未だ存在しない. | 149 Perl6処理系自体は現在も未完成であり,Perl6プロジェクトとして提供しているテストリポジトリ「Roast\cite{roast}」で定義されているテストケースを完全に通化する処理系は現在未だ存在しない. |
141 | 150 |
142 Perl6は言語仕様及び処理実装がPerl5と大幅に異なっており,言語的な互換性が存在しない. | 151 Perl6は言語仕様及び処理実装がPerl5と大幅に異なっており,言語的な互換性が存在しない. |
143 従って現在ではPerl6とPerl5は別言語としての開発方針になっている. | 152 従って現在ではPerl6とPerl5は別言語としての開発方針になっている. |
144 Perl6は現在有力な処理系であるRakudoから名前を取り\texttt{Raku}という言語名に変更しようという動きが一部存在している. | 153 Perl6は現在有力な処理系であるRakudoから名前を取りRakuという別名がつけられている. |
145 | 154 |
146 \subsection{Rakudo} | 155 \subsection{Rakudo} |
147 | 156 |
148 RakudoとはParrotで構想に上がったNQP,NQPに基づくPerl6を基にしたプロジェクトである. | 157 RakudoとはParrotで構想に上がったNQP,NQPに基づくPerl6を基にしたプロジェクトである. |
149 RakudoがPerl6のコンパイラかつインタプリタであると考えても良い. | 158 RakudoがPerl6のコンパイラかつインタプリタであると考えても良い. |
159 Rakudoは図\ref{fig:perl6construction}に示す構成になっている. | |
150 Rakudoにおけるコンパイラとは厳密には2種類存在する. | 160 Rakudoにおけるコンパイラとは厳密には2種類存在する. |
151 まず第1のものがPerl6,もしくはNQPをMoarVM,JVMのバイトコードに変換するNQPコンパイラである. | 161 まず第1のものがPerl6,もしくはNQPをMoarVM,JVMのバイトコードに変換するNQPコンパイラである. |
152 次にそのNQPが出力したバイトコードをネイティブコードに変換するVMの2種類である. | 162 次にそのNQPが出力したバイトコードをネイティブコードに変換するVMの2種類である. |
153 このVMは現在MoarVM,JavaVM,Javascript,GraalVMを選択可能である. | 163 このVMは現在MoarVM,JavaVM,Javascript,GraalVMを選択可能である. |
154 Rakudo及びNQP projectではこのNQPコンパイラの部分をフロントエンド,VMの部分をバックエンド\cite{rani1}と呼称している. | 164 Rakudo及びNQP projectではこのNQPコンパイラの部分をフロントエンド,VMの部分をバックエンド\cite{rani1}と呼称している. |
155 NQPで主に書かれたPerl6のことをRakudoと呼ぶ. | 165 NQPで主に書かれたPerl6のことをRakudoと呼ぶ. |
156 Perl6はNQP以外にもPerl6独自の一種のシンタックスシュガーの様な物を持っており,これはNQPコンパイラ側で処理を行う. | 166 Perl6はNQP以外にもPerl6独自の一種のシンタックスシュガーの様な物を持っており,これはNQPコンパイラ側で処理を行う. |
157 | 167 |
168 \begin{figure}[ht] | |
169 \begin{center} | |
170 \includegraphics[width=70mm]{fig/perl6nqp.pdf} | |
171 \end{center} | |
172 \caption{Perl6の構成} | |
173 \label{fig:perl6construction} | |
174 \end{figure} | |
175 | |
158 \subsection{NQP} | 176 \subsection{NQP} |
159 | 177 |
160 RakudoにおけるNQP\cite{nqp}は現在MoarVM,JVM上で動作し,MoarVMを一部利用することでNodeJSからも動作させる事が可能である. | 178 RakudoにおけるNQP\cite{nqp}は現在MoarVM,JVM上で動作し,MoarVMを一部利用することでNodeJSからも動作させる事が可能である. |
161 NQPはPerl6のサブセットであるため主な文法などはPerl6に準拠しているが幾つか異なる点が存在する. | 179 NQPはPerl6のサブセットであるため主な文法などはPerl6に準拠しているが幾つか異なる点が存在する. |
162 NQP自身はStage0と呼ばれる名前空間上のモジュールのみ動作環境のVMのバイトコードを必要とするが,それ以外はNQPで記述されておりBootstrappingされている言語である. | 180 NQP自身はStage0と呼ばれる名前空間上のモジュールのみ動作環境のVMのバイトコードを必要とするが,それ以外はNQPで記述されておりBootstrappingされている言語である. |
170 MoarVMに対してStage0のディレクトリにライブラリパスを設定し,nqp.moarvmを実行させることでnqpの対話型環境が起動する. | 188 MoarVMに対してStage0のディレクトリにライブラリパスを設定し,nqp.moarvmを実行させることでnqpの対話型環境が起動する. |
171 | 189 |
172 実際にperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にstage0を利用してStage1をビルドしNQPコンパイラを作成する. | 190 実際にperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にstage0を利用してStage1をビルドしNQPコンパイラを作成する. |
173 | 191 |
174 Roastやドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている. | 192 Roastやドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている. |
175 現在の公表されているNQPのオペコードはNQPのGitHubリポジトリ\cite{nqpopcode}に記述されているものである. | 193 現在の公表されているNQPのオペコードはNQPのリポジトリ\cite{nqpopcode}に記述されているものである. |
176 | 194 |
177 | 195 |
178 \subsection{Rakudo Perl6} | 196 \subsection{Rakudo Perl6} |
179 Rakudo実装上におけるPerl6はRakudo Perl6と呼ばれているGitリポジトリで管理されているプログラムのことである. | 197 Rakudo実装上におけるPerl6はRakudo Perl6と呼ばれているGitリポジトリで管理されているプログラムのことである. |
180 前述した通りRakudo Perl6はPerl6のサブセットであるNQPを用いて記述されている. | 198 前述した通りRakudo Perl6はPerl6のサブセットであるNQPを用いて記述されている. |
183 | 201 |
184 言語的な特徴としてはPerl5とは違いアトミックに演算を行う事が可能な絵文字で実装されたatom演算子や,すべてがオブジェクトであるオブジェクト指向言語としての進化も見られる. | 202 言語的な特徴としてはPerl5とは違いアトミックに演算を行う事が可能な絵文字で実装されたatom演算子や,すべてがオブジェクトであるオブジェクト指向言語としての進化も見られる. |
185 またPerl6は漸進的型付け言語である. | 203 またPerl6は漸進的型付け言語である. |
186 従来のPerlの様に変数に代入する対象の型や文脈に応じて型を変更する動的型言語としての側面を持ちつつ独自に定義した型を始めとする様々な型に静的に変数の型を設定する事が可能である. | 204 従来のPerlの様に変数に代入する対象の型や文脈に応じて型を変更する動的型言語としての側面を持ちつつ独自に定義した型を始めとする様々な型に静的に変数の型を設定する事が可能である. |
187 | 205 |
188 \begin{figure}[ht] | |
189 \begin{center} | |
190 \includegraphics[width=70mm]{fig/perl6nqp.pdf} | |
191 \end{center} | |
192 \caption{Perl6の構成st} | |
193 \label{fig:perl6construction} | |
194 \end{figure} | |
195 | 206 |
196 \subsection{現在のPerl6} | 207 \subsection{現在のPerl6} |
197 Perl6の言語仕様\cite{perl6design}とその時点での実装状況を纏めた公式ドキュメント\cite{perl6doc}は分離している. | 208 Perl6の言語仕様\cite{perl6design}とその時点での実装状況を纏めた公式ドキュメント\cite{perl6doc}は分離している. |
198 従来は言語仕様は自然言語の仕様書であったが,現在はテストスイートである「Roast\cite{roast}」そのものと定義されている. | 209 従来は言語仕様は自然言語の仕様書であったが,現在はテストスイートである「Roast\cite{roast}」そのものと定義されている. |
199 現在のPerl6の仕様を読む場合Roastを確認し,現在rakudo上に実装されている機能を見る場合は公式ドキュメントを確認する必要がある. | 210 現在のPerl6の仕様を読む場合Roastを確認し,現在rakudo上に実装されている機能を見る場合は公式ドキュメントを確認する必要がある. |
210 | 221 |
211 \subsection{MoarByteCodeのディスパッチ} | 222 \subsection{MoarByteCodeのディスパッチ} |
212 MoarVMのバイトコードインタプリタはsrc/core/interp.cで定義されている. | 223 MoarVMのバイトコードインタプリタはsrc/core/interp.cで定義されている. |
213 この中の関数MVM\_interp\_runで命令に応じた処理を実行する. | 224 この中の関数MVM\_interp\_runで命令に応じた処理を実行する. |
214 関数内では命令列が保存されているcur\_op,現在と次の命令を指し示すop,Threadの環境が保存されているThreadcontextなどの変数を利用する. | 225 関数内では命令列が保存されているcur\_op,現在と次の命令を指し示すop,Threadの環境が保存されているThreadcontextなどの変数を利用する. |
215 命令実行は大きく二種類の動作があり,Cのgotoが利用できる場合はMVM\_CGOTOフラグが立ちラベル遷移を利用する. | 226 命令実行は大きく二種類の動作があり,Code\ref{orig_macro}に示すCのgotoが利用できる場合はMVM\_CGOTOフラグが立ちラベル遷移を利用する. |
216 それ以外の場合は巨大なcase文として命令を実行する. | 227 それ以外の場合は巨大なcase文として命令を実行する. |
217 | 228 |
218 ラベル遷移を利用する場合はラベルテーブルにアクセスし,テーブルに登録されているアドレスを取得し,NEXTで遷移する. | 229 ラベル遷移を利用する場合はラベルテーブルにアクセスし,テーブルに登録されているアドレスを取得し,NEXTで遷移する. |
219 このラベルテーブルの中身はラベルが変換されたアドレスであるため,Cレベルでのデバッグ時にはアドレスと実際に呼ばれる箇所を確認する事に手間がかかる. | 230 このラベルテーブルの中身はラベルが変換されたアドレスであるため,Cレベルでのデバッグ時にはアドレスと実際に呼ばれる箇所を確認する事に手間がかかる. |
220 巨大なcase文として実行された場合,実行時間が遅いだけでなく,ラベル遷移と共存させて記述を行っている為Cのソースコードにおける可読性も低下する. | 231 巨大なcase文として実行された場合,実行時間が遅いだけでなく,ラベル遷移と共存させて記述を行っている為Cのソースコードにおける可読性も低下する. |
221 | 232 |
222 CbCMoarVMではこの問題を解決するために,それぞれの命令に対応するCodeSegmentを作成し,CodeSegment名前を要素として持つCbCのCodeSegmentのテーブルを作成した. | 233 CbCMoarVMではこの問題を解決するために,それぞれの命令に対応するCodeSegmentを作成し,CodeSegment名前を要素として持つCbCのCodeSegmentのテーブルを作成した. |
234 \lstinputlisting[label=orig_macro, caption=interp.cのマクロ部分]{./src/orig_macro.c} | |
235 | |
223 | 236 |
224 \subsection{命令実行箇所のCodeSegmentへの変換} | 237 \subsection{命令実行箇所のCodeSegmentへの変換} |
225 ラベルテーブルやcase文のswitch相当の命令実行箇所をCbCに変換し,CodeSegmentの遷移として利用する. | 238 ラベルテーブルやcase文のswitch相当の命令実行箇所をCbCに変換し,CodeSegmentの遷移として利用する. |
226 interp.cは?に示す様なスタイルで記述されている. | 239 interp.cはCode\ref{dispatch_c}に示すスタイルで記述されている. |
240 \lstinputlisting[label=dispatch_c, caption=オリジナル版MoarVMのバイトコードディスパッチ]{./src/dispatch.c} | |
241 | |
242 | |
227 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為,バイトコードの名前はLABELSの配列の添字に変換されている. | 243 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為,バイトコードの名前はLABELSの配列の添字に変換されている. |
228 そのため対象となるCodeSegmentをLABLESの並びと対応させ,配列CODESに設定すればCodeSegmentの名前は問わない. | 244 そのため対象となるCodeSegmentをLABLESの並びと対応させ,配列CODESに設定すればCodeSegmentの名前は問わない. |
229 今回はCodeSegmentである事を示す為にsuffixとしてcbc\_をつける. | 245 今回はCodeSegmentである事を示す為にsuffixとしてcbc\_をつける. |
246 | |
247 命令実行中のCodeSegmentの遷移を図\ref{fig:perl6cbcinter}に示す. | |
248 この中で実線で書かれている部分はCbCのgoto文で遷移し,波線の箇所は通常のCの関数呼び出しとなっている. | |
249 | |
250 %現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextというCodeSegmentで処理している. | |
251 %これは元のMoarVMの命令ディスパッチで行われる現在のオペコードを示すcur\_opと命令列opの操作及び次のラベルに遷移するマクロに該当する. | |
252 %CbCMoarVMではラベルに対しての遷移の代わりにMoarVMの命令のCodeSegmentの集合体である配列CODESにアクセスし,その要素であるCodeSegmentに対して遷移する形を取っている. | |
230 | 253 |
231 \begin{figure}[ht] | 254 \begin{figure}[ht] |
232 \begin{center} | 255 \begin{center} |
233 \includegraphics[width=70mm]{fig/cbc_next.pdf} | 256 \includegraphics[width=70mm]{fig/cbc_next.pdf} |
234 \end{center} | 257 \end{center} |
235 \caption{CbCにおけるインタプリタの関数遷移} | 258 \caption{CbCにおけるインタプリタの関数遷移} |
236 \label{fig:sendTask} | 259 \label{fig:perl6cbcinter} |
237 \end{figure} | 260 \end{figure} |
238 | 261 |
262 現在CbCで記述されたOSであるGearsOSにはInterfaceが導入されている. | |
263 これはJavaのinterface,Haskellの型クラスに該当する概念であり,次のCodeSegmentにInterface経由で継続する事が可能である. | |
264 Interfaceは現在のMoarVMには実装されていない為,今後ThreadeCodeの実装を行うにあたり導入を検討している. | |
239 | 265 |
240 \subsection{MoarVMのBytecodeのデバッグ} | 266 \subsection{MoarVMのBytecodeのデバッグ} |
241 moarに対してmoarvm bytecodeをdumpオプションを付けて読み込ませるとmoarvmのbytecodeがアセンブラの様に出力される. | 267 moarに対してmoarvm bytecodeをdumpオプションを付けて読み込ませるとmoarvmのbytecodeがアセンブラの様に出力される. |
242 しかしこれはmoarvmが実行したbytecodeのトレースではなくmoarvm bytecodeを変換したものに過ぎない. | 268 しかしこれはmoarvmが実行したbytecodeのトレースではなくmoarvm bytecodeを変換したものに過ぎない. |
243 また,明らかに異なる挙動を示す両者のmoarを利用しても同じ結果が返ってきてしまう. | 269 また,明らかに異なる挙動を示す両者のmoarを利用しても同じ結果が返ってきてしまう. |
273 CbCはCodeSegmentで末尾最適化(Tail call optimization)を行う. | 299 CbCはCodeSegmentで末尾最適化(Tail call optimization)を行う. |
274 これはCodeSegmentは必ず関数呼び出しではなくgotoで次の状態に遷移する為にスタック領域の操作が必要とならない為である. | 300 これはCodeSegmentは必ず関数呼び出しではなくgotoで次の状態に遷移する為にスタック領域の操作が必要とならない為である. |
275 現在のCbCコンパイラの実装ではCodeSegmentからCの関数に戻る場合は末尾最適化を切り,CodeSegment間の遷移では末尾最適化が行われる. | 301 現在のCbCコンパイラの実装ではCodeSegmentからCの関数に戻る場合は末尾最適化を切り,CodeSegment間の遷移では末尾最適化が行われる. |
276 末尾最適化を応用することでContinuation-passingスタイルのThreaded Codeの実装が可能となる.\cite{threadedcode} | 302 末尾最適化を応用することでContinuation-passingスタイルのThreaded Codeの実装が可能となる.\cite{threadedcode} |
277 | 303 |
278 現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextというCodeSegmentで処理している. | 304 %現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextというCodeSegmentで処理している. |
279 これは元のMoarVMの命令ディスパッチで行われる現在のオペコードを示すcur\_opと命令列opの操作及び次のラベルに遷移するマクロに該当する. | 305 %これは元のMoarVMの命令ディスパッチで行われる現在のオペコードを示すcur\_opと命令列opの操作及び次のラベルに遷移するマクロに該当する. |
280 CbCMoarVMではラベルに対しての遷移の代わりにMoarVMの命令のCodeSegmentの集合体である配列CODESにアクセスし,その要素であるCodeSegmentに対して遷移する形を取っている. | 306 %CbCMoarVMではラベルに対しての遷移の代わりにMoarVMの命令のCodeSegmentの集合体である配列CODESにアクセスし,その要素であるCodeSegmentに対して遷移する形を取っている. |
281 この一連の処理がオーバーヘッドになる為,今後はcbc\_fixt\_nextというCodeSegmentを導入し直接次の命令に該当するCodeSegmentへgotoする様に実装する予定である. | 307 この一連の処理がオーバーヘッドになる為,今後はcbc\_fixt\_nextというCodeSegmentを導入し直接次の命令に該当するCodeSegmentへgotoする様に実装する予定である. |
282 | 308 |
283 \subsubsection{perlcc} | 309 \subsubsection{perlcc} |
284 Perl5においてはperlccというモジュールが開発されている. | 310 Perl5においてはperlccというモジュールが開発されている. |
285 これはPerl5内部で利用しているPerlバイトコードを,PerlのC APIであるXS言語の様なCのソースファイルに埋め込み,それをCコンパイルでコンパイルするというものである. | 311 これはPerl5内部で利用しているPerlバイトコードを,PerlのC APIであるXS言語の様なCのソースファイルに埋め込み,それをCコンパイルでコンパイルするというものである. |
337 CbCコンパイラはgccとllvm/clangに実装している為,これらのアップデートに追従する必要がある. | 363 CbCコンパイラはgccとllvm/clangに実装している為,これらのアップデートに追従する必要がある. |
338 しかしコンパイラのバージョンに応じてCbCで利用するコンパイラ内のAPIが異なる場合が多く,APIの変更に伴う修正作業などを行う必要がある. | 364 しかしコンパイラのバージョンに応じてCbCで利用するコンパイラ内のAPIが異なる場合が多く,APIの変更に伴う修正作業などを行う必要がある. |
339 | 365 |
340 CbCMoarVMではCからCbCへ,CbCからCへの遷移などが複数回繰り返されているが,CodeSegmentでのtail callの強制が非常に難関である. | 366 CbCMoarVMではCからCbCへ,CbCからCへの遷移などが複数回繰り返されているが,CodeSegmentでのtail callの強制が非常に難関である. |
341 tail callの強制には関数定義の箇所や引数,スタック領域のサイズ修正などを行う必要がある. | 367 tail callの強制には関数定義の箇所や引数,スタック領域のサイズ修正などを行う必要がある. |
342 この実装の為にはどのケースで関数が定義されているかをCbCコンパイラで明確に分割する必要がある. | |
343 | 368 |
344 | 369 |
345 \section{今後の課題} | 370 \section{今後の課題} |
346 本論文ではCbCによってPerl6の処理系であるMoarVMインタプリタの一部改良とその手法を示した. | 371 本論文ではCbCによってPerl6の処理系であるMoarVMインタプリタの一部改良とその手法を示した. |
347 CbCのCodeSegment部分を用いることできめ細やかな記述が出来,デバッグし辛い箇所もbreakpointの設定などが容易になった. | 372 CbCのCodeSegment部分を用いることできめ細やかな記述が出来,デバッグし辛い箇所もbreakpointの設定などが容易になった. |
348 | 373 |
349 今後CbCでの開発をより深く行っていくにあたり,CbCコンパイラそのものの信頼性を向上させる必要がある. | 374 今後CbCでの開発をより深く行っていくにあたり,CbCコンパイラそのものの信頼性を向上させる必要がある. |
350 MoarVMの開発を行うにあたり新たに発見された複数のバグを修正し,より安定するコンパイラに改良を行う. | 375 MoarVMの開発を行うにあたり新たに発見された複数のバグを修正し,より安定するコンパイラにする為に改良を行う. |
351 | 376 |
352 現在CbCMoarVMで直接バイトコードを入力した場合のnqpのテストは\%パスする. | 377 現在CbCMoarVMで直接バイトコードを入力した場合のnqpのテストは\%パスする. |
353 また数値の計算と出力などの簡単なNQPの例題を作成し,オリジナルのNQP,moarvmでバイトコード化したものを入力した際も正常に動作している. | 378 また数値の計算と出力などの簡単なNQPの例題を作成し,オリジナルのNQP,moarvmでバイトコード化したものを入力した際も正常に動作している. |
354 今後はさらに複雑な例題やPerl6の独自文法でも動くかどうかの実験を行う. | 379 今後はさらに複雑な例題やPerl6の独自文法でも動くかどうかの実験を行う. |
355 | 380 |
359 | 384 |
360 また高速化という面では,Perlの特徴である正規表現に着目し,正規表現の表現のみ高速で動く最適化の導入なども検討している. | 385 また高速化という面では,Perlの特徴である正規表現に着目し,正規表現の表現のみ高速で動く最適化の導入なども検討している. |
361 | 386 |
362 Perl6の開発は非常に活発に行われている為,CbCMoarVMの最新版の追従も課題となっている. | 387 Perl6の開発は非常に活発に行われている為,CbCMoarVMの最新版の追従も課題となっている. |
363 現在はinterp.cからPerlスクリプトを用いて自動でCbCのCodeSegmentを生成している. | 388 現在はinterp.cからPerlスクリプトを用いて自動でCbCのCodeSegmentを生成している. |
364 今後の開発領域の拡大と共により効率的にCbCコードへの自動変換も開発していく. | 389 今後の開発領域の拡大と共により効率的にCbCコードへの自動変換も複数のCコードに対応する様に開発を行っていく.. |
365 | 390 |
366 %å\subsection{MoarVMの処理流れ} | 391 %å\subsection{MoarVMの処理流れ} |
367 %MoarVMはC言語で実装されており,Perl5で記述されたConfigure.plを | 392 %MoarVMはC言語で実装されており,Perl5で記述されたConfigure.plを |
368 | 393 |
369 | 394 |