Mercurial > hg > Papers > 2019 > anatofuz-midterm
changeset 4:0cfdbf1cec79
create mid_thesis
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 09 Nov 2018 17:18:25 +0900 |
parents | 8f6bed4860a9 |
children | 97ca0612ce5b |
files | mid_thesis.pdf mid_thesis.tex reference.bib |
diffstat | 3 files changed, 107 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/mid_thesis.tex Tue Oct 30 18:08:55 2018 +0900 +++ b/mid_thesis.tex Fri Nov 09 17:18:25 2018 +0900 @@ -42,15 +42,16 @@ \section{CbC} Perl6処理系の改良にはLLVM/Clang上に実装したContinuation based C(CbC)を用いる. CbCはCからコンパイルする事が可能である為Cのリソースを利用したCとは異なる言語である. -CbCはCodeSegmentを基本的な処理単位とし,CodeSegmentの遷移でプログラムを記述する. +CbCはCodeGearを基本的な処理単位とし,CodeGearの遷移でプログラムを記述する. CodeSegmentの宣言は\_\_codeという型を持つ関数として宣言する. -ただしこの関数は\_\_codeという型を返すわけではなく,CodeSegmentである事を示す指示子のような役割である. -CodeSegmentはCの関数とは異なり返り値を持たず,呼び差し元の関数に戻る代わりに別のCodeSegmentへ遷移する. +ただしこの関数は\_\_codeという型を返すわけではなく,CodeGearである事を示す指示子のような役割である. +CodeGearはCの関数とは異なり返り値を持たず,呼び差し元の関数に戻る代わりに別のCodeGearへ遷移する. 返り値を使わず,別の関数呼び出しを実行するプログラミングスタイルを継続と呼ぶが,C言語における継続とは異なり -CbCにおけるCodeSegment間の継続はスタックに値を積まず,スタックの変更を行わない. -環境を持たず遷移する先のCodeSegmentの指定のみに動作する為,通常の継続と区別して軽量継続と呼ぶ. -CbCは軽量継続を中心にプログラミングする事が可能であるため,並列化やループ制御,関数呼び出しにおけるスタック制御などを -意識したプログラミングスタイルでプログラミングする事が可能である. +CbCにおけるCodeGear間の継続はスタックに値を積まず,スタックの変更を行わない. +また自分自身がどの行にいるかという情報を環境と言うが,CbCはこの環境を持たず継続する. +これを通常の継続と区別して軽量継続と呼ぶ. +CbCは軽量継続を中心にプログラミングする事が可能であるため,レジスタの移動などが行われない. +その為並列化やループ制御,関数呼び出しにおけるスタック制御などを意識したプログラミングスタイルでプログラミングする事が可能である. \section{Perl6} @@ -64,23 +65,85 @@ RakudoではMoarVMと言われるVMがNQPを解釈し,Parrotと同様にPerl6はNQPで実装されている. Parrotとは異なりMoarVMはPerl6プロジェクトに特化した仮想環境である. このNQPで記述されたPerl6の事をRakudoと呼ぶ. -RakudoはMoarVMの他にJVM,Javascript,GraalVMを動作環境として選択可能である. +RakudoはMoarVMの他にJVM,Javascriptを動作環境として選択可能である. + +言語的な特徴ではPerl5とは違いオブジェクト指向のサポートが強力になっている. +またPerl6は漸進的型付け言語である. +従来のPerlの様に変数に代入する対象の型や文脈に応じて型を変更する動的型言語としての側面を持ちつつ独自に定義した型を始めとする様々な型に静的に変数の型を設定する事が可能である. -言語的な特徴ではPerl5とは違いすべての変数がオブジェクトである. -Perl5は動的型付け言語であり,通常の言語機能として整数型などの明確な型をプログラマが宣言する方法が存在しなかった. -Perl6ではPerl5まで利用されていた動的型付けの他に,プログラマが明示的に型を宣言する静的型付け言語としての側面も追加された. -また関数型プログラミングの特徴である高階関数やラムダ式の導入もなされている. -さらに文法そのものをプログラマがプログラミングする事が可能となっておりPerl5と比較して非常に強力な言語機能となっている. +%処理時間は状況にもよるが231Kbのファイルを正規表現で検索する例題を実行した場合 +処理時間は状況によるが,231KBのファイルを正規表現で検索する例題の場合Perl5が0.04sに対しMoarVMに乗せたPerl6は0.86sとおよそ20倍の速度差がある. +%* Perl5 +% * 0.04s +%* Ruby +% * 0.15s +%* Python +% * 0.06s +%* Java +% * 0.27s +%* Perl6(Moar) +% * 0.86s + +\section{NQP} +NQPとはPerl6のサブセットである. +その為基本的な文法などはPerl6に準拠しているが,変数を束縛で宣言するなどの違いが見られる. + +NQPは最終的にはNQP自身でブートストラップする言語であるが,ビルドの最初にはすでに書かれたMoarvMByteCodeを必要とする. +このMoarVMByteCodeの状態をStage0と言う. +Perl6の一部はNQPを拡張したもので書かれている為,Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる. +NQPは与えられたStage0を使いStage1をビルドし,そのStage1を利用しStage2をビルドする事で生成できる. + \section{MoarVM} MoarVMはPerl6のVMであり,Rakudoプロジェクトとして開発されているVMである. このVMはOSレベルの仮想化を行うVMではなく,擬似的なアセンブラを解釈するソフトウェアとしての擬似機械のことである. +MoarVMはC言語で実装されておりPerl6に特化した仮想機械となっている. +MoarVMは個別で起動することが出来ず,NQPもしくはPerl6をMoarVMに入力として与え実行する. +またMoarVMはレジスタマシンである為,仮想的なレジスタを持っている. +\section{MoarVMにおける命令コードのディスパッチ} +MoarVMはNQPから変換されたバイトコードを読み取り,都度実行する. +MoaRVMの場合この処理はMVM\_interp\_runという関数で行われている. +この関数内ではMoarVMが実行すべき命令が並んだ命令列を持ち,その値で巨大なcase文,またはCのラベルジャンプによって分岐させる. +分岐後は命令に応じた処理をMoarVMが行い,次の命令を実行する. +例えばno\_op命令は何も実行せず,次の命令に遷移するなどである. +次の命令に遷移する為には,現在の命令列から,実行した命令の長さ分プログラムカウンタの様な変数をインクリメントする. +インクリメント後の命令列が指す値を,実行すべき命令として設定し,その値がなんであるかを読み取る. +読み取りが終了後,再びswitch文,またはラベルジャンプでその処理へと遷移する. +これを命令コードのディスパッチと呼ぶ. +命令コードの実行の中では,現在のMoarVMのレジスタであるreg\_baseやスレッドごとの環境である構造体tcなどを参照する. +この方法の問題点として,巨大なcase文になっている為命令列の分割が出来ない. +ディスパッチ部分の処理が都度走る為低速になる. +Cファイルでの可読性とモジュール化が損なわれてしまう. +ラベルにbreak pointを設定できない為デバッグし辛いなどがあげられる. +\section{CbCによるMoarVMの命令ディスパッチ部分の修正} +本研究ではMoarVMは2018.04.01のバージョンで実装している. +命令コードの実行すべき単位はCbCのCodeGearの単位として見れる. +その為この処理を命令ごとCodeGearとして変換する. +この変換作業は莫大である為PerlScriptなどを用いて自動化している. +変換されたCodeGearはオリジナルのMoarVMの命令コードと対応させる為に +CodeGearの配列に格納する. +MoarVMはこの配列を参照し,要素として得られるCodeGearに軽量継続を行う. +CodeGearでの処理が終了すると,次のCodeGearを決定する為に必要な計算をcbc\_nextというCodeGearで行う. +cbc\_nextで次の遷移先が決定すると,そのCodeGearに軽量継続を行う.CbCMoarVMではこれを繰り返す. + +オリジナルのMoarVMとは異なり,同一関数上で実行する訳では無い為,MVM\_interp\_runで定義している局所変数のレジスタreg\_baseなどにアクセスすることは通常では出来ない. +その為CodeSegmentの遷移において,これら必要なインタプリタの情報を纏めた構造体INTERを宣言し,このポインタであるINTERPを引数として入力する. +各CodeSegmentではこのINTERPを経由することでレジスタ情報などにアクセスする. + +この方法の利点としてCodeGearは単なる関数として扱える為,元のソースコードの様に同一ファイル内に全ての処理を書く必要がない. +またラベルにはbreak pointを設定する事が出来なかったが,CodeGearはデバッガからは関数として見る事ができるため通常のCの関数の様にbreak pointを設定する事が可能である. + +このCbCMoarVMのデバッグにはオリジナルのMoarVMとCbCMoarVMが実行した命令コードをデバッガで出力しログを取る必要がある. +取得したログから実行すべき命令番号が設定されている変数opの値を,オリジナルとCbC版で違いが発生するか解析する. +違いがあった場合,この命令を実行する箇所にbreak pointをかけて変数の値を比較する. \section{今後の課題} -% Xv6 で CbC が動くようになれば、Raspberry Pi 以外のハードウェアでの実装も容易になるので、Linux 上での実装を目指して研究を進めていく。Xv6 で CbC が動けば、続けて Linux 上で Gears OS の実装も行なっていく。 -% +現在は命令処理のCodeGear変換が実装し,実際に多くのMoarVMByteCodeの実行が可能である. +しかしオブジェクト生成のエラーによりNQPのセルフビルドは実現できていない為,これの原因追求と修正を行う. +また現在は次のCodeGearを計算しているが,これを計算せず直接実行するThreded Codeの実装を行いより高速化を図る. +並行して利用しているCbCコンパイラに幾つかのバグが本研究を通して発見された為,コンパイラのバグの修正を行う. \nocite{*} \bibliographystyle{junsrt}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/reference.bib Fri Nov 09 17:18:25 2018 +0900 @@ -0,0 +1,29 @@ +%% This BibTeX bibliography file was created using BibDesk. +%% https://bibdesk.sourceforge.io/ + +%% Created for TakahiroSHIMIZU at 2018-11-06 12:59:33 +0900 + + +%% Saved with string encoding Unicode (UTF-8) + + +@misc{perl6doc, + title = {Perl6 Documentation}, + howpublished = {\url{https://docs.perl6.org/}}, +} + + +@article{llvmcbc, + author = "徳森 海斗 and 河野真治", + title = "LLVM Clang 上の Continuation based C コンパイラの改良", + journal = "琉球大学工学部情報工学科平成27年度学位論文(修士)", + year = 2015 +} + + +@misc{threadecodes, + title = {Threaded Code}, + author = {Bell, James R}, + journal = {Communications of the ACM 16.6}, + year = 1973, +}