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