Mercurial > hg > Papers > 2019 > anatofuz-thesis
changeset 41:5169e3bc40f9
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 14 Feb 2019 17:49:14 +0900 |
parents | 1a2ad6e083bb |
children | fc3f4de57bb1 |
files | paper/chapter2.tex paper/chapter3.tex paper/main.pdf |
diffstat | 3 files changed, 31 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter2.tex Thu Feb 14 17:28:50 2019 +0900 +++ b/paper/chapter2.tex Thu Feb 14 17:49:14 2019 +0900 @@ -39,16 +39,9 @@ これは軽量継続時に、 CodeGearの入出力のインターフェイスを揃えることで、 引数で与えられたレジスタを変更せずに繊維する事が可能であるためである。 -実際にCbCで書いたコード例をソースコード\ref{cbc_example_test}に示す。 +実際にCbCで書いたコード例をソースコード\ref{cbc_example_test}に示し、 コード中での状態遷移を図\ref{fig:cbc_example_test}に示す。 \lstinputlisting[frame=lrbt, label=cbc_example_test, caption=加算と文字列を設定するCbCコードの例]{./codes/cbc_example_test.cbc} - -この例では、 cg1, cg2, cg3という CodeGear を用意し、これらをcg1,cg2,cg3の順で軽量継続していく。 -入出力としてmain関数で生成したTEST構造体を受け渡し、 cg1で数値の加算を、 cg2で文字列の設定を行う。 -main関数からcg1へのgoto文では、 Cの関数からCodeGearへの移動となる為、 call命令ではなくjmp命令で行われる。 -cg1からcg2、 またcg2からcg3へは、 CodeGear間での移動となるためjmp命令での軽量継続で処理される。 -この例では最終的に test.number には1が、 test.stringにはHelloが設定される。 - \begin{figure}[ht] \caption{ソースコード\ref{cbc_example_test}におけるCodeGearの状態遷移} \begin{center} @@ -57,6 +50,14 @@ \label{fig:cbc_example_test} \end{figure} +この例では、 cg1, cg2, cg3という CodeGear を用意し、これらを図\ref{fig:cbc_example_test}の通り、 cg1,cg2,cg3の順で軽量継続していく。 +それぞれのCodeGearへは、 goto文を利用する。 +入出力としてmain関数で生成したTEST構造体を受け渡し、 cg1で数値の加算を、 cg2で文字列の設定を行う。 +main関数からcg1へのgoto文では、 Cの関数からCodeGearへの移動となる為、 call命令ではなくjmp命令で行われる。 +cg1からcg2、 またcg2からcg3へは、 CodeGear間での移動となるためjmp命令での軽量継続で処理される。 +この例では最終的に test.number には1が、 test.stringにはHelloが設定される。 + + CbCでは関数呼び出しの他に、 for文やwhile文などのループ制御を廃している。 CbCでループ相当の物を記述する際は、 再帰呼び出しを利用する。 実際にある数の階乗を計算するCプログラムと、 このプログラムをCbCで書き直した場合のソースコードを示す。
--- a/paper/chapter3.tex Thu Feb 14 17:28:50 2019 +0900 +++ b/paper/chapter3.tex Thu Feb 14 17:49:14 2019 +0900 @@ -16,15 +16,31 @@ \section{Rakudo} -RakudoとはNQPによって記述され、 MoarVM、 JVM、 Javascript上で動作するPerl6の実装である。 -Rakudo自体はNQPで実装されている箇所と、 Perl6で実装されている箇所が混在する。 -これらは拡張子によって区別され、 NQPは.nqp、 Perl6は .pm6が拡張として設定されている。 -実際にNQPで実装されている箇所の一部をソースコード\ref{nqp_on_rakud}に示す。 -\lstinputlisting[frame=lrbt, label=nqp_on_rakud, caption=Rakudoの実装の一部]{./codes/src_main.nqp} +RakudoとはNQPによって記述され、 MoarVM、 JVM上で動作するPerl6の実装である。 +NQPとはNotQuitPerlの略であり、 Perl6のサブセットである。 + +RakudoがPerl6のコンパイラかつインタプリタとして機能する。 +Rakudoの構成を図\ref{fig:perl6nqp}に示す。 -Rakudoをソースコードからビルドする際は予めNQPインタプリタであるnqpをビルドする必要が存在する。 +\begin{figure}[ht] +\caption{Rakudoの構成図} + \begin{center} + \includegraphics[width=50mm]{./fig/prosym/perl6nqp.pdf} + \end{center} + \label{fig:perl6nqp} +\end{figure} + +Perl6そのものはNQPで大本が記述されており、 その上にPerl6自身で記述された箇所が存在する。 +図\ref{fig:perl6nqp}に示すとおり、 MoarVMが解釈するのはNQPが発行したMoarVMバイトコードである。 +Perl6のプログラムはPerl6及びNQPコンパイラによってMoarVMバイトコードに変換され、 MoarVMが評価する。 +現在はMoarVMの他にJVMも動作環境として選択可能であるが、 JVM側にはMoarVMと比較して実装された機能が少ないなどの特徴がある。 + +MoarMVそのものはPerl6やNQPプログラムを直接は評価する事が出来ない。 +従って、 NQP及びPerl6で書かれているRakudoをソースコードからビルドする際は、 予めNQPインタプリタであるnqpをビルドする必要が存在する。 Rakudoのビルド時にはこのnqpと、 nqpが動作するVMを設定として与える必要がある。 この両者を指定しない場合、 ビルド時に動的にNQP、 MoarVMをソースコードをダウンロードし、 ビルドを行う。 +実際にNQPで記述されたRakudoの実装の一部をソースコード\ref{nqp_on_rakud}に示す。 +\lstinputlisting[frame=lrbt, label=nqp_on_rakud, caption=Rakudoの実装の一部]{./codes/src_main.nqp} \section{MoarVM} MoarVMとはRakudo実装で主に使われる仮想機械である。