Mercurial > hg > Papers > 2021 > anatofuz-master
diff slide/index.md @ 124:62aca38647e8
...
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 07 Feb 2021 17:02:45 +0900 |
parents | bf51106b9171 |
children | e1e0a87b98f8 |
line wrap: on
line diff
--- a/slide/index.md Sun Feb 07 16:41:35 2021 +0900 +++ b/slide/index.md Sun Feb 07 17:02:45 2021 +0900 @@ -58,7 +58,7 @@ - フレームワークに乗って実装すると等価なCbCに変換される - CbCレベルではメタレベルの処理とノーマルレベルの処理が見れる - メタ計算を自分で定義できるようにしたい - - デバッグフラグ感覚でモデル検査を導入できるようにしたい + - 実装のコードをほとんど変えずにモデル検査を導入できるようにしたい --- # GearsOSのメタ計算フレームワーク @@ -156,52 +156,6 @@ - goto時にStubCodeGearでデータをとってくる --- -# Interfaceの定義 -- GearsOSで拡張したtypedef構文で宣言する - - 入出力の引数と、CodeGearを列挙する - -```c -typedef struct Stack<Type, Impl>{ - union Data* stack; - union Data* data; - union Data* data1; - - - __code whenEmpty(...); - __code clear(Impl* stack,__code next(...)); - __code push(Impl* stack,Type* data, __code next(...)); - __code pop(Impl* stack, __code next(Type* data, ...)); - __code pop2(Impl* stack, __code next(Type* data, Type* data1, ...)); - __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...)); - __code get(Impl* stack, __code next(Type* data, ...)); - __code get2(Impl* stack, __code next(Type* data, Type* data1, ...)); - __code next(...); -} Stack; -``` - - ---- -# メタレベルからみたInterface -- Cの構造体に変換される -- CodeGearはCodeGearの番号で持ち歩く - - 実装が決まると実装の番号が代入される -- 定義はcontext.h内のunion Dataの定義に書く - - union DataはすべてのDataGearの型をもつ - -```c - struct Stack { - union Data* stack; // 実装へのポインタ - union Data* data; - union Data* data1; - enum Code clear; - ... - enum Code get2; - enum Code next; - enum Code whenEmpty; - } Stack; -``` - ---- # GearsOSのビルドシステム - CMakeとPerlを使ってビルドする - CMakeはMakefileやbuild.ninjaを生成する @@ -282,17 +236,51 @@ --- # 従来のInterface +- 引数の組とAPI(CodeGear)は別けて記述する必要があった +```c +typedef struct Stack<Type, Impl>{ + union Data* stack; + union Data* data; + union Data* data1; + + __code whenEmpty(...); + __code clear(Impl* stack,__code next(...)); + __code push(Impl* stack,Type* data, __code next(...)); + __code pop(Impl* stack, __code next(Type* data, ...)); + __code pop2(Impl* stack, __code next(Type* data, Type* data1, ...)); + __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...)); + __code get(Impl* stack, __code next(Type* data, ...)); + __code get2(Impl* stack, __code next(Type* data, Type* data1, ...)); + __code next(...); +} Stack; +``` + +--- # 定義し直したInterface構文 +- APIのみを記述すれば良くなった +```c +typedef struct Stack<>{ + __code whenEmpty(...); + __code clear(Impl* stack,__code next(...)); + __code push(Impl* stack,Type* data, __code next(...)); + __code pop(Impl* stack, __code next(Type* data, ...)); + __code pop2(Impl* stack, __code next(Type* data, Type* data1, ...)); + __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...)); + __code get(Impl* stack, __code next(Type* data, ...)); + __code get2(Impl* stack, __code next(Type* data, Type* data1, ...)); + __code next(...); +} Stack; +``` --- # Implementの型定義ファイルの導入 -- Interfaceは型定義ファイルがあったが、Implはなかった - - generate_stub.plでImplの型は別ファイルからとってなかった為 -- 自分でcontext.h上にimplの型を書いていた +- Interfaceは型定義ファイルがあったが、実装側はなかった +- context.h上にメタな構造体に直した実装の型を手で書いていた - これはメタ情報なので手で書きたくない - 型定義の一貫性がない -- Implementにも型定義ファイルを導入して一貫性を持たせたい +- 実装側にも型定義ファイルを導入して一貫性を持たせたい + - Perlトランスパイラフレームワークで利用可能 --- # Implementの型定義 @@ -338,6 +326,7 @@ - すべてのDataGearの定義をunion Dataの定義内に書く - これは今まで手書きで作製していた - Interfaceの型定義ファイルを導入したので、自動生成が可能になった +- ビルド時に使用しているDataGearを回収し、 context.hを作製する ```c union Data { struct Stack { @@ -349,6 +338,26 @@ } ``` +--- +# Interfaceのパーサーの導入 +- PerlでのInterfaceの情報の取得は、CbC自体のファイルの解析処理と共通だった + - Interfaceならではの情報が取れない + - スクリプトに直接書かれているので他のツールが使えない +- モジュール化したInterfaceのパーサーを導入した + - Perlフレームワークを使う一連のツールの作製が可能になった + - InterfaceとImplを見た実装の雛形ファイルの作製ツール + - コード変換時にInterfaceのAPIに関連するチェック機能 + +--- +# メタ計算の切り替え機能 +- CodeGearが継続するMetaCodeGearを自由に選択できるPerlモジュールを導入した + - 従来はデフォルトで設定されるMetaCodeGearにしか継続しなかった + - Perlモジュールを書くことで特定のCodeGearの継続先を変更可能にした +- 様々な処理をMetaCodeGearですることが可能になった + - すでにモデル検査用のメタ計算を入れることが出来た(東恩納さんの修論) + +![w:932 h:10cm](./metapm.svg) + --- # まとめ @@ -360,4 +369,19 @@ - MetaCodeGearの制御をユーザー側で行えるようにした - モデル検査をメタ計算として自在に組み込むことが可能となった - Interfaceシステムを改良し、Perlトランスパイラで警告を発生させるようになった - - 他言語のInterfaceと同様に使うことができた \ No newline at end of file + - 他言語のInterfaceと同様に使うことができた + +--- + +```perl +sub replaceMeta { + return ( + [qr/PhilsImpl/ => \&generateMcMeta], + ); +} + +sub generateMcMeta { + my ($context, $next) = @_; + return "goto mcMeta($context, $next);"; +} +``` \ No newline at end of file