Mercurial > hg > Papers > 2021 > anatofuz-master
changeset 89:f495a5af763c
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 05 Feb 2021 15:21:31 +0900 |
parents | 04a6b05666c1 |
children | a93c2401753b |
files | paper/chapter/04-interface.tex paper/chapter/05-perl.tex paper/drawio/generate_context.drawio paper/drawio/generate_context.pdf paper/master_paper.pdf paper/src/replaceCodeGearName1.pl paper/src/replaceCodeGearName2.pl |
diffstat | 7 files changed, 78 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter/04-interface.tex Fri Feb 05 14:00:28 2021 +0900 +++ b/paper/chapter/04-interface.tex Fri Feb 05 15:21:31 2021 +0900 @@ -215,6 +215,29 @@ \section{Interface APIに対応したCodeGearの名前の自動変換} +InterfaceのAPIに対応したCodeGearを実装する際、今までは暗黙にInterface名とImplの型名をつなげた名前で定義していた。 +例えばStack InterfaceのAPIであるpopをSingleLinkedStackが実装した場合、CodeGearの名前はpopSingleLinkedStackにしていた。 + +CodeGearの名前につけられるImplの名前は、GearsOSのシステムがCodeGearの識別に使うメタな情報と言える。 +ユーザーレベルではInterfaceのAPIと同じ名前のCodeGearを実装できると、GearsOSのメタなCodeGearの処理と分離可能である。 +この為Perlスクリプトで、InterfaceのImplementの場合はCodeGearの名前を自動で変換する機能を実装した。 + +generate\_stub.plはソースコードの情報を読み取るフェーズと、変換した情報を書き込むフェーズに別けられる。 +まずは読み取りの際の処理をソースコード\ref{src:replaceCodeGearName1}に示す。 +generate\_stub.plは、CodeGearの宣言時に、自分が今変換しているInterfaceのImplのCbCファイルかどうかをまず確認する。(ソースコード6行目) +ImplのCbCファイルであった場合、変数\texttt{\$implInterfaceInfo}に具体的な値が入っているため、if文に進む。 +if文の中ではInterfaceのパースの結果と、今定義しているCodeGearの名前を比較する。 +ここでInterfaceのAPIであるCodeGearの名前と、今CbCファイルで定義しているCodeGearの名前が等しい場合、後ろに型名をつけたCodeGearの名前に変換し、スクリプト内で変換したことを記憶する。 +\lstinputlisting[label=src:replaceCodeGearName1, caption=CodeGearの名前が等しいかどうかの確認]{src/replaceCodeGearName1.pl} + +CodeGearの宣言は、 Contextを引数に含めるようにすでに書き換えるルーチンで処理されていた。 +この部分でCodeGearの名前を変更したい。 +実際に書き出している処理の部分をソースコード\ref{src:replaceCodeGearName2}に示す。 +この際に書き込むCodeGearの名前は、定義のCodeGear名を正規表現でキャプチャし、変数\texttt{\$currentCodeGearName}に代入している。(5行目) +読み込み時に作製した、名前の変更があることを保存する連想配列\texttt{\$replaceCodeGearNames}に、今書き込もうとしているCodeGearの名前を問い合わせる。 +連想配列側にCodeGearの名前に対応する値があった場合は書き換え対象なので、 \texttt{\$currentCodeGearName}を、ソースコード\ref{src:replaceCodeGearName1}で作製したCodeGearの名前に変換する。 + +\lstinputlisting[label=src:replaceCodeGearName2, caption=CodeGearの名前の変更]{src/replaceCodeGearName2.pl} \section{GearsCbCのInterfaceの実装時の問題}
--- a/paper/chapter/05-perl.tex Fri Feb 05 14:00:28 2021 +0900 +++ b/paper/chapter/05-perl.tex Fri Feb 05 15:21:31 2021 +0900 @@ -96,13 +96,39 @@ 使用している各Gearがコンパイル時に確定するならば、 コンパイルの直前に実行されるPerlトランスコンパイラでもGearの確定ができるはずである。 ここからcontext.hをコンパイルタイミングでPerlスクリプト経由で生成する手法を考案した。 -\subsection{context.hの作製フロー} +\subsection{ビルド時のcontext.hの生成タイミング} +context.hをビルドの途中で生成するには、CMakeがcontext.hを作製するようにプログラミングする必要がある。 +しかしCMakeの文法はきわめて複雑であるので、現状のGearsOSのCMakeLists.txtの定義を変更したくない。 +この為には現在ビルド時に動作するgenerate\_stub.plかgenerate\_context.plのいずれかで生成を行いたい。 + GearsCbCからメタ計算を含むCbCファイルに変換するgenerate\_stub.plは各CbCファイルを1つ1つ呼び出していた。 context.hを生成しようとする場合、 プロジェクトで利用する全CbCファイルを扱う必要がある。 +従ってgenerate\_stub.plではcontext.hの作製はできない。 Contextの初期化ルーチンを作製するgenerate\_context.plは、その特性上すべてのCbCファイルをロードしていた。 したがってcontext.hを作製する場合はこのスクリプトで行うと現状のCMakeに手をつけずに変更ができる。 +\subsection{context.hの生成処理} +generate\_context.plでcontext.hを作製したい。 +この為には、プロジェクトで使用しているDataGearを特定する必要がある。 +generate\_context.plの時点でCbCファイルはメタ情報を含む表現に変換されている。 +Interfaceの使用と、実装を示す\texttt{\#interface}や\texttt{\#impl}構文はこの時点では落とされている為、別の情報から使用しているDataGrarを取得する必要がある。 + +DataGearはGearsOSのメタレベルでは構造体で表現されていた。 +また、DataGearは各CodeGearの引数の形で受け渡されている。 +ここからDataGearを取得するには、すべてのCodeGearの引数をチェックし、構造体の名前を取得すればいい。 +すべてのCbCファイルを調査後、 取得した構造体の名前に対応するヘッダファイルがあるかどうかを調査する。 +ヘッダファイルがあった場合、 Gears::InterfaceのAPIを利用して、 InterfaceもしくはImplのファイルとして利用可能であるかを確認する。 +Interface、Implファイルでなかった場合は、ただの構造体であるのでcontext.hに含む情報からは除外する。 + +\begin{figure}[h] + \begin{center} + \includegraphics[width=100mm]{drawio/generate_context.pdf} + \end{center} + \caption{generate\_context.plを使ったcontext.hとファイル生成} + \label{fig:generate_context_2} + \end{figure} + \subsection{context.hのテンプレートファイル} Perlのモジュールとして\texttt{Gears::Template::Context}を作製した。 @@ -158,9 +184,6 @@ \section{コンパイルタイムでのコンストラクタの自動生成} -\section{InterfaceのAPIの自動保管} - - \section{別Interfaceからの書き出しを取得する必要があるCodeGear}
--- a/paper/drawio/generate_context.drawio Fri Feb 05 14:00:28 2021 +0900 +++ b/paper/drawio/generate_context.drawio Fri Feb 05 15:21:31 2021 +0900 @@ -1,1 +1,1 @@ -<mxfile host="Electron" modified="2021-01-31T08:53:02.673Z" 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="LESJmukIUig-juxDMBkA" version="14.1.8" type="device"><diagram id="R4LYdndaMt07X_-nVjS0" name="ページ1">5Vrfb5swEP5rIm2TGmEIhDx2afdLm1apD12fJhdc8GowM6Yh++tngx0wIR3d6Fi6p+C7M9jf3X13mMycdVK+ZTCLP9EQkZltheXMOZvZNlhYnviRkm0t8X2rFkQMh8qoEVziH0gJtVmBQ5QbhpxSwnFmCgOapijghgwyRjem2S0l5lMzGKE9wWUAyb70Coc8Vruwl438HcJRrJ8MvFWtSaA2VjvJYxjSTUvknM+cNaOU11dJuUZEgqdxqee9OaDdLYyhlA+ZcHXyZQvcK+dTci/8RG3r7OuHE6Dck/Ot3jEKBQBqSBmPaURTSM4b6WtGizRE8raWGDU2HynNhBAI4TfE+VZ5ExacClHME6K0qMT8i5w+d9XouqU5K9Wdq8G2NbhADCeII6Zkt5iQNSWUVSt3HMeywKmQ55zRu52/HCGpdym3dhA9JcppwQL0AGSOikLIIsQfgtbeOVlkB6Ji4WwrJjJEIMf35kKgCtNoZ6emnjIGty2DjOKU5607X0iBMFAZZ3sq3FS+Od2oeJy9uKhXoEetrTSiKtIeEXUKwntICgXDXhSKbMnkZUq5DLlNjDm6zGDlmY2gGjOgbmBwF1Vh+bngBKdIyUPI7j6LWZhXYTS33F0s3CPGUflwNOw7T0+wTdSARnHTcATQFBa3+UEb9jm8BfrjMbWPHdNVB9LV5JCCHkg9wiXx0CqHGmy97wXVipO84r1TYQD8rGyU4iqSvxcFQ0K5vlnLioTFLdRtb5g2efFqHmipWHv9vFr18sj8ujT9ajuT+3Vx7KniuB1MJ4fUPXpIO4zuTg4pWEzamrUas10vJrGSKLRas5Xu4Lq9mcCdbVtNnhxet3VNm1eNdJ83rKdbjNvTeX+rp/ujiPAO1qM8g+nv16P3qXDbrczEB8pR/HJf3KpQ9Qq0+LhS3zJTf/rGY3n8bOoakDrT06l/7Jjaqw6m/uSYAvdZligwSoka+dhhdRQlavVUJSrJyP9ZneylmfaL6Zt9/bTRvRwII1Tyefw8XOf/e6++YDklY+vr61n77PfAee+OnI23h7nrOb+g52rU5fp9bj7E4iHM42qzYFwCB/ZQBrf6o+rvMDhY/SsR8ovvATo+TkTCeotOkPxOiBiOHx4vk4SIP2mI9J01j3EwGqEUMcjRV10IZNHvPQTdj1FCcJYPKAIwz+rvhLe4lN4eg+jdxQCi9/uI3n8you973xmjRqO0SA53YlK7piFqSnijlLozyOEzbtb8zte0hTV5xbcPN2tDk1Ug0BMIOM0KPjQ9ZTabrqkJVhNqSqVvDI5VIkhwlIphgNKKql9LB+EAklOlSHAYkkOxYBamETzsdFO97y3c6/Gw/WQO/nM27ncwLfj/6OElGEDmI3lYDJs/gNRf15u/0TjnPwE=</diagram></mxfile> \ No newline at end of file +<mxfile host="Electron" modified="2021-02-05T06:20:51.588Z" 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="suKyKcJNTSj_TkXIsu-G" version="14.1.8" type="device"><diagram id="R4LYdndaMt07X_-nVjS0" name="ページ1">7Vttj9o4EP41SHcn7Yok5IWPC+y1J13V1a16d/1UmcQEd02cOs4C/fW1Y5uQF1hYGkKWfiIe2xNnHj/jmUnoWePF6h0F8fwDCSDumf1g1bMmPdM0+uaA/wjJWkqcoSMFIUWBGpQLHtF3qGcqaYoCmBQGMkIwQ3FR6JMogj4ryAClZFkcNiO4eNcYhLAiePQBrkr/QwGbS6lnurn8PUThXN/ZcIayZwH0YPUkyRwEZLklsu571pgSwuTVYjWGWBhP20XO+3NH72ZhFEbskAnfvwWDmJCvHx7/+fL06d9JPww+3Wg1CVvrJ4YBN4BqEsrmJCQRwPe5dERJGgVQqO3zVj7mb0JiLjS48CtkbK3QBCkjXDRnC6x64Qqx/8X0W1u1Pm/1TFZKc9ZYbzUeIEULyCDVsojR9ZYi0fy83ZerylpaV8IoedrgaXGJtIJ49J3W1ZYiKfXhHpOq/c0ADSHbM84wN5uAswcS/mB0zSdSiAFDz8WFALWNw824HGl+ocA+Ani1ymeAU3WnnulgJowTg6iwI5xvqdijoxmJ2E2SYXrHBxhevMo7+VUofjkPGVyx27lWx1cnNcr+ynbjtIjFZUSY2FvLOWLwMQaZiZfcpxR3zhT4T2G2/z6mDKMIKnkA6NNHPguxDOPbvr0H5mdI+Rr3A13FRU2wPVtOUQ7NshW/l7l7MLT3mm+7BqffEJZuZzi84etutg6qdM1aZe43ymHJzUNI7LRJYq97wN8O+NF5hKu+ZOytNrEfdhD7ow7pS0bebRN5fbhcPvQXgpbXKlrdibDfIFGHrUJv7gyyRSz9+iA7hBGkgMEvOtqO8Va4LXXvCLf5snnqfECkDZJY5tMztBI7saFoWkfPKpq23Zpo2quLpr2moml5rDeQGsEoXYxJAPPcaEpznN5mtjQwitmS1362pFd0Aiu5BWrwJSmLU3YoEQVvi2hJAMYEE5ohLOAazRDGJRHAKIx40+cYCH87EgghH+A71bFAQYB3bY/i0dII6E6J1K5TA7pTA7rZGOZNlTvgCixiDG+0I/avh9qmdXnUdht03RPAwDW57nKh6xLw9RqjMfek0TWh67qXh+6wIXQDztwqsu8goH9F6Kp89tC+ONRNq2LVC82PG01pdejzYkrbasFZr/JXRntwRjtsPaHVr+ALoHXckW3MqqxsmO07srq8sutmdktmHtSYuX9WM1udOS/2f7HQ266w5gXXNr5YMLvxyYK5O4k/7fB5SCnkneMpX1d/hriKSkD42x95mFg6kH7vPssHJZbX1WvO60ytukCjTPsouBNfePGWj0GSIL9XU097DWeqltqyhF1jCC07mAjqDg8EZRt3Uy0tAmH2S/aVVFazchNXFNnWC4ok1SuKMqw2j30CfEZDVEWRLLGChWBRNE3iYrZ2ZMn18FIqhXxpYJqpEg45FqbLjGmPevZE6OKHhlz+3t13Wjm9hKtRk7+dtbBqmQ0BfWoxvWvI2k6JsTV5g3tWZOuyhl8UPp3CZhFox2ibwkfkLX5K8XpEecQi4sSXIps86hatGU/T3zdpWa/kHO2aZMWss6zRmGmbilgTBkJoXA9pvJJ3NIZ2y96x7k3TWyCNUeOOzkya3S95fgJpzOsljWO1TZrdL3h+TkhxJcDaparcJtt7IUt9BbC8mf9DSWaH+f+8rPsf</diagram></mxfile> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/replaceCodeGearName1.pl Fri Feb 05 15:21:31 2021 +0900 @@ -0,0 +1,14 @@ +} elsif (/^\_\_code (\w+)\((.*)\)(.*)/) { + debug_print("getDataGear",__LINE__, $_) if $opt_debug; + my $codeGearName = $1; + my $args = $2; + + if ($implInterfaceInfo->{parsedInterfaceInfo}) { + if (exists_codegear_in_interface({codeGearName => $codeGearName, parsedInfo => $implInterfaceInfo->{parsedInterfaceInfo}})) { + my $replaceCodeGear = "${codeGearName}$implInterfaceInfo->{implementation}"; #${pop}SingleLinkedStack + $replaceCodeGearNames->{$codeGearName} = $replaceCodeGear; + $codeGearName = $replaceCodeGear; + } + } + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/replaceCodeGearName2.pl Fri Feb 05 15:21:31 2021 +0900 @@ -0,0 +1,13 @@ +} elsif (/^\_\_code (\w+)\((.*)\)(.*)/) { + debug_print("generateDataGear",__LINE__, $_) if $opt_debug; + $inCode = 1; + %localVarType = (); + $currentCodeGearName = $1; + my $args = $2; + my $tail = $3; + + #replace Code Gear Name to Implemenatation + if (exists $replaceCodeGearNames->{$currentCodeGearName}) { + $currentCodeGearName = $replaceCodeGearNames->{$currentCodeGearName}; + } +