なぜプロトコル記述言語はDSLでなければならないのか

とおもったけど elf.py とか見ると結構コード入ってていまいち DSL ぽくないな…

ですよねー  という引用は全く関係なく自分の研究の話(我田引水)

そもそもプロトコル記述言語とは何か


世間的に流行しているものでは無い(と思う)ので、いろいろな解釈が渦巻く。

個人的に研究しているのは最初。
XCBはX11プロトコル専用なので、汎用化して普及させれば世間が幸せになると主張している。
そもそも、ここで述べる『プロトコル』は、

あたりを指す。
世間的に標準の解釈は「新しいプロトコルプロトコル記述言語で設計する」といったニュアンスだが、ここでのプロトコル記述言語は、あくまで「周辺のコンピュータと仲良くやるための最善の手法を追求する」ことを目的としている。
rob pike - "I estimate that 90-95% of the work in Plan 9 was directly or indirectly to honor externally imposed standards.*1"の90〜95%を簡単にしなければならない。

プロトコル記述言語で何が出来るのか

  • C言語や他の言語でエンディアンとかに悩む心配が無くなる
  • 紙やテキストファイルの仕様書を読まなくても霊感でバイナリファイルが処理できるようになる
  • 可能な限り高速にそれらを処理することが期待できる

メリットを訴求するために『Webサービスのパワーを、バイナリプロトコルに』という主張をしている。
XMLJSON記法、URLによるAPIは、見ただけで内容が解る。これが開発効率に及ぼすメリットは軽視されているが、重要。
XMLJSONを自分のプログラムで作って送信するのと同じくらいの難易度で、バイナリファイルや構造体を作り、パケットとして送信できる。

プロトコル記述言語には何が必要なのか

この手の言語で重要なのは、言語要素を可能な限り切り詰めてDSLとして方々の言語で再利用することにある。一つの記述をC言語JavaScriptXSLT等々に変換できなければならない。
そのため、プロトコル記述言語はPythonとかRubyとかC言語ベースであってはいけない。なぜならそれらはJavaScript上で動作しない。
個人的には「(プロトコルXを実装した)*2ライブラリが充実しているから」とか「動作環境が多いから」という理由でプログラミング言語が選択されるのは、本当に本当に本当に本当にくだらない理由だと考えている。これを実証するためには、プログラミング言語の機能が動作環境やライブラリの充実に関連が無いことを示さなければならないし、そういう環境を作らなければならない。
幸いなことに、これまでの研究で以下のプリミティブによってTCP/IPで使用されるPDUが記述できることは解っている。要するに多くの人の想像よりもプロトコルはダイナミックではなく、注意深く語彙を選定すれば現実的な規模で多くのプロトコルは記述できる。

もっとも、これらで記述できるTCPには再送や他のインテリジェントな仕組みは無い。それらはアプリケーションで実装しなければならない。しかし、TCPの再送等をOSが実装すべきなのかアプリケーションが実装すべきなのかは議論の余地がある。
これらの語彙は典型的なバイナリデータを記述するには十分だが、deflate等のアルゴリズムは記述できない。

open problems

  • DBMSはどのように記述されるべきか
  • ZIPアーカイバをもっともメタに記述する方法は何か
    • zlibを宇宙の果てまでポータブルにする方法
  • 具体的な実装に対するパフォーマンス対決
  • 純粋なテキスト言語に落とし、標準化トラックに乗せる
  • コンパイラの制作

要するに設計が不味いので、コンパイラが書けるのかどうかが解らない(大変だ)。Preccsのように正規表現などのwell-knownな構造に置き換える必要がある。

*1:http://www.eng.uwaterloo.ca/~ejones/writing/systemsresearch.html , http://web.archive.org/web/20050407125012/www.cs.takushoku-u.ac.jp/os/test/irrelevant.htm

*2:単にライブラリというと、何らかのアルゴリズムを実装したものを想像するが、CPANから何かインストールしろという指示が出た場合は何らかのプロトコル実装であることが殆どだろう