changeset 69:9950430ccc47

...
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Wed, 03 Feb 2021 21:29:14 +0900 (2021-02-03)
parents bb057c720016
children 26c9cd7b9b21
files paper/chapter/03-gears.tex paper/chapter/05-perl.tex paper/drawio/stubCodeGear.drawio paper/drawio/stubCodeGear.pdf paper/master_paper.pdf paper/src/meta.cbc
diffstat 6 files changed, 36 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/paper/chapter/03-gears.tex	Wed Feb 03 18:50:12 2021 +0900
+++ b/paper/chapter/03-gears.tex	Wed Feb 03 21:29:14 2021 +0900
@@ -35,7 +35,36 @@
 contextの操作をしてしまうと、メタレベルとノーマルレベルの分離をした意味がなくなってしまう為である。
 
 ContextはGearsOSの計算で使用されるすべてのDataGearとCodeGearを持つ。
+GearsOSではCodeGearの入力は、 メタレベルから見るとContextのみである。
+実際にCodeGearを実行する際は、Contextから計算に必要なDataGearを取得する必要がある。
+これはStubCodeGearと呼ばれるMetaCodeGearが実行する。
+
+
+\begin{figure}[h]
+  \begin{center}
+   \includegraphics[width=160mm]{drawio/stubCodeGear.pdf}
+  \end{center}
+  \caption{Contextを参照したCodeGearのデータアクセス}
+  \label{fig:stubCodeGear}
+ \end{figure}
+
+次のCodeGearに継続する際、ノーマルレベルから見ると次のCodeGearを直接指定しているように見える。
+実はCodeGearは直接次のCodeGearのアドレスを参照するのではなく、 特定のMetaCodeGearに一度継続する。
+CodeGearの処理が実行した後に継続されるCodeGearは\texttt{\_\_code meta}と定義されているMetaCodeGearである。
+\texttt{\_\_code meta}の定義をソースコード\ref{src:meta}に示す。
+\texttt{\_\_code meta}はContextに格納されているCodeGearのリストから番号でCodeGearのアドレスを取得し継続する。
+継続する先のCodeGearは、呼び出し先のCodeGearの直前に実行されるStubCodeGearである。
+\lstinputlisting[label=src:meta, caption=\_\_code meta]{src/meta.cbc}
+
+
+
+CodeGearからCodeGearへの継続は、関数型プログラミングの継続先に渡すDataとCodeの組のClosureとなっている。
+シンタックスでは継続の際に引数\texttt{(...)}を渡す。
+これは処理系では特に使用していないキーワードであるが、 このClosureを持ち歩いていることを意識するために導入されている。
+
+
 各CodeGear、DataGearはContextはそれぞれ配列形式でContextにデータを格納する場所が用意されている。
+CodeGearが保存されている配列は\texttt{context->code}であり、 DataGearが保存されている配列は\texttt{context->data}である。
 CodeGearは配列の中にStubCodeGearへの関数ポインタが格納されている。
 DataGearはInterfaceを利用したgoto時の値の保存場所として配列を利用している。
 これらの配列の添え字はenumの番号である。
@@ -58,9 +87,6 @@
 OSが持たなければならない割り込みのフラグなどはKContextに置かれている。
 GearsOSのメタレベルのプログラミングでは、 今処理をしているContextが誰のContextであるかを強く意識する必要がある。
 
-GearsOSではCodeGearの入力は、 メタレベルから見るとContextのみである。
-実際にCodeGearを実行する際は、Contextから計算に必要なDataGearを取得する必要がある。
-これはStubCodeGearと呼ばれるMetaCodeGearが実行する。
 
 \section{TaskManager}
 TaskManagerは性質上シングルトンである。
--- a/paper/chapter/05-perl.tex	Wed Feb 03 18:50:12 2021 +0900
+++ b/paper/chapter/05-perl.tex	Wed Feb 03 21:29:14 2021 +0900
@@ -35,7 +35,7 @@
 本研究では様々なメタレベルのコードを、トランスコンパイラで生成することを検討した。
 
 
-\section{Perlによるトランスコンパイラ用のライブラリ作製}
+\section{トランスコンパイラ用のPerlライブラリ作製}
 従来のPerlトランスコンパイラはgenerate\_stub.plとgenerate\_context.plの2種類のスクリプトで構築されていた。
 これらのスクリプトはそれぞれ独立した処理を行っていた。
 
@@ -76,6 +76,8 @@
   \end{itemize}
 \end{itemize}
 
+これらはgenerate\_stub.plおよびgenerate\_context.plおよび、本研究で作製したPerlのツールセットからも呼び出される。
+
 \section{context.hの自動生成}
 GearsOSのContextの定義はcontext.hにある。
 ContextはGearsOSの計算で使用されるすべてのCodeGear、 DataGearの情報を持っている。
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/drawio/stubCodeGear.drawio	Wed Feb 03 21:29:14 2021 +0900
@@ -0,0 +1,1 @@
+<mxfile host="Electron" modified="2021-02-03T12:23:23.286Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.1.8 Chrome/87.0.4280.88 Electron/11.1.1 Safari/537.36" etag="Fi7O-gwPVag0ZrmkZ6FI" version="14.1.8" type="device"><diagram id="sop9PUUD2st_0YMJAb5H" name="ページ1">5VrbcqM4EP0aVc08OIW482hiJ/Mwu5uqbNXO7MuWYjSYGYxYLMb2fv22QFxksEPiS+JxXoIaJEun+xx1C5Bxu1jfZySd/8YCGiNdC9bImCAd/kwP/gnLprS4nl0awiwKShNuDI/Rf1QaNWnNo4AulQc5YzGPUtU4Y0lCZ1yxkSxjK/WxbyxWfzUlIe0YHmck7lr/igI+l6vQncb+iUbhvPplbMsFL0j1sFzJck4CtmqZjCkybjPGeHm1WN/SWIBX4VL2u9txt55YRhM+pMP39MuIetEfD/h3Mv77zximQ0dYL4f5SeJcrljOlm8qCDKWJwEVo2jI8FfziNPHlMzE3RU4HWxzvoihheFyyTP2o4YKFul/Ywm/I4soFhHwicx+3NNEmqW7sQttOQ+acbreuUJc4wYBR9mC8mwDj1QdHAm1jDVPNleN42pvzFtOMzVpJDJYwnroBk+4kJC+AF67AyYNILxkk2V8zkKWkHjaWH0V7uaZz4ylEuTvlPONBI/knKkuoOuIfxHdbyzZ+tq6M1nLkYvGpmoksNxWJ9H82r7XdCtaVb+BzlWjwqzdLdDY72wAj+XZjO4BWUYsJ1lI+Z7nzP7gyWhMePRTnUdfJMiuDyyCGdZBZ9tq0FmupQ5Rzkv22oqnehqvD7E+Atsxl05Qgs/+N2fVjdGycM8YHsBuui48Ut2Hq1D8T+ia34Ki31OS/bPk+VM18lN20LgfHouxtGrsj0catxoGcCzXXpm3ORjHsH3Q58VsO4x3RHtX844gZpZjKXGl2101qwWvrWZYs3bH8EFqpu+Xs4Qlx9Wvlno1WvasfnmuqyjYjafVhh0qVrQeaBYBTjSTxq5mvWgnO4q0mQOlDXsHattBcWGeR4J+LXq7W9sG7qG33UvvUyUr+Lz0xq+jt6YbKr2xfbH0tobSW39LelsdejeMvETqjbCpcg9rzo3VZZ9xVvY5HZRDBtTRbbIQ2CVPy7RP7AAGrkJL4igE7CYzgENEuy/AiqCiHcsbiygIykqDggKTp2IoQYlU5KjFuiwfWRMxFrB3Kd003GtH8JHtqS4y9a489qmjcSr39NTF71AcX1S7vQcFxMZACXxTBaxm2SKnUhuV9czFHpt4g+TQ7aGbfapSA3dzSsbnNNsqR38ZyB397SHv7kD4BtrlNqTBj5Bj1f80yRdoaiAXI9cvLnTkegWLyoano6kDJuR7aGqh8RR544/XsveNDDU4nJ5jTNwTGdbJ9j6tA/359j596OanVgX1TvieNz/3IjY/t6MLE8JJb/5/QQKsnq4Z2sDTtZPJr25eQIKpcsx5jmTvtvDG3kUwz7sG5tk9ic95mYc7MOutxGcGGECiMapL8SKHmUEiCqlCkclYk2tJTUxddR42+/JWvc99p6vMu8WZIdwXJWkuDp8DIhJXLWydIB/6nqlMXSErhdzUvUOeLS58SFKdawkEwxvwdso7a5LaPaY0RRiwnJ86Dlx5Ae6XFltGhlvWMVDBOK3Kxka+i8a46uVda9AYfR9oaGcNmm7Na4mgKdynobHZorqNPF84TtatE2FxXeT7jfevxY+u6kfLGvju6nR7QLdGkdv2tfik/rBpz/vEvuOkV7gEms1Xa+VnLM23f8b0fw==</diagram></mxfile>
\ No newline at end of file
Binary file paper/drawio/stubCodeGear.pdf has changed
Binary file paper/master_paper.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/meta.cbc	Wed Feb 03 21:29:14 2021 +0900
@@ -0,0 +1,3 @@
+__code meta(struct Context* context, enum Code next) {
+    goto (context->code[next])(context);
+}
\ No newline at end of file