Thriftの謎とIDLの型システム

3
Muga Nishizawa @muga_nishizawa

Thrift IDL の文法に typedef があるなんて今まで知りませんでした… http://bit.ly/hAUnmF

2011-03-27 02:18:13
Sadayuki Furuhashi @frsyuki

ThriftのIDLは謎が色々。フィールドの区切りも引数の区切りも ListSeparator で、, と ; のどちらも使えるようになっている。Throwsの引数が何故かFieldで、Identifierが必須。map/setとlistでcpp_typeが入る場所が逆。

2011-03-27 02:40:31
Sadayuki Furuhashi @frsyuki

Literal というとソースコード中の定数というか値のことだと思うのだけど、Thrfit IDL の中では Literal は文字列の定義。代わりに ConstValue という定義があるのだけど、それが Literal じゃないのかな、とかとか…

2011-03-27 02:47:30
Muga Nishizawa @muga_nishizawa

なるほど Literal が文字列のみですね[36]。IDL だから良いのかな?通常の言語だと Literal は int literal, long literal とかに分かれていきますねー

2011-03-27 02:52:42
Muga Nishizawa @muga_nishizawa

おぉ、本当だ… 要所要所に cpp_type がくっついている

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

あと細かいけども、NamespaceScopeで言語の名前を指定して個別の名前空間を設定できるのだけど、C++の表記はcpp、Javaの表記はjavaで、それならRubyはrubyと来ると思ったらrbで、Pythonはpy。ファイルの拡張子かな?と思えば、Perlはperl。

2011-03-27 02:51:18
Muga Nishizawa @muga_nishizawa

一般的な言語に非依存な IDL に、CppType が含まれてしまっているのは良くないですね。

2011-03-27 02:48:53
Sadayuki Furuhashi @frsyuki

@muga_nishizawa ある程度言語に依存した記述が入ってしまうのは仕方ない気がします。言語依存というか、アプリケーションに依存した記述ですが。

2011-03-27 02:54:25
Muga Nishizawa @muga_nishizawa

@frsyuki namespace の 'cpp' やら 'java' やらは仕方ないですか… CppType は…

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

@muga_nishizawa CppTypeはイマイチな感じですね。拡張性が無いし、アプリケーション(実装)に固有な指定でなくて、言語に固有なのはちょっとハズしている気がします。

2011-03-27 03:05:44
Sadayuki Furuhashi @frsyuki

IDLはインタフェースを記述すると同時に、実装の生成もするので、実装に依存した記述も書きたくなる。たぶん、レイヤーを分けた方が良いのだけども、綺麗に分けられない気がするので、イザと言うときは泥臭く書けた方が実用性は良さそう。

2011-03-27 02:57:09
Muga Nishizawa @muga_nishizawa

うまい棒 マーボー味ととんかつソース味、どっちから食べようかな

2011-03-27 02:23:17
Muga Nishizawa @muga_nishizawa

昔、筒の部分に歯磨き粉を入れられていたうまい棒を、気づかずに食べてしまい、残念な気持ちになったことがある。

2011-03-27 02:27:50
Muga Nishizawa @muga_nishizawa

よくよく考えれば、アレはよくできたトラップだった…

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

"typespec"文を追加して、struct X { 1:list<string> key; }; typespec X.key cpp:std::vector<string>, java:ArrayList<String>; とか。

2011-03-27 03:07:18
Sadayuki Furuhashi @frsyuki

cppのところは拡張可能として、 typespec X.key MyApp:std::vector<string> と書けるとか。

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

型の種類をインタフェースに基づいて決めるか、実装に基づいて決めるか微妙。Thriftはインタフェース。実装に基づくなら、 map は map と ordered_map と に分ける必要とか、list は link_list と array_list に分けるとか。

2011-03-27 03:12:37
Sadayuki Furuhashi @frsyuki

実装に基づいた型にすると、言語によってサポートしていない型が出てきてしまう。例えば Ruby には ordered_map に相当する型が無い。これを Hash で生成してしまうか、ordered_mapの意味論を実装したクラスをIDL処理系が提供するか。

2011-03-27 03:14:02
SKS rep @repeatedly

デフォルトorderedな処理系だと楽かもだけど…

2011-03-27 03:16:58
SKS rep @repeatedly

メンテナンスコストも増えるしあばば

2011-03-27 03:17:45
Sadayuki Furuhashi @frsyuki

実装に基づいた型にするとIDL処理系の実装が大変なので…処理系ではインタフェースに基づいた型だけを提供して、実装に基づいた型を明示したい場合は、ユーザーが指定できるのが良さそうだと思っているところ。

2011-03-27 03:17:49
1 ・・ 4 次へ