+stream
Ridela
by
omo
2008-08-26 16:42
インターフェイス定義と DSL
森田です。こんにちは。夏休みもおわり、お仕事モードに戻ってまいりました。
さて、弊社の通信ミドルウェアである VCE は RPC ライクの機能を持っており、 そのインターフェイスは XML で定義します。ツール付属の gen コマンドがその XML を解釈し、 RPC のスタブを出力してくれるわけです。弊社でネットワークプログラミングをするという場合、 仕事の半分くらいはこの RPC の定義と、受信時の処理を書く作業になります。
XML は Microsoft InfoPath のような おしゃれ GUI ツールで生成できます。 ただ、同僚の中には信仰上の理由で InfoPath を好まない人や、それどころか XML もキライという人さえいます。 便利ツールは使えばいいのにという気はしますが、思想信仰の自由や多様性はできることなら守りたいものです。
さて歴史を振り返ると、RPC のインターフェイス定義には IDL (Interface Definition Language) という専用言語が使われてきました。 私もこれにならい IDL パーサを書こうかと思ったのですが、いかんせん面倒です。 文法から考えなければいけませんからね。まずい設計をした日には目もあてられません。
Ridela : Interface Definition Language over Ruby
もう少し変更に強く、かつラクに実装する方法はないものかと考え、 ためしに Ruby のライブラリとして実装してみました。 Rake や RSpec など、 Ruby の世界ではライブラリとして疑似言語を実装する流儀があります。 専用の文法やパーサを用意するわけではないけれど、文法のトリックと心の目の力で Ruby のコードを独自言語に見たてようというわけです。
ためしてみると案外あっさりできたので、公開してみることにしました。 "Ridela" と命名。 http://github.com/ceplus/ridela/ からダウンロードできます。
たとえば以下のように IDL (に見えなくもない Ruby のコード) を書くことができます。
require 'ridela'
require 'ridela/vce'
ns = Ridela::namespace(:hello) do |l|
l.interface(:DemoProtocol) do
l.method(:Say, :flow=>:s2c) do
l.args([:message, :string, {:length => 256}], [:count, :int])
end
end
end
Ridela::VCE::Writer.new(ns).write(STDOUT)
いかがでしょうか。IDL に見えないこともないですよね? (心の目を駆使してくださいね!) 最後の行では VCE 用の インターフェイス定義 XML を出力しています。
いまのところ VCE を使っている人以外に役立つものではありません。 ただ Ridela はコード生成部分と IDL のオブジェクトモデルを分離してありますから、 IDL のようなものが手軽に使いたい時には使い道があるかもしれません。 私も、たとえば SWIG 相当のツールの基盤として使えないかと考えています。 今は文法(API)を保守的に倒してありますが、 実際に使って様子をみながら、もう少しかっこよくしたいですね。
興味のある方はごらんください。それでは。
調べものしてたら偶然見つけた。って、モリタンがオレを覚えてるかどうか不安だけど。
お。どうもどうも。 大学ではお世話になりました。元気にやってますか。
ruby いいやつなんで使ってやってください。
去年の年末くらいに OB 会というのがあったのでいきました。T 先生は元気そうです。研究室の面子もだいぶ雰囲気が違い、計算機おたくの多い情報系っぽい人々でちょっとびびりました。