Type System of Continuation based C
Yasutaka Higa
研究目的
動作するプログラムの信頼性を保証したい
検証を行ないやすい単位としてプログラムをコードセグメントとデータセグメントという単位で記述する
プログラムはコードセグメントという処理の集合として表され、相互に接続される
接続部分をメタ計算として定義し、その切り替えでプログラムの検証を行う
研究内容
コードセグメントとデータセグメントを用いて記述する言語 Continuation based C に型を導入する
CbCでは接続するコードセグメント群を元にデータセグメントを定義するためにプログラムの再利用性が高めづらい
型情報を用いてコードセグメントが接続可能かどうかをコンパイラやランタイムが判断できるようにする
また、接続に必要なデータセグメントやスタブを自動生成する
近況報告
CbC の型の定義をしています
単純型付き lambda 計算
直積での定義
制約の列を取るようにしてみる
部分型での定義
単純型付き lambda 計算
CodeSegment は 値を取って値を返すもの
1つの値を渡す/返すができる
複数の入力なら currying でなんとかなる
複数の値を返せない
直積での定義
CodeSegment は直積を取って直積を返すもの
複数の値を渡す/返す ができる
合成もできる
割と良いが codesegment を取る codesegment の定義が難しい
pop : CodeSegment (stackImpl × (CodeSegment (stackImpl × Maybe a) t)) t
(stackImpl × Maybe a) -> t
のみしか渡せない
(stackImpl × Maybe a × b) -> c とか書けない
制約の列を取るようにしてみる
CodeSegment は特定の field を持つ DS を取って返すもの
『特定のfieldを持つ』という制約は各csの InputDS が必要とする field
合成したら制約が増えていく、というアイデア
そもそも関数が合成できなかった
f : CodeSegment I O [] g : CodeSegment I1 O2 [] f ∘ g : CodeSegment I O2 [O , I2]
部分型での定義
CodeSegment は Context に含まれる DS を取ってDSを返すもの
一旦 Context に変換してやることで関数合成もできる
『Contextの情報から合成可能か判断できる』ので性質は OpenSystem に使えそう
定義と合成が書けました
が、メタ計算の定義をしようと思ったら一筋縄ではない
メタ計算の定義がどうしてできないのか
Context が確定するとCodeSegmentの定義・合成可能なのですが
Stack のコードは Context に CodeSegment (next)を持つ
ので Stack が定義できないと Context が定義できず、Context が決まらないとStackの実装が書けない
あとやること
メタ計算を部分型でどう書くか
メタ計算がMonadになるか
修論の目次
修論の本体