Mercurial > hg > Papers > 2019 > anatofuz-prosym
comparison Paper/anatofuz.tex @ 76:57547b9cbf5f
update
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 29 Nov 2018 17:06:31 +0900 |
parents | 1c1307cedf11 |
children | ddf88af2253e |
comparison
equal
deleted
inserted
replaced
75:1c1307cedf11 | 76:57547b9cbf5f |
---|---|
46 %概要 | 46 %概要 |
47 \begin{abstract} | 47 \begin{abstract} |
48 スクリプト言語であるPerl5の後継言語としてPerl6が現在開発されている. | 48 スクリプト言語であるPerl5の後継言語としてPerl6が現在開発されている. |
49 Perl6は設計と実装が区分されており様々な処理系が開発されている.現在主流なPerl6はRakudoと言われるプロジェクトである. | 49 Perl6は設計と実装が区分されており様々な処理系が開発されている.現在主流なPerl6はRakudoと言われるプロジェクトである. |
50 RakudoではPerl6自体をNQP(NotQuitPerl)と言われるPerl6のサブセットで記述し, NQPをVMが解釈するという処理の流れになっている. | 50 RakudoではPerl6自体をNQP(NotQuitPerl)と言われるPerl6のサブセットで記述し, NQPをVMが解釈するという処理の流れになっている. |
51 このVMは任意のVMが選択できるようになっており, 現在はMoarVM, JavaVM, JavaScriptが動作環境として選択可能である. | 51 このVMは任意のVMが選択できるようになっており,主に利用されているVMにCで書かれたMoarVMが存在する. |
52 主に利用されているVMにCで書かれたMoarVMが存在する. | |
53 MoarVMはJITコンパイルなどをサポートしているが, 全体的な起動時間及び処理速度がPerl5と比較し非常に低速である. | 52 MoarVMはJITコンパイルなどをサポートしているが, 全体的な起動時間及び処理速度がPerl5と比較し非常に低速である. |
54 この問題を解決するためにContinuation based C (CbC)という言語を一部用いてMoarVMの書き換えを行う. | 53 この問題を解決するためにContinuation based C (CbC)という言語を一部用いてMoarVMの書き換えを行う. |
55 CbCはCよりも細かな単位で記述が可能である為, 言語処理系の実装に適していると考えられる. | 54 CbCはCよりも細かな単位で記述が可能である為, 言語処理系の実装に適していると考えられる. |
55 CbCに関する今までの研究においては, 言語処理系にCbCを利用した事例が少ない. | |
56 その為, 本稿ではCbCを言語処理系に用いた場合の利点やデバッグ手法などについても述べる. | 56 その為, 本稿ではCbCを言語処理系に用いた場合の利点やデバッグ手法などについても述べる. |
57 | 57 |
58 | 58 |
59 \end{abstract} | 59 \end{abstract} |
60 | 60 |
77 | 77 |
78 CbCをMoarVMの実装として利用した場合, CbCの持つ機能によってMoarVMの高速化を中心とした改良に有益な効果があると推測出来る. | 78 CbCをMoarVMの実装として利用した場合, CbCの持つ機能によってMoarVMの高速化を中心とした改良に有益な効果があると推測出来る. |
79 また, 現在までのCbCを用いた研究においては言語処理系への応用例が少ない. | 79 また, 現在までのCbCを用いた研究においては言語処理系への応用例が少ない. |
80 従って, 本稿はCbCをスクリプト言語の実装に適応した場合, どのような利点やプログラミング上の問題点に遭遇するか, CbCの応用としての側面でも行う. | 80 従って, 本稿はCbCをスクリプト言語の実装に適応した場合, どのような利点やプログラミング上の問題点に遭遇するか, CbCの応用としての側面でも行う. |
81 この際にCbCを用いた言語処理系のデバッグを行う際には, CbCを使わずに記述されたオリジナルの言語処理系との並列デバッグが必要となる. | 81 この際にCbCを用いた言語処理系のデバッグを行う際には, CbCを使わずに記述されたオリジナルの言語処理系との並列デバッグが必要となる. |
82 従ってMoarVMにCbCを適応した場合, どのようにすれば並列デバッグが行えるかについて述べる. | 82 従ってMoarVMにCbCを適応した場合, どのようにすれば並列デバッグが行えるかについても述べる. |
83 本稿ではまずCbC, Perl6の特徴及び現在の実装について述べ, CbCで書き換えたMoarVMについてデバッグ手法も含め解説する. | 83 本稿ではまずCbC, Perl6の特徴及び現在の実装について述べ, CbCで書き換えたMoarVMについてデバッグ手法も含め解説する. |
84 研究にあたり, 得られたCbCを言語処理系に適応した場合の利点と欠点について述べ, 今後の展望について記載する. | 84 研究にあたり, 得られたCbCを言語処理系に適応した場合の利点と欠点について述べ, 今後の展望について記載する. |
85 | 85 |
86 \section{CbC} | 86 \section{CbC} |
87 \subsection{CbCの概要} | 87 \subsection{CbCの概要} |
133 CbCコンパイラはコンパイル対象のソースコードがCbCであるかどうかを判断する. | 133 CbCコンパイラはコンパイル対象のソースコードがCbCであるかどうかを判断する. |
134 この際にCodeGearを利用していない場合は通常のCプログラムとして動作する. | 134 この際にCodeGearを利用していない場合は通常のCプログラムとして動作する. |
135 その為今回検証するMoarVMのビルドにおいてもCbCで書き換えたソースコードがあるMoarVMと, 手を加えていないオリジナルのMoarVMの2種類を同一のCbCコンパイラでビルドする事が可能である. | 135 その為今回検証するMoarVMのビルドにおいてもCbCで書き換えたソースコードがあるMoarVMと, 手を加えていないオリジナルのMoarVMの2種類を同一のCbCコンパイラでビルドする事が可能である. |
136 | 136 |
137 またCからCbCへの遷移時に, 再びCの関数に戻るように実装したい場合がある. | 137 またCからCbCへの遷移時に, 再びCの関数に戻るように実装したい場合がある. |
138 その際は環境付きgotoと呼ばれる手法を取る.これは\_CbC\_return及び\_CbC\_environmentという変数を渡す. | 138 その際は環境付きgotoと呼ばれる手法を取る.これは\_CbC\_return及び\_CbC\_environmentという変数を使用する. |
139 この変数は\_CbC\_returnが元の環境に戻る際に利用するCodeGearを指し, \_CbC\_environmentは復帰時に戻す元の環境である. | 139 この変数は\_CbC\_returnが元の環境に戻る際に利用するCodeGearを指し, \_CbC\_environmentは復帰時に戻す元の環境である. |
140 復帰する場合, 呼び出した位置には帰らず, 呼び出した関数の終了する位置に帰る. | 140 復帰する場合, 呼び出した位置には帰らず, 呼び出した関数の終了する位置に帰る. |
141 \lstinputlisting[label=cbcreturn, caption=環境付き継続の例]{./src/return.cbc} | 141 \lstinputlisting[label=cbcreturn, caption=環境付き継続の例]{./src/return.cbc} |
142 Code\ref{cbcreturn}に示す例ではc\_funcから環境付き継続でcgに継続している. | 142 Code\ref{cbcreturn}に示す例ではc\_funcから環境付き継続でcgに継続している. |
143 通常c\_funcの返り値は-1であるが, cgから環境付き継続でmainに帰る為にcgから渡される1がtestの値となる. | 143 通常c\_funcの返り値は-1であるが, cgから環境付き継続でmainに帰る為にcgから渡される1がtestの値となる. |
227 \caption{NQPのビルドフロー} | 227 \caption{NQPのビルドフロー} |
228 \label{fig:nqpbuild} | 228 \label{fig:nqpbuild} |
229 \end{figure} | 229 \end{figure} |
230 | 230 |
231 NQPのビルドフローを図\ref{fig:nqpbuild}に示す. | 231 NQPのビルドフローを図\ref{fig:nqpbuild}に示す. |
232 実際にPerl6の処理系であるperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にStage0を利用してStage1をビルドしNQPコンパイラを作成する. | 232 RakudoによるPerl6に処理系はNQPにおけるnqpと同様に, moarにライブラリパスなどを設定したperl6というシェルスクリプトである. |
233 このperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にStage0を利用してStage1をビルドしNQPコンパイラを作成する. | |
233 Stage1は中間的な出力であり, 生成されたNQPファイルはStage2と同一であるが, MoarVMのバイトコードが異なる. | 234 Stage1は中間的な出力であり, 生成されたNQPファイルはStage2と同一であるが, MoarVMのバイトコードが異なる. |
234 Perl6では完全なセルフコンパイルを実行したNQPが要求される為, Stage1を利用してもう一度ビルドを行いStage2を作成する. | 235 Perl6では完全なセルフコンパイルを実行したNQPが要求される為, Stage1を利用してもう一度ビルドを行いStage2を作成する. |
235 | 236 |
236 Perl6のテストスイートであるRoast\cite{roast}やドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている. | 237 Perl6のテストスイートであるRoast\cite{roast}やドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている. |
237 現在の公表されているNQPのオペコードはNQPのリポジトリ\cite{nqpopcode}に記述されているものである. | 238 現在の公表されているNQPのオペコードはNQPのリポジトリ\cite{nqpopcode}に記述されているものである. |
261 JVM自体の処理時間とRakudoを構築したJVMの速度の差を見るために, 同様のプログラムをJava10でも行った. | 262 JVM自体の処理時間とRakudoを構築したJVMの速度の差を見るために, 同様のプログラムをJava10でも行った. |
262 | 263 |
263 \begin{itemize} | 264 \begin{itemize} |
264 \item Perl6 (MoarVM) ver.2018.04.01 | 265 \item Perl6 (MoarVM) ver.2018.04.01 |
265 \item Perl6 (JVM) 2018.06-163-g612d071b8 built on JVM | 266 \item Perl6 (JVM) 2018.06-163-g612d071b8 built on JVM |
266 \item Python 3.6.5 | |
267 \item Java 10 | 267 \item Java 10 |
268 \item Perl5 | 268 \item Perl5 |
269 \end{itemize} | 269 \end{itemize} |
270 | 270 |
271 測定した結果を以下に示す.測定結果の単位は秒である. | 271 測定した結果を以下に示す.測定結果の単位は秒である. |
596 perlccを利用することでPerlインタプリタが無い状況でも可動するバイナリファイルを作成する事が可能である. | 596 perlccを利用することでPerlインタプリタが無い状況でも可動するバイナリファイルを作成する事が可能である. |
597 しかしperlccはPerlスクリプトが複雑になるほど正確にCに移植を行う事が出来ず, 現在ではPerlのコアモジュールから外されている. | 597 しかしperlccはPerlスクリプトが複雑になるほど正確にCに移植を行う事が出来ず, 現在ではPerlのコアモジュールから外されている. |
598 perlccはPerlのバイトコードをCへの変換のみ行う為, Cで実装されているPerl経由で実行した場合と処理速度はほぼ変わらない. | 598 perlccはPerlのバイトコードをCへの変換のみ行う為, Cで実装されているPerl経由で実行した場合と処理速度はほぼ変わらない. |
599 またperlccで生成されたCのソースコードは難解であり, これをデバッグするのが困難でもある. | 599 またperlccで生成されたCのソースコードは難解であり, これをデバッグするのが困難でもある. |
600 MoarVMでthreaded codeを実現出来た場合, その箇所のみCbCプログラムとして切り出す事が可能である為perlccと似たツールを作成することも可能である. | 600 MoarVMでthreaded codeを実現出来た場合, その箇所のみCbCプログラムとして切り出す事が可能である為perlccと似たツールを作成することも可能である. |
601 Cレベルでもperlccの様に内部構造をCの関数化すればThrededCodeの様な物を構築できるが, CbCと比較して処理の単位が明確ではない為高速化は見込めない. | 601 C言語でもperlccの様に内部構造をCの関数化すればThrededCodeの様な物を構築できるが, CbCと比較して処理の単位が明確ではない為高速化は見込めない. |
602 また, CbCのCodeGearは基本ブロックそのものである為, CbCプログラムとして切り出す場合, CodeGearをそのまま出力すればよく, 生成されたCbCプログラム自体もperlccと比較して扱いやすい. | |
602 CbCを用いたThrededCodeでperlccの様なツールを作成した場合, CodeGearの単位が正常に機能すればCbCのCodeGearがThrededCodeをより効率化出来ると推測できる. | 603 CbCを用いたThrededCodeでperlccの様なツールを作成した場合, CodeGearの単位が正常に機能すればCbCのCodeGearがThrededCodeをより効率化出来ると推測できる. |
603 | 604 |
604 | 605 |
605 CbCのCodeGearはgoto文で遷移するため, 次のCodeGearが一意に決定している場合Cコンパイラ側でインライン展開する事が可能である. | 606 CbCのCodeGearはgoto文で遷移するため, 次のCodeGearが一意に決定している場合Cコンパイラ側でインライン展開する事が可能である. |
606 CodeGearがインライン展開される限界については別途研究する必要があるが, CbCを利用した場合CodeGear単位でインライン展開が可能である. | 607 CodeGearがインライン展開される限界については別途研究する必要があるが, CbCを利用した場合CodeGear単位でインライン展開が可能である. |