Thriftの謎とIDLの型システム

3
Sadayuki Furuhashi @frsyuki

例えば順序付きのMapが欲しくて、Rubyで自前でOrderedMapクラスを実装した人がいたら、struct FooStruct { 1: map barField; } typespec FooStruct.barField MyRubyApp:OrderedMap; と書く

2011-03-27 03:22:01
Muga Nishizawa @muga_nishizawa

@frsyuki 実装が大変なのはおいておいて、「処理系ではインタフェースに基づいた型だけを提供」がまずほしいですねー

2011-03-27 03:23:10
Sadayuki Furuhashi @frsyuki

typespecがstruct定義の外側に書けるのは結構ポイントで、元の(インタフェースを記述した)structの定義を書き換えずに、実装に関する定義を追加できる。

2011-03-27 03:25:40
Sadayuki Furuhashi @frsyuki

@muga_nishizawa クライアントを書く側からすると、実装の詳細を省いた記述が欲しい印象ですね。サーバを書く側からすると、実装の詳細もIDLに書きたくなる印象です。

2011-03-27 03:28:07
Muga Nishizawa @muga_nishizawa

外側なのはとても良いことだと思います。そうゆうのをまとめて記述できる箇所があればどうですか?

2011-03-27 03:29:03
Sadayuki Furuhashi @frsyuki

@muga_nishizawa まとめてというと、typespec MyApp { MyApp専用の記述をまとめて書く... } という感じで、アプリケーション(言語)ごとにまとめて書くということでしょうか?

2011-03-27 03:30:40
Muga Nishizawa @muga_nishizawa

例えば、kumofs.msgpack というファイルがあって、そこにインターフェースを宣言して

2011-03-27 03:30:57
Muga Nishizawa @muga_nishizawa

実装の詳細には、kumofs.msgpack を継承した kumofs-impl.msgpack を定義するとか。

2011-03-27 03:32:26
Sadayuki Furuhashi @frsyuki

定義を外側に書ければ、あとは idl-processor kumofs.msgpack kumofs-impl.msgpack -lang=cpp のように、コマンドが複数ファイルからの入力に対応すればOK!

2011-03-27 03:34:29
Sadayuki Furuhashi @frsyuki

kumofs-impl.msgpack の先頭に include kumofs.msgpack; と書く手もあるか。「継承」はどうやるんだろう…

2011-03-27 03:38:33
Muga Nishizawa @muga_nishizawa

そうそう。include と言おうか継承と言おうかで迷ってました…

2011-03-27 03:40:31
Muga Nishizawa @muga_nishizawa

もとの定義を利用したいのか、上書きをしたいのかという話で、「継承」と言いました。

2011-03-27 03:42:21
Sadayuki Furuhashi @frsyuki

継承の記述方法は、2010.07.30 と 2010.09.14 にもtwitterでつぶやいていた記録が。(オブジェクト指向的な)継承は問題が多いが、RPCの例外に限っては継承が欲しいので別に対応という流れ。

2011-03-27 03:47:25
Sadayuki Furuhashi @frsyuki

書き方は exception SubException < SuperException { ... } とか、exception SuperException { ... exception SubException { ... } } という感じ。

2011-03-27 03:48:09
Sadayuki Furuhashi @frsyuki

typespecの発想は、継承というかカテゴリに近いのかな。 http://bit.ly/cBiyNN

2011-03-27 03:51:40
Suguru ARAKAWA @ashigeru

@frsyuki 昔やった時には、このへんはIDLでのサポートじゃなくて、型レゾルバを拡張するプラグイン機構の提供くらいにしてました

2011-03-27 04:03:34
Sadayuki Furuhashi @frsyuki

@ashigeru 型レゾルバ…!なるほど。かなり良い感じのレイヤー分けですね。

2011-03-27 04:05:59
Sadayuki Furuhashi @frsyuki

「Thriftの謎とIDLの型システム」をトゥギャりました。 http://togetter.com/li/116494

2011-03-27 04:10:43
Muga Nishizawa @muga_nishizawa

@frsyuki うまい棒の件がトゥギャられてるよ!><

2011-03-27 04:15:59
Sadayuki Furuhashi @frsyuki

@muga_nishizawa 実は意図的なんです>< あまりにツボすぎて…!!

2011-03-27 04:18:13
Suguru ARAKAWA @ashigeru

@frsyuki プロパティ変更時にイベントを発火させるとか特殊要件になりすぎて、IDLのセマンティクスが破綻しそうになったので、属性ベースで拡張していくような感じにしてました。組み合わせ爆発は起こりにくい代わりに細かいことが難しいって欠点があります

2011-03-27 04:16:37
Sadayuki Furuhashi @frsyuki

パーサとASTまでは固定にしてコード生成器だけをプラガブルにするのが良いと思っていたけども、ASTとコード生成の間に「型リゾルバ」ということでプラガブルな層を1層追加するのも良さそう。

2011-03-27 04:16:50
Sadayuki Furuhashi @frsyuki

struct FooStruct { 1: map<string,string> @ordered BarField; }; resolve map<string,string> @ordered cpp:map<string,string> これはちょっと厳しいか…

2011-03-27 04:21:50
Sadayuki Furuhashi @frsyuki

わりと爆発しそう。genericsがほしい。

2011-03-27 04:23:39