Mercurial > hg > Papers > 2021 > anatofuz-master
changeset 88:04a6b05666c1
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 05 Feb 2021 14:00:28 +0900 |
parents | 5051bfd6b35f |
children | f495a5af763c |
files | paper/chapter/04-interface.tex paper/chapter/thanks.tex paper/master_paper.pdf paper/src/callimpl2cbc.sh paper/src/gneratedPhils.cbc |
diffstat | 5 files changed, 80 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter/04-interface.tex Fri Feb 05 12:48:47 2021 +0900 +++ b/paper/chapter/04-interface.tex Fri Feb 05 14:00:28 2021 +0900 @@ -185,10 +185,13 @@ \subsection{Interfaceパーサーの呼び出し} 定義したパーサーは都度呼ぶこともできるが、ヘッダファイルのパスを入力で与える必要がある。 -generate\_stub.plは入力としてヘッダファイルは与えられないので、スクリプト中に探索する必要がある。 -毎回探索するのは呼び出しにくい。 -generate\_stub.plでは、Interfaceの名前とパースした結果を対応させる連想配列を最初に作製する。 -ソースコード\ref{src:createHeaderName2Info}のサブルーチンが連想配列の作製を行い、これは初回ロード時に実行される。 +generate\_stub.plは実行時のコマンドライン引数としてヘッダファイルは与えられないので、スクリプト中で探索する必要がある。 +毎回パースしたいInterface名の探索をするのは煩雑である。 + +基本的にgenerate\_stub.plではInterfaceの名前がすでに判明しており、そのInterfaceのパースした結果を取得したいのがほとんどである。 +ここからスクリプト内部で、 Interfaceの名前とパースした結果を対応させる連想配列を実装した。 +generate\_stub.plでは、スクリプト起動時に連想配列を変換処理を行う前に作製する。 +ソースコード\ref{src:createHeaderName2Info}のサブルーチンが連想配列を作り出す処理である。 このサブルーチンでは、ヘッダファイルを起動時に全探査し、 すべてパースを行う。 4行目でGears::UtilのAPI呼び出しをしているが、 このAPIはGearsOSで使うヘッダファイルを、指定されたパスから再帰的に探索するものである。 @@ -202,7 +205,6 @@ この2つは意味が異なっている為、 シンタックスを分離したい。 Implementの型定義ファイルを導入したので、Interfaceの実装をする場合に別のシンタックスを導入する。 - 導入された構文をソースコード\ref{src:implHeader}に示す。 この例ではStack Interfaceの実装としてSingleLinkedStackを定義する宣言である。 @@ -211,6 +213,9 @@ 宣言はgenerate\_stub.plが読み取り、 変換した後のCbCファイルからは該当する行が削除される。 \lstinputlisting[label=src:implHeader, caption=Intefaceの実装をする際の宣言]{src/implHeader.h} + +\section{Interface APIに対応したCodeGearの名前の自動変換} + \section{GearsCbCのInterfaceの実装時の問題} Interfaceとそれを実装するImplの型が決定すると、最低限満たすべきCodeGearのAPIは一意に決定する。 @@ -268,6 +273,12 @@ 先行事例を参考に、コマンドを実行して雛形ファイルを生成するコマンド\texttt{impl2cbc.pl}をGearsOSに導入した。 \texttt{impl2cbc.pl}の処理の概要を図\ref{fig:impl2cbc}に示す。 +impl2cbc.plでは、 実行時引数にImplementの型定義ファイルを与える。 +impl2cbc.plの内部でImplementのパース結果からInterfaceを特定し、 雛形を生成する。 +Interfaceの定義ファイルが複数見つかった場合、Implementの型定義ファイルがあるディレクトリと同じファイルが優先される。 +コマンドラインからの呼び出しと、生成した結果をソースコードに示す。 + + \begin{figure}[hp] \begin{center} @@ -277,9 +288,10 @@ \label{fig:impl2cbc} \end{figure} -\subsection{雛形生成の手法} +\lstinputlisting[label=src:callimpl2cbc, caption=impl2cbcの実行方法]{src/callimpl2cbc.sh} +\lstinputlisting[label=src:impl2cbcExecuted, caption=生成された雛形ファイル]{src/gneratedPhils.cbc} - +\subsection{雛形生成の手法} Interfaceでは入力の引数がImplと揃っている必要があるが、 第一引数は実装自身のインスタンスがくる制約となっている。 実装自身の型は、Interface定義時には不定である。 その為、 GearsOSではInterfaceのAPIの宣言時にデフォルト型変数\texttt{Impl}を実装の型として利用する。 @@ -379,4 +391,5 @@ 呼び出し元のInterfaceの情報パースした結果、ヘッダファイルにAPIの定義がなかった場合は11行目の\texttt{unless}に処理が落ち、 エラー終了する。 これによってInterface呼び出しの問題が、 Perlスクリプトによって変換する前に検知可能になった。 -\section{par goto のInterface経由の呼び出しの対応} \ No newline at end of file +\section{par goto のInterface経由の呼び出しの対応} +従来のpar gotoではInterface経由の呼び出しは想定しておらず、 \ No newline at end of file
--- a/paper/chapter/thanks.tex Fri Feb 05 12:48:47 2021 +0900 +++ b/paper/chapter/thanks.tex Fri Feb 05 14:00:28 2021 +0900 @@ -1,3 +1,3 @@ \chapter*{謝辞} \addcontentsline{toc}{chapter}{謝辞} -ホゲ様,フガ様ありがとうございます +いま すべての修論に Gratitude ≪感謝≫ ・・・
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/callimpl2cbc.sh Fri Feb 05 14:00:28 2021 +0900 @@ -0,0 +1,1 @@ +perl tools/impl2cbc.pl examples/DPP2/PhilsImpl.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/gneratedPhils.cbc Fri Feb 05 14:00:28 2021 +0900 @@ -0,0 +1,57 @@ +#include "../../../context.h" +#interface "Phils.h" + +// ---- +// typedef struct PhilsImpl <> impl Phils { +// int self; +// struct AtomicT_int* Leftfork; +// struct AtomicT_int* Rightfork; +// __code next(...); +// } PhilsImpl; +// ---- + +Phils* createPhilsImpl(struct Context* context) { + struct Phils* phils = new Phils(); + struct PhilsImpl* phils_impl = new PhilsImpl(); + phils->phils = (union Data*)phils_impl; + phils_impl->self = 0; + phils_impl->Leftfork = NULL; + phils_impl->Rightfork = NULL; + phils->putdown_lfork = C_putdown_lforkPhilsImpl; + phils->putdown_rfork = C_putdown_rforkPhilsImpl; + phils->thinking = C_thinkingPhilsImpl; + phils->pickup_rfork = C_pickup_rforkPhilsImpl; + phils->pickup_lfork = C_pickup_lforkPhilsImpl; + phils->eating = C_eatingPhilsImpl; + return phils; +} +__code putdown_lfork(struct PhilsImpl* phils, __code next(...)) { + + goto next(...); +} + +__code putdown_rfork(struct PhilsImpl* phils, __code next(...)) { + + goto next(...); +} + +__code thinking(struct PhilsImpl* phils, __code next(...)) { + + goto next(...); +} + +__code pickup_rfork(struct PhilsImpl* phils, __code next(...)) { + + goto next(...); +} + +__code pickup_lfork(struct PhilsImpl* phils, __code next(...)) { + + goto next(...); +} + +__code eating(struct PhilsImpl* phils, __code next(...)) { + + goto next(...); +} +