Mercurial > hg > Papers > 2019 > anatofuz-thesis
changeset 43:49e6b3116f12
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 15 Feb 2019 13:56:23 +0900 |
parents | fc3f4de57bb1 |
children | bbf886a770fa |
files | paper/chapter3.tex paper/chapter4.tex paper/fig/bytecode_sample_generally_lang.graffle paper/fig/bytecode_sample_generally_lang.pdf paper/fig/bytecode_segment.graffle paper/fig/bytecode_segment.pdf paper/fig/cbc_next_sample.graffle paper/fig/not_use_bytecode_sample_generally_lang.graffle paper/fig/not_use_bytecode_sample_generally_lang.pdf paper/fig/nqp_stage0_to_1.graffle paper/main.pdf |
diffstat | 11 files changed, 28 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter3.tex Thu Feb 14 18:13:42 2019 +0900 +++ b/paper/chapter3.tex Fri Feb 15 13:56:23 2019 +0900 @@ -83,10 +83,20 @@ その為、 既に存在しているMoarVMバイトコードで記述されたNQPのインプリタファイルを、 適切にオプションで指定し、moarを実行することでNQPのインタプリタが起動する。 +NQPのビルドフローの一部を図\ref{fig:nqp_stage0_to_1}に示す。 + NQPのビルドには、 このNQPインタプリタをまず利用し、 NQP自体のソースコードを入力して与え、 ターゲットとなるVMのバイトコードを生成する。 既に用意されている、 ターゲットのVMのバイトコード化しているNQPインタプリタの状態を Stage0 と呼ぶ。 Stage0を利用し、NQPソースコードからビルドしたNQPインタプリタであるバイトコードを、 Stage1と呼ぶ。 +\begin{figure}[ht] +\caption{NQP Stage1のビルドフロー} + \begin{center} + \includegraphics[width=120mm]{./fig/nqp_stage0_to_1.pdf} + \end{center} + \label{fig:nqp_stage0_to_1} +\end{figure} + Stage1をmoarの起動時オプションにライブラリとして設定し、 起動したNQPインタプリタで再度ビルドしたNQPインタプリタを、 Stage2と呼ぶ。 この2度目のビルドで、ソースコードからビルドされたVMバイトコードでNQP自身をビルドした事になる。 処理系自身をその処理系でビルドする事をセルフビルドと呼び、 NQPはセルフビルドしたStage2のバイトコードを利用する。
--- a/paper/chapter4.tex Thu Feb 14 18:13:42 2019 +0900 +++ b/paper/chapter4.tex Fri Feb 15 13:56:23 2019 +0900 @@ -8,9 +8,19 @@ 文法に沿っていた場合、 文法に応じてトークンを木構造に変換する。 これを構文解析と呼ぶ。 構文解析の後は、 素朴なインタプリタ言語と呼ばれる種類のプログラミング言語の場合、 これらを木構造の根から順次実行する。 +この処理の流れを図\ref{fig:not_use_bytecode_Sample_generally_lang}に示す。 +直接構文木を実行する場合、 実装そのものは単純になるが、 処理時間などが非常にかかるなどの特徴がある。 -直接構文木を実行する場合、 実装そのものは単純になるが、 処理時間などが非常にかかる。 +\begin{figure}[ht] +\caption{構文木を直接実行するプログラミング言語の処理の流れ} + \begin{center} + \includegraphics[width=120mm]{./fig/not_use_bytecode_sample_generally_lang.pdf} + \end{center} + \label{fig:not_use_bytecode_Sample_generally_lang} +\end{figure} + 現在の主流なスクリプト言語は、 一旦変換した構文木をバイトコードと呼ばれるバイナリ形式に変換する。 +バイトコードを利用する種類のプログラミング言語の、 処理の流れを図\ref{fig:bytecode_Sample_generally_lang}に示す。 この場合、 入力されたソースコードをバイトコードに変換する実装と、 変換されたバイトコードを評価する仮想機械に処理系が分けられる。 仮想機械はOSのエミュレータではなく、 プロセス仮想マシンと呼ばれるものである。 バイトコードを直接出力できる形式のプログラミング言語にJava、 Javaの仮想機械にJVMが存在する。 @@ -18,6 +28,13 @@ バイトコードを経由することで、 コンパイルを担当する実装と、 評価を担当する仮想機械の実装に分類する事が可能となり、 それぞれに適した最適化処理が実装可能となる。 また実行する際の速度もバイトコードを経由することで上昇する。 +\begin{figure}[ht] +\caption{バイトコードを使用するプログラミング言語の処理の流れ} + \begin{center} + \includegraphics[width=120mm]{./fig/bytecode_sample_generally_lang.pdf} + \end{center} + \label{fig:bytecode_Sample_generally_lang} +\end{figure} RakudoではPerl6、 NQPがそれぞれ対象のVMのバイトコードを生成し、 そのバイトコードをVMが実行する。 バイトコード生成までの処理をフロントエンドと呼び、 バイトコードから評価を行う処理をバックエンドと呼ぶ。