comparison paper/type.tex @ 48:623c90a21227

Wrote type.tex
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Mon, 30 Jan 2017 16:41:56 +0900
parents 45d3ac176bf5
children 451c510825de
comparison
equal deleted inserted replaced
47:45d3ac176bf5 48:623c90a21227
1134 1134
1135 という場合に限る。 1135 という場合に限る。
1136 1136
1137 % }}} 1137 % }}}
1138 1138
1139 % {{{ 部分型と Continuation based C
1139 1140
1140 \section{部分型と Continuation based C} 1141 \section{部分型と Continuation based C}
1142 部分型を用いて Conituation based C の型システムを定義していく。
1143
1144 まず、DataSegment の型から定義してく。
1145 DataSegment 自体はCの構造体によって定義されているため、レコード型として考えることができる。
1146 例えばリスト~\ref{src:akasha-context}に示していた DataSegment の一つに注目する(リスト~\ref{src:type-ds})。
1147
1148 \lstinputlisting[label=src:type-ds, caption=akashaContext の DataSegment である AkashaInfo] {src/type-ds.h}
1149 この AkashaInfo は $ \{ minHeight : unsigned\; int , maxHeight : unsigned \; int, akashaNode : AkashaNode*\}$ であると見なせる。
1150 CodeSegment は DataSegment を引数に取るため、DataSegment の型は CodeSegment が要求する最低限の制約をまとめたものと言える。
1151
1152 次に Meta DataSegment について考える。
1153 Meta DataSegment はプログラムに出現する DataSegment の共用体であった。
1154 これを DataSegment の構造体に変更する。
1155 こうすることにより、 Meta DataSegment はプログラム中に出現する DataSegment を必ず持つため、Meta DataSegment は任意の DataSegment の部分型となる。
1156 もしくは各 DataSegment の全てのフィールドを含むような1つの構造体でも良い。
1157 第~\ref{chapter:cbc-type}章における Meta DataSegment はそのように定義している。
1158
1159 具体的な CbC における Meta DataSegment であるContext (リスト~\ref{src:type-mds})は、 DataSegment の集合を値として持っているために明らかに DataSegment よりも多くの情報を持っている。
1160 \lstinputlisting[label=src:type-mds, caption=CbC の Meta DataSegment である Context] {src/type-mds.h}
1161
1162 部分型として定義するなら以下のような定義となる。
1163
1164 \begin{definition}
1165 Meta DataSegment の定義
1166
1167 \begin{align*}
1168 Meta \; DataSegment <: DataSegment_i^{i \in N} && \text{S-MDS}
1169 \end{align*}
1170 \end{definition}
1171
1172 なお、$N$はあるプログラムに出現するデータセグメントの名前の集合であるとする。
1173
1174 次に CodeSegment の型について考える。
1175 CodeSegment は DataSegment を DataSegment へと移す関数型とする。
1176
1177 \begin{definition}
1178 CodeSegment の定義
1179
1180 \begin{align*}
1181 DataSegment \rightarrow DataSegment && \text{T-CS}
1182 \end{align*}
1183 \end{definition}
1184
1185 そして Meta CodeSegmentは Meta DataSegment を Meta DataSegment へと移す関数となる。
1186
1187 \begin{definition}
1188 Meta CodeSegment の定義
1189
1190 \begin{align*}
1191 Meta \; DataSegment \rightarrow Meta \; DataSegment && \text{T-MCS}
1192 \end{align*}
1193 \end{definition}
1194
1195 ここで具体的なコード(リスト~\ref{src:type-cs})と比較してみる。
1196
1197 \lstinputlisting[label=src:type-cs, caption=具体的なCbCにおける CodeSegment] {src/type-cs.c}
1198
1199 CodeSegment \verb/getMinHeight/ は DataSegment \verb/Allocate/ と \verb/AkashaInfo/ を引数に取っている。
1200 現状は \verb/Context/ も継続のために渡しているが、本来ノーマルレベルからはアクセスできないために隠れているとする。
1201 その場合、引数の型は $ \{ allocate : Allocate , akashaInfo : AkahsaInfo\} $ となる。
1202 また、返り値は構文的には存在していないが、軽量継続で渡す値は $ Context $ である。
1203 よって \verb/getMinHeight/ の型は $ \{ allocate : Allocate , akashaInfo : AkahsaInfo\} \rightarrow Context $ となる。
1204 $ Context $ の型は Meta DataSegment なので、 subtype の S-ARROW より $Context $の上位型への変更ができる。
1205
1206 $ \{ allocat; : Allocate , akashaInfo : AkahsaInfo\} $ を $X$と置いて、\verb/getMinHeignt/ を $ X \rightarrow X $ とする際の導出木は以下である。
1207
1208 \begin{prooftree}
1209 \AxiomC{}
1210 \RightLabel{S-REFL}
1211 \UnaryInfC{$ X <: X $}
1212 \AxiomC{}
1213 \RightLabel{S-MDS}
1214 \UnaryInfC{$ Conttext <: X$}
1215 \RightLabel{S-ARROW}
1216 \BinaryInfC{$ X \rightarrow Context <: X \rightarrow X$}
1217 \end{prooftree}
1218
1219 返り値部分を部分型として定義することにより、軽量継続先が上位型であればどの CodeSegment へと遷移しても良い。
1220 プログラムによっては遷移先は確定しているために部分型にする必要性は無いが、メタ計算やライブラリなどの遷移先が不定の場合は一度部分型として確定し、その後コンパイル時やランタイム時に包摂関係から具体型を導けば良い。
1221 例えばコンパイル時に解決すればライブラリの静的リンク時実行コード生成が行なえ、ランタイム時に解決すればネットワークを経由するプログラムとの接続初期化に利用できる。
1222 例えば、プロトコルがバージョンを持つ場合に接続先のプログラムが利用しているプロトコルと互換性があるかの判断を Context どうしの部分型関係で判断できる。
1223
1224 また、stub のみに注目すると、stub は Context から具体的なDataSegment X を取り出す操作に相当し、S-ARROWの左側の前提のような振舞いをする。
1225 加えて、軽量継続する際に X の計算結果を Context に格納してから goto する部分を別の Meta CodeSegment として分離すると、S-ARROWの右側の前提のような振舞いを行なう。
1226 このようにノーマルレベルの CodeSegment の先頭と末尾にメタ計算を接続することによってノーマルレベルの CodeSegment が型付けできる。
1227 型付けにDataSegment の集合としての Meta DataSegment が必須になるが、これは構造体として定義可能なためコンパイル時に生成することで CbC に組み込むことができる。
1228
1229 なお、メタ計算に利用する Meta DataSegment と Meta DataSegment も同様に型付けできる。
1230 ここで興味深いのはあるレベルの CodeSegment は同レベルの DataSegment において型付けされるが、一つ上の階層から見ると、下の階層のDataSegmentとして一貫して扱えることにある。
1231 このようにメタ計算を階層化することにより、メタ計算で拡張された計算に対しても他のメタ計算が容易に適用できる。
1232
1233 % }}}