Mercurial > hg > Papers > 2021 > anatofuz-master
changeset 112:8f0ff6d552ed
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 06 Feb 2021 16:43:12 +0900 |
parents | 4642d2f215d2 |
children | b804a51037c7 |
files | paper/chapter/05-perl.tex paper/chapter/06-evaluation.tex paper/chapter/conclusion.tex paper/chapter/news-items.tex paper/chapter/thanks.tex paper/master_paper.pdf paper/src/AtomicTImpl.cbc paper/src/PhilsImpl.h |
diffstat | 8 files changed, 97 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter/05-perl.tex Sat Feb 06 15:42:26 2021 +0900 +++ b/paper/chapter/05-perl.tex Sat Feb 06 16:43:12 2021 +0900 @@ -436,6 +436,20 @@ この場合は型変数が、Interfaceと同様のTであるので、Interfaceで決定されたTの型と同様の型に決まる。 \lstinputlisting[label=src:AtomicTImpl, caption=ジェネリクスを使ったAtomicTの実装の定義]{src/AtomicTImpl.h} +\subsection{ジェネリクスを使ったCodeGearの記述} +Implを定義したので対応するCbCファイルを確認する。 +ソースコード\ref{src:AtomicTImplCbC}は、ジェネリクスを使ったCodeGearの実装の一部である。 +型変数を使ったCodeGearの記述では、型変数は通常の型のように記述できる。 +今回はTが型変数であるため、型Tを通常の構造体の型のように見て実装することが可能である。 +ただし、 型変数を含むInterfaceおよびImplは、名前の後ろに\texttt{<T>}のように型変数を付け加える必要がある。 +\lstinputlisting[label=src:AtomicTImplCbC, caption=ジェネリクスを使ったAtomicTの実装]{src/AtomicTImpl.cbc} + +\subsection{DataGear定義内でのジェネリクスの型決定} +ジェネリクスに実際の型を入れる際に、DataGearの定義時に決定するケースがある。 +ソースコード\ref{src:PhilsImplG}は、Phils InterfaceのImplであるPhilsImplの型定義ファイルである。 +Implが持つ変数として、AtomicTにintを具体的な型として与えた型を定義している。 +\lstinputlisting[label=src:PhilsImplG, caption=Implファイル内でのジェネリクスの型の決定]{src/PhilsImpl.h} + \section{generate\_stub.plのデバッグ機能の追加}\label{sec:generateStubDebug} 変換されたGearsOSのコードが意図しない結果になっていた場合、 generate\_stub.plのデバッグをする必要がある。 @@ -472,7 +486,7 @@ 通常と異なるのは、 GearsOSを停止させるCodeGearとしてshutdownがAPIとして定義されている。 gotoで継続するCodeGearの引数として、このshutdownを渡すと、最後にGearsOSの終了ルーチンに継続するようになる。 これをmain.cbcとして定義する。 -\lstinputlisting[label=src:gmainExapmle, caption=gmainを使ったMainCodeGear定義]{src/ppGmain.cbc} +\lstinputlisting[label=src:gmainExample, caption=gmainを使ったMainCodeGear定義]{src/ppGmain.cbc} generate\_stub.plで、main.cbcを変換した後をソースコード\ref{src:afterGmain}に示す。 \lstinputlisting[label=src:afterGmain, caption=gmain定義の変換後のCbC Code]{src/afterGmain.cbc}
--- a/paper/chapter/06-evaluation.tex Sat Feb 06 15:42:26 2021 +0900 +++ b/paper/chapter/06-evaluation.tex Sat Feb 06 16:43:12 2021 +0900 @@ -10,5 +10,12 @@ 1ファイル内で様々な型が定義可能になれば、 より見通しの良いプログラミングが可能であると考えられる。 \section{GearsOSのトランスパイラ} +GearsOSのトランスパイラは、従来はエラーを出さずCbCファイルを変換するだけであった。 +本研究によってPerlトランスパイラレベルでのエラーの生成を可能にし、 GearsOSのメタレベルのコードを読まずともバグ検知が可能となった。 +またInterfaceのパーサーなどのAPIを定義したことによって、 トランスパイラ側での様々な処理の拡張性を高めることが可能となった。 \section{GearsOSのメタ計算} +従来のGearsOSではcontext.hやStubCodeGearなどのメタレベルのコードは、比較的手動で実装する必要があった。 +自由度は高いものの、様々な場面で登場するメタレベルのコードをすべて書くのは煩雑である。 +本研究によってメタ計算の自動生成機能がより強化され、さらにメタレベルの計算を活用することが可能となった。 +特にmeta.pmによるMetaCodeGearの切り替えは強力であり、任意のMetaCodeGearに継続することで、モデル検査やGearsOSのデバッグ機能などを組み込むことが可能となった。 \ No newline at end of file
--- a/paper/chapter/conclusion.tex Sat Feb 06 15:42:26 2021 +0900 +++ b/paper/chapter/conclusion.tex Sat Feb 06 16:43:12 2021 +0900 @@ -1,5 +1,16 @@ \chapter{結論} +本研究ではGearsOSの構文の拡張、およびトランスパイラの機能の強化を行った。 +Interfceの定義ファイルの簡潔化や、 Implementの型定義ファイルの導入などでより形式的にプログラミングすることが可能となった。 +また、型定義ファイルを入れたことにより、Interfaceなどを扱う様々な機能の自動化が可能となった。 +特に今までは手動で実装していたcontext.hの型定義部分を、ビルド時に自動生成することが可能となった。 +メタレベルの計算を柔軟に扱いつつ、従来手作業で実装していた様々なメタ計算を自動生成できた。 + +Interfaceの型定義ファイルを取り扱う様々なAPIを用意した。 +従来はgenerate\_stub.plで呼び出されていた簡易的なパーサーを、Interface用に再実装し、様々な情報を定義ファイルから取得できるようになった。 +これによりImplementのCbCのファイルの雛形生成や、 Perlインタプリタレベルでの警告の生成などが可能となった。 + + \section{今後の課題} \subsection{context.h定義時の依存関係の解決} @@ -18,6 +29,12 @@ しかし結局手動で行ってしまっているために、 generate\_context.plで依存関係の解決を自動的に行う必要がある。 \subsection{xv6上での完全な動作} +GearsOSの機能拡張の初期は、実装したPerlツール群をxv6にも移植、検証を行っていた。 +しかしxv6上の開発を近頃は止めてしまっており、本研究で作ったツールがxv6で動作するかは不明である。 +また、xv6上に移植するGearsOSプロジェクトは、ファイルシステムやプロセス管理などのOSの根幹部分がまだ移植出来ていない。 +この為にはGearsOSと同じデータ単位を使うChristieフレームワークの知見などをもとに、ファイルシステムなどを実装する必要がある。 +これには既存のxv6のもつAPIとGearsOSのInterfaceや継続を中心とするAPIの齟齬が問題となる。 +GearsOSでUNIXを表現する際に必要なAPIについては、今後考察しなければならない。 \subsection{Perlトランスパイラが提供する機能のGearsOS組み込み} 今のGearsOSはコンパイル時にPerlスクリプトによってメタ計算が変換されている。 @@ -32,4 +49,17 @@ GearsOSにPerlスクリプトの機能を組み込む場合は、CodeGear、DataGearをさらにGearsOSの中から扱うAPIが必要である。 Perlスクリプトが提供している機能は、それ自身が巨大なメタ計算であるので、 MetaCodeGearのさらなる充実が必要となる。 -例えばダイナミックにMetaCodeGearを生成するAPIなどがあれば、PerlインタプリタをGearsOSのビルドシステムから落とすことが可能ではないかと考える。 \ No newline at end of file +例えばダイナミックにMetaCodeGearを生成するAPIなどがあれば、PerlインタプリタをGearsOSのビルドシステムから落とすことが可能ではないかと考える。 + +\subsection{Perlトランスパイラの処理の複雑さ} +本研究で様々な機能をPerlトランスパイラに実装したが、これによりPerlトランスパイラの複雑度が増してしまった。 +特にgenerate\_stub.plは性質上グローバル変数を多用するので、 処理の全貌をつかむまでが非常に困難である。 +現在はPerl標準の警告プラグマをつけており、未定義値を使ってしまった場合に警告を出すようにしているが、 これも不十分である。 + +モジュール化をはじめとするPerlトランスパイラの全体的なリファクタリング、もしくは再実装などをするべき段階に来ていると考える。 +また、Perlではなくトランスパイラ自体もCbCで記述し、モデル検査などにつなげることも可能と言える。 + +\subsection{CbCの構文上に構築していることの問題} +現在のGearsOSはCbCの構文上に構築しているため、Perlトランスパイラ側で複雑な処理をしようとすると、CbCコンパイラをPerlで実装することに近い状態が発生する。 +CbCはアセンブラ的に使うことが可能であるので、 GearsOSをCのシンタックスとは別のシンタックスを与えた言語として制定し、 CbCを出力するように実装をし直したい。 +こうすることでCの構造上の問題を回避できると考える。 \ No newline at end of file
--- a/paper/chapter/news-items.tex Sat Feb 06 15:42:26 2021 +0900 +++ b/paper/chapter/news-items.tex Sat Feb 06 16:43:12 2021 +0900 @@ -20,47 +20,47 @@ \section{Interfaceで未定義のAPIの検知} 従来のInterfaceは、実装していないAPI(CodeGear)があってもPerlスクリプトはCbCコードの変換をしてしまった。 CbCコードの変換をする前に、 Perlスクリプトレベルで未定義のAPIを検知するようになった。 -詳細は\ref{sec:interfaceNotImpl}で述べる。 +詳細は\ref{sec:interfaceNotImpl}章で述べる。 \section{Interfaceの引数の確認} InterfaceのAPI呼び出しは、\texttt{goto meta}に変換されてしまうので、引数の数が揃っていない場合の確認がCbCレベルでは出来なかった。 Perlスクリプトレベルで引数の数を確認するように実装し、GearsOSのプログラミングの安全性が向上した。 -詳細は\ref{sec:argNumber}で述べる。 +詳細は\ref{sec:argNumber}章で述べる。 \section{InterfaceにないAPIの呼び出しの検知} InterfaceにないAPIの呼び出しも、従来はCbCに変換されコンパイルが走らないと解らなかった。 PerlスクリプトレベルでAPI呼び出しの度にInterfaceに定義があるかの確認を行うように改善した。 -詳細は\ref{sec:apinot}で述べる。 +詳細は\ref{sec:apinot}章で述べる。 \section{別のInterfaceからの出力の取得} 従来のGearsOSのInterfaceでは、入出力は自分のInterface内で完結している必要があった。 このため、Stack Interfaceの出力をOther Interfaceで受け取る際に、自分でStubを実装する必要があった。 この別のInterfaceの入力を受け取るStubの作製を自動化した。 -詳細は\ref{sec:interfaceInput}で述べる。 +詳細は\ref{sec:interfaceInput}章で述べる。 \section{Interfaceの雛形ファイルの作製スクリプトの導入} 満たすべきInterfaceと、満たしたい型が決定しても、従来はCodeGearの定義やコンストラクタをすべて手書きする必要があった。 これらはバグの元であった為に、自動的に雛形ファイルを作製するスクリプトを導入した。 -詳細は\ref{sec:impl2cbc}で述べる。 +詳細は\ref{sec:impl2cbc}章で述べる。 \section{実装のCodeGear名からメタ情報の切り離し} Interfaceの各APIであるCodeGearは、従来は実装する際にプログラマが実装の型の名前をCodeGearの名前の末尾につける必要があった。 この型名の情報はメタ情報であるため、 本研究ではCodeGearの宣言時に型名を末尾につけず、コンパイル時にトランスパイラ側で変換するように実装した。 -詳細は\ref{sec:autoCodeGearName}で述べる。 +詳細は\ref{sec:autoCodeGearName}章で述べる。 \section{自由なMetaCodeGearの作製、継続の入れ替え機能} 従来はCodeGearの実行の後に継続するMetaCodeGearは\_\_code metaで決め打ちだった。 ユーザーが定義したMetaCodeGearに継続できる機能を追加した。 -詳細は\ref{sec:metapm}で述べる。 +詳細は\ref{sec:metapm}章で述べる。 \section{Perlトランスパイラの変換ルーチンのデバッグ機能の追加} Perlトランスパイラでメタ計算を作製しているが、このPerlスクリプトは巨大な正規表現マッチのループで構成されている。 変換したいCbCファイルがどの行の正規表現パターンにマッチしたかを可視化できる機能を追加した。 -詳細は\ref{sec:generateStubDebug}で述べる。 +詳細は\ref{sec:generateStubDebug}章で述べる。 -\section{DataGearの型集合ファイル、context.hの自動生成} +\section{DataGearの型集合ファイルであるcontext.hの自動生成} 従来はInterface、Implの型を定義し、使いたいDataGearを決めると、手動でcontext.hにDataGearの型を記述する必要があった。 この型情報はコンパイル時に決定するので、自動化が可能である。 その為Perlトランスパイラを使い、自動的に生成する機能を実装した。 -詳細は\ref{sec:context.hGen}で述べる。 \ No newline at end of file +詳細は\ref{sec:context.hGen}章で述べる。 \ No newline at end of file
--- a/paper/chapter/thanks.tex Sat Feb 06 15:42:26 2021 +0900 +++ b/paper/chapter/thanks.tex Sat Feb 06 16:43:12 2021 +0900 @@ -1,3 +1,11 @@ \chapter*{謝辞} \addcontentsline{toc}{chapter}{謝辞} -いま すべての修論に Gratitude ≪感謝≫ ・・・ + +本研究の遂行、本論文の作成にあたり、御多忙にも関わらず終始懇切なる御指導と御教授を賜わりました河野真治准教授に心より感謝致します。 +共に研究を行い暖かな気遣いと励ましをもって支えてくれた並列信頼研究室の全てのメンバーに感謝致します。 +また、山場となったシステム更新を共に乗り越えた城後明慈さん、宮平賢さんをはじめとするシステム管理チームの皆様に感謝します。 +最後に、 有意義な時間を共に過ごした理工学研究科情報工学専攻の学友、並びに物心両面で支えてくれた家族に深く感謝致します。 + +\begin{flushright} + 2021年 3月 \\ 清水隆博 +\end{flushright} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/AtomicTImpl.cbc Sat Feb 06 16:43:12 2021 +0900 @@ -0,0 +1,19 @@ +#include "../context.h" +#impl "AtomicT.h" as "AtomicTImpl.h" +#include <stdio.h> + +AtomicT<T> *createAtomicTImpl(struct Context* context, T init){ + struct AtomicT<T>* atomicT = new AtomicT(); + struct AtomicTImpl<T>* atomicT_impl = new AtomicTImpl(); + atomicT->atomicT = (union Data *)atomic_t_impl; +... + return atomicT; +} + +__code checkAndSet_AtomicTImpl(struct AtomicTImpl* atomicT_impl, T oldData, T newData, __code next(...), __code fail(...)){ + if (__sync_bool_compare_and_swap(&atomicT->atomic, init, newData)){ + goto next(...); + } + goto fail(...); +} +