2008年05月19日

次世代設定記述形式、Lua・Json・YAML

俺のなかでXMLを超える次世代記述形式の熱が高まってきた。ものすごく。もともとXMLは文書のマークアップ言語から派生した構造化形式で、設定ファイルを記述するには自由度が高すぎて冗長という難点があった。その弱点を補うため、近年注目されている設定ファイル記述形式が↓の3つだ。じゃじゃじゃーん。

  • Lua
  • Json
  • YAML
 
それぞれの特徴を調べてみることにする。調べてなんに使うかはだ。ていうか使わないかもしれん。単なる俺の蒐集趣味な〜〜〜
  
Luaについて

ブラジルで開発されたスクリプト言語。設定ファイル記述形式じゃなくてちゃんとした言語らしい。

http://staff.aist.go.jp/yutaka.ueno/lua/docsjp.html

ただ、他言語組み込み用として使われること、↓にも書いてあるとおり、元々設定ファイル記述のための言語だったことなどから設定ファイル向きだといえるかも〜

http://www.rubyist.net/~matz/20050106.html

Luaを用いた設定ファイルは、こんな風に書ける

bind = { length = 64,
  data = {
    name = "String",
    type = "byte",
    value = "int"
    cost = "int"
    align = "byte"
  }
}
Luaの利点は豊富な機能だ。スクリプト言語としてみるならむしろ機能不足でいろいろ足りないことがあるんだけど、設定記述形式としてみるのなら型情報あり、制御構造あり、関数ポインタあり、ヒヤドキュメントありとむちゃくちゃリッチ。これを得してるとみるかオーバースペックと見るかは使い方次第なんだけど〜。
あとスクリプト言語としてかなり重要なポイント。LuaからJson形式を読み込むこともできるんだそうだ。何その多重構造。

Jsonについて

JavaScriptObjectNotationの略。javascriptのリスト記述形式をそのまま構造記述形式にしたものだそうな。
javascriptのリテラルそのままなので、javascript内でeval()すればそのまま利用できる。超便利。だが、その便利さが気持ち悪いていう人もいるみたいで・・・

http://wids.net/haruka/200711a.html

確かにリモートから渡されてくる文字列そのままパースするなんて気持ち悪いことこの上ないというのはわからないでもない。明らかにそういうシチュエーションから混入するものだし。ウィルスとかなんとかかんとか。

だがローカルの文字列をローカルに呼び出す分には、そんなにひどいことは起こさないと思われる。適材適所だな〜。

Jsonを用いた設定ファイルは、こんな風に書ける

{"bind": { "length": 64,
  "data": {
    "name": "String",
    "type": "byte",
    "value": "int"
    "cost": "int"
    "align": "byte"
    }
  }
}

どうも「""」がちらついててうざいぜベイベー。ある言語のリテラルを利用した設定記述形式って、こういううざさがあるよね。あきらかに文字列を利用する場合が多いんだから、何も書いてないトークンは文字列として扱ってほしいわ。だが普通のスクリプト言語では、文字列リテラルより変数とかのシンボルを書く機会の方が多いから文字列の方の利便性を落とす=引用符をつけるのはわかる。

ただ、Jsonには他2形式に比べて明らかな利点がある。利用環境がむちゃくちゃ多いということだ。なんせjavascriptリテラルなのでjavascriptをevalできる環境なら全て利用できる。極論するとJavaから利用するなら、rhinoが標準添付されたJava6からは標準でJson利用可能ということ!すげー。ヤター!!

しかも前述のとおりLuaはJsonから利用可能、さらに後述のYAMLはJsonスーパーセットなので、YAMLが使える環境ならJsonも標準で使える。なんたるポータビリティ!!

YAMLについて

こちらは実はスクリプト言語とか実はjavascriptリテラルとかいう代物ではなく、純粋な設定記述言語として設計されたもの。最近railsで採用され始めてから目にする機会が増えたね。

http://www.ibm.com/developerworks/jp/xml/library/x-matters23/

設定記述に特化しているだけあって書き味は非常になめらか。(どういう評価だそれ)

YAMLを用いた設定ファイルは、こんな風に書ける。

bind:
  length: 64
  data:
    name: String
    type: byte
    value: int
    cost: int
    align: byte

文字列は引用符を書かずそのまま文字列になるし、ネスト構造はインデントを考慮しているため{}やらなにやら書かなくてもよい。非常に見てわかりやすいです
ただ、YAMLをパースできる環境を用意しなきゃいけないので利用するアプリケーション側は非常に苦労しなきゃいけない。これ、難点な。

それに機能がリッチすぎでして、こんなに機能いらないからただ設定が書ければいいっていう実装が現れたりしてまして。そうだね設定ファイル側でこんなに機能いらないよねiniファイル形式に増毛した程度でいいんじゃないのって思う向きには↓のようなものも。

http://shinh.skr.jp/bogoyaml/

ちなみにXMLでは・・・

先ほどからの例、実は5つの宝島用ツールソフトの設定ファイルの形式なんだけど、現在はXMLファイルを使用して設定ファイルを記述しています。↓のような感じで・・・

<bind length="64">
  <data
    name="String
    type="byte"
    value="int"
    cost="int"
    align="byte"
   />
</bind>

わかりやすいかどうかはおいといて・・・この例だと記述性があんま変わらないかなぁ・・・
posted by LoyalTouch at 17:30| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック