Island Life

< プログラミングと体力 | http://www.onweb.to/palestine... >

2004/04/14

Lispセミナー

6/11にFranzのセミナーで ちょいと喋ります。見どころは黒田さんとの正規表現バトルです。なんてね。

Tag: Lisp

Past comment(s)

hira :

「正規表現必要無し」とは。一体どういうことなんでしょう?ちょっと想像できないです。うまいパースの仕方でもあるのかしら。

shiro :

うーん、とりあえず、特にスクリプト言語界隈では 正規表現が使われ過ぎているという現状はあるでしょうね。 ワンライナーならともかく、ちょっと込み入った文法を ちゃんとパーズするなら、簡単なトーカナイザ+手書きパーザの方が 書きやすさもメンテナンス性もずっと高いと思います。ツリーの処理に大げさな 足場が必要な言語だとそれへの敷居が高いでしょうが、Lisp/Schemeなら S式で扱えるので。

一方、Lisp/Schemeでパーザを書くのは非常に簡単ですが、 「効率の良い」パーザを書くのはそれほど自明な問題ではないですね。 そういう点では、特定のドメインに最適化されたサブ言語が提供されてることは 意味があると思います。matchなんかと同じレベルですね。

二つの立場は一見相反するようですがそうでもなくて、結局 最適化っていうのは適用範囲を決めないと出来ないわけで。

  • 頻繁に出会うパターンは最適化されたライブラリを持っとく
  • それ以外のパターンは地の言語でさくっと書く

って戦略がLispらしいのかなあと。後者が出来ないプラットフォームでは、 つい何でも前者を使って解決しようとしてしまうんじゃないか (ハンマーを持つと何でも釘に見えるってやつですね)、と思います。

cut-sea :

私は awk から入ったので正規表現万歳な人間です。 最初に自作した lisp でも regex ライブラリを使用してですが、 正規表現使えないとねって組み込んだし。
ただ、正規表現もどんどん複雑なレベルの形式がでてきて 連接や選択はそうでもないと思うのですが、 繰り返し関係の式はパターンがありすぎな気もします。 私は ? + * 以外はほとんど使ったこと無し。 そこまで厳密にしなくても大体マッチするようなことしか してないってだけかもしれませんけど。

cut-sea :

なんかタイトルみてると聞いてみたいなってのもあるんですが、 皆さんの肩書き見てると先生とかいたりして難しそうですねぇ。

戯 :

  • http://www.try-net.or.jp/~yoji/idea/gramagic/ の話あたりが関係有るんだと思うんですが、文法解析って、たしか(ぉぃ)結局、単語を要素とした正規表現みたいなものですよね。つまりパーサー作る技術と単語切り出し器を作る技術は本質的に同じってゆーか、単語切り出しと構文切り出しが「入れ子構造(CompositePattern)」を成してるってゆーか。
    • だから、パーサー作るのが得意な言語なら、正規表現と同じ戦闘力を持つ何かを作るのもまた得意、なのではないかと妄想。 --戯?
  • 「ツリーが得意」については、そういやメジャーScript言語も、Hashは大抵装備されてるけど、Tree型を装備してる奴はなかなか無いですね。凄く頻繁に使うのに、変だなと思う次第。
  • メジャー言語だと正規表現を「使う」ことは出来ても、正規表現チックなもの(構文読み器も含む)を「作る」のは苦手ですね。RubyのRegexpもCで書かれてるわけだし。その点はVB(市販ComponentのContainerに過ぎないと揶揄される)と大差ない(藁
    • かといって、わざわざRaccが必要になるのも冴えない話だし。

iriyak :

正規表現が使われ過ぎている現状については私自身実感しています。仕事で構成ファイルのパーサやジェネレータの類をワンショットで Awk & Bourne Shell でよく書きますが、Awk で処理しやすいように気づいたら文法を簡単にしている、ということがよくありました。これじゃいかんとトーカナイザやパーサを作ろうと思い立つのですが、足場作りに手間取っている間に仕事が終わってしまうことが多く、けっきょくまた元の木阿弥という構図です。しかしそろそろトーカナイザとパーサが道具として手元に欲しくなってきたので、この六月のセミナはたいへんタイムリー。たいへん興味をもっています。

anonymous :

Franz 社セミナーいよいよですね。著名な Lisp 使いの皆さんにお会いできることを、そして 仕事で使うための貴重な情報を得られることを、とても楽しみにしています。 仕事の都合で二日目のShiro さんの講演に参加できないのは残念ですが…。 セミナーのまとめページを作っても宜しいでしょうか?参加できずに悔しい思いをしている方もいらっしゃるかと思うのですが。

anonymous :

遠慮せずに、作ってしまったらどうでしょうか。WiLiKi:Seminar

shiro :

戯さんへ: えーっと、 いくつかの問題意識(と、用語)がこんがらがってるみたいで、 コメントがつけづらいっす。正規表現エンジンは 正規文法のパーサーですが、「パーサー作るのが得意な言語なら、 正規表現と同じ戦闘力を持つ何かを作るのもまた得意」って? 「字句解析→文法解析」っていうパイプラインの話と、 各種文法とそのオートマトンの話がごっちゃになってませんか。

後半は、なんとなく言いたいポイントはわからんでもないです。

文字列の正規表現エンジンってのは、ランタイムに与えられる正規文法に 対してそれのパーザを生成するものなんで、文法のクラスの違いを 除けば、LALR文法からパーザを生成するyacc, bisonやらLL(k)からのANTLRやらと 同類であるってことは言えるでしょうね。

で、パーザジェネレータは確かにそのクラスの文法に対してパーザーを 自動生成してくれます。しかし、汎用性の裏にはトレードオフがある。 例えば正規文法をDFAに展開するやつだと生成された表がやたらに大きくなるとか。 文法が既知で簡単なら、べたにオートマトンを書き下しちゃったほうが わかりやすい場合もある。また、正規文法ならあまりそういうことはないけど、 CFGの場合は考えてる文法をLALRやLLに落とすところが面倒である場合もある。 結局、べたに地の言語で書く手間と、外部ツールを導入するオーバヘッドを 天秤にかけてケースバイケースで扱っているってことでしょうね。

その閾値が、言語組み込みのデータ型のサポートなんかで違って来るんじゃ なかろうか。S式使えると楽だよね。って話なんじゃないかなあ。

あと、Rubyの(文字列の)正規表現エンジンがCなのは効率の問題だと思ってますが (Gaucheはそうです)。これは単に、Cだとバイトアレイをスキャンする効率良い コードが書けるからです。文字列でないもの、例えばXMLツリーを パーズする正規表現エンジンだったら、必ずしもCが有利だとは 限らないっすね。