Mercurial > hg > Papers > 2021 > anatofuz-master
changeset 94:d4b5c1b2925f
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 05 Feb 2021 20:32:25 +0900 |
parents | b1febd693942 |
children | 92a1eb7a314c |
files | paper/chapter/04-interface.tex paper/master_paper.pdf paper/src/fsImpl.cbc |
diffstat | 3 files changed, 29 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter/04-interface.tex Fri Feb 05 20:06:02 2021 +0900 +++ b/paper/chapter/04-interface.tex Fri Feb 05 20:32:25 2021 +0900 @@ -110,15 +110,25 @@ また各CodeGearからgotoする際に、 遷移先のInterfaceに値を書き込みに行く。 -Interfaceで定義したCodeGearと対応しているImplementのCodeGearの場合はこのデータの取り出し方で問題はない。 -しかしImplementのCodeGearから内部でgotoするCodeGearの場合は事情が異なる。 -内部でgotoするCodeGearは、 Javaなどのプライベートメソッドとして使用できる。 -このCodeGearのことをprivate CodeGearと呼ぶ。 -privateCodeGearにgotoする場合、 goto元のCodeGearからは\texttt{goto meta}経由で遷移する。 -goto metaが発行されるとStub Code Gearに遷移するが、現在のシステムではInterfaceから値を取得しに行く。 -private CodeGearの入力もStubから取得したいと考え、 ImplementをInterfaceのつもりでGearsOSのコードを記述した。 +ImplementのCodeGearから内部でgotoするCodeGearの場合は引数としてImpl内部のデータ型は取り出すことができない。 +GearsOSではgoto文は、すべて\texttt{goto meta}に書き変わる。 +goto metaが発行されるとStub Code Gearに継続するが、現在のシステムではInterfaceから値をStubで取得する。 +Implementの内部の引数はこの時点ではStubから取得することはできず、 実装側のCodeGearの内部から取り出す必要がある。 +StubからImpl内部のデータを取得しようと、 ImplをInterfaceと見立ててGearsOSのプログラミングをしたことがあった。 +ソースコード\ref{src:fsImpl}では、fs Interfaceに対する実装のfs\_implを、 あたかもInterfaceのように見せるハックである。 +generate\_stub.plはコンストラクタがあり、\texttt{\#interface}構文で呼ばれていたら、対象のDataGearがInterfaceであると判断する。 +この場合はコンストラクタに対応する文字列をコメントとして書いている為、StubCodeGearはImplをInterfaceだと思い込む。 +よって、 StubでContext内部のImplの置き場所から値を取得するようになった。 +しかし、この誤魔化しはメタレベルとノーマルレベルの分離どころではなく、GearsOSの設計に反する記述であった。 +\lstinputlisting[label=src:fsImpl, caption=ImplをInterfaceのようにふるまわせる為に、コンストラクタを偽装した例]{src/fsImpl.cbc} + + +これはそもそも、Implの内部で持つ値はDataGearではなく、DataGearに含まれる値であるということを意識出来なかった為である。 +GearsOSはデータの単位はDataGearで行われる。 +Interfaceの呼び出し時に使われる引数はDataGearとして処理されるが、ImplはそもそもImpl全体が1つのDataGearであるため、Stub経由で値をとるのは間違っていたのであった。 +Implの値をCodeGearの内部で使う場合は、第一引数で与えられる自分自身のDataGearの参照から取り出す必要がある。 \section{Interfaceのパーサーの構築}\label{sec:interfaceParser} 従来のGearsOSのトランスパイラでは、 generate\_stub.plがInterfaceファイルを開き、情報を解析していた。 この情報解析はgetDataGear関数で行われていた。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/fsImpl.cbc Fri Feb 05 20:32:25 2021 +0900 @@ -0,0 +1,12 @@ + +/* +fs_impl* createfs_impl2(); +*/ + +__code allocinode(struct fs_impl* fs_impl, uint dev, struct superblock* sb, __code next(...)){ + + readsb(dev, sb); + Gearef(cbc_context, fs_impl)->inum = 1; + goto allocinode_loopcheck(fs_impl, inum, dev, sb, bp, dip, next(...)); + +}