DSL?

Schemeの本を読み始めてから、マクロという考え方に感化されています。
LispやSchemeはマクロという機能を使い、自分自身を書き直してしまうことが可能な言語です。
たとえば足し算を全く別の計算に置き換えたりとか、そういう感じです。
や、これはあくまでも一例で。これ自身に意味はないですwww
超パワフルなイメージだけ伝わればOKですwww

マクロを使用する際の目的として多いのが、DSL(Domain Specific Language)の作成などだそうです。
DSLというのは、用途を特定した言語です。
AwkやMakeなどは一種のDSLと考えて良いと思われます。

こういう処理をするならこういう書き方できた方がいいよなー、でもそれって言語仕様にかかわるから無理だよなー、なんて思うことが度々あります。
それはもしかしたらアルゴリズムの改善だけで実現することかもしれないですし、DSLの利用領域としいて適切なものではないかも知れないのでアレですが、まぁそう思うことがあるのです。

たとえばレンダリング用のバッチファイルを書くときに、ここでforループを書きたいとか、これ変数に入れたい、とか、連番リネームしたいけどいちいちPython書くの面倒、、とか、そういうところです。
まぁそれぞれ簡単なユーティリティツールがあればいいのですが、やりたいことはちょくちょく違っていて、あぁこれじゃ使えねぇ!!ってなることもしばしばあるので、ある程度広い局面に対応できるようなものがいいなと思うと、やはりDSL欲しいな、なんて思ってしまうのです。
全部突っ込んだらツールが巨大になってあれこれ覚えないといけないとかだと最悪すぎるので。。

そんなところからDSLには強い興味を持っていました。

ということでちょっくら調べていたのですが、Rubyはマクロを採用しているので、Rubyネタはちょくちょくあるようですが、Pythonにはマクロがないので出来ないものなのだと思っていました。
mynzさんのご指摘で気づきました。Rubyにはマクロはありません。メタプログラミングと完全に取り違えていました。大変申し訳ありません。

ただかなり引っかかる点もあって。
何かといえばPythonがLispに影響を強く受けている点です。
Lispのマクロは強力である反面、使用には注意が必要とされているので、Pythonの開発者がそれを嫌がった可能性は十分にあります。
でもそれによって実現可能な世界を簡単に捨てるでしょうか?
否!
僕にはおそらく別の何かを用意したと考えていいんじゃないかと思えたのです。

で、調べた。

Python で Rake を真似るとしたら
Python,Rubyの言語内DSL構築力:PythonでRakeをまねる場合を例に

なるほど。デコレータを使ってあれこれ行うわけですね。←まだよくわかっていない

Rake(Ruby版Make)のコードとPython版Rake(?)のコードを見る限り、Pythonでも似たようなことは出来そうです。
構文の好みもあるので、どっちがどうとは言えませんが、構文自体をゴリゴリ変更したいというような要望があるわけでもなければ、PythonスタイルのDSLは書けそうです。
もちろんどの程度のものかにもよるでしょうけども。

Rubyはブロック構文がやはりおもしろいですねー。
ブロックをブロックとして扱う(?)感覚ってのは他の言語にはないですね。
少なくとも今まで触ってきたものには、、、
あれこれ調べていたら俄然Rubyに興味が湧いたことは内緒です。。

またしても専門外のネタを書いたので、もろもろ間違いなどあるかもしれません。
何かあったら光速で突っ込んで頂きたいです。

 
で、早速DSLを使用したネタを考えてみました。
簡単に思いつくのはディスパッチャとかでしょうか。
かなり荒いアイディアですので、いろいろ考察が浅い点あると思いますがご容赦ください。

まずすごくシンプルなディスパッチャを考えてみます。
ユーザーがタスクを投げる、サーバーが受け取ってスレーブに投げる、スレーブは受け取ったタスクを処理して終了をサーバーに知らせる。
大体こんな感じでしょうか。

この場合、ユーザーが投げるタスクには、直接スレーブにわたるコマンドは含まれておらず、ディスパッチャが処理して適切なコマンドに変換します。

となると、ディスパッチャではそれぞれに対応した変換規則をもっていないとダメなわけです。
Mayaなら、AEなら、独自プログラムなら、、、
面倒くせーーー

じゃあたとえばユーザーがPythonのソースを送って、ディスパッチャはそれを処理すればどうだろうか。
でもイチイチPython書くのは面倒すぎる。
じゃあGUIを用意しよう。
でも結局送るコマンドはPythonのままだから、生のPythonじゃなくて、言語内DSLにしよう。
そうすればいったんファイルにだして書き換えたり、好きに手で書いたり出来る。
さらにPythonの機能もほぼ使えるはず。
便利!

ってことにはならんかな?

ただ単にきっちり設計して、API丁寧に揃えて、GUI付けてってやればいいだけなのかもしれないんですけど、他の人がやってることと全く同じこと考えても仕方ないので、可能性の1つとして考えてみました。

プログラムをかじったものなら大小あれどあこがれるオレオレ言語。
DSLならその欲望を少し満たしてくれるかも・・・?

この辺本気でやりたかったら、コンパイラの知識必要だなーと思いました。
ASTとかなんとかかんとか、さっぱりわからん。

PythonはJavaなどと同様に、VMを使用して実行するタイプのスクリプト言語で、一旦バイトコードにコンパイルされてから実行されます。(間違ってたらスマン)
Pythonには構文木にアクセスするためのモジュールがあって、コンパイルされたファイルからバイトコードが復元できるっぽいので、この辺知ってると一気にあれこれやれるようになるのかも?となんか良くわからないながら妄想を抱いています。

夢のみ広がる・・・
夢で終わらせないために現実的なところから意識してやっていく必要がありますねー。

人の命は有限なのだと肝に銘じて。

「DSL?」への6件のフィードバック

  1. いやぁぁぁぁぁ~~~~~~っっっっっっっっっっっっっっ
    > Pythonにマクロ

  2. >> Rubyはマクロを採用しているので、

    Ruby にはマクロは存在しませんよ。
    Matz は Lisp シンパですが、Ruby にマクロを導入することは頑なに否定しています。
    ただし、マクロがなくても、DSL が書きやすいような言語的配慮は行われています。

    ちなみに自分は以前、仕事で Python を使用した DSL を導入を試みたんですが、インデントを強要する構文を受け入れなければならないので、何を書いても Python にしかみえない印象でした。
    これは自分自身が使用する限りにおいては趣味の問題で片づくのですが、他人(Python をしらない人)に使用してもらう場合、不可解なルールを押しつけることにつながるので、ユーザビリティが低いモノでした。
    (ドメインを限定しているのにメタ言語の構文制約が露出して、それがDSLの利用にそぐわない)

  3. >hohehohe2さん
    なんですかそれはwwwwwwwww

    >mynzさん
    >Ruby にはマクロは存在しませんよ。
    あ!間違えた!!そうでした!!
    メタプログラミングと間違えた!!!
    ご指摘ありがとうございました。

    >PythonでDSL
    経験者!!さすがです。
    インデント構文など、Pythonらしさを受け入れたDSLしか作れないのは、Pythonの思想なのかなとも思いますが、用途によっては不適切ですよね、、

    もはやScheme使うしか・・・!!
    なわけないですかね。失礼しました。

  4. >たとえば足し算を全く別の計算に置き換えたりとか、そういう感じです。

    C++とかpythonで独自オブジェクトを定義するときできるよね。
    チュートリアルやった時、何に使うのソレ?と思ったけど
    先週から使い始めた。いやー便利だわコレ。

    たぶんそういう話ではないですね、すみません。

  5. 俺定義は自分が使う分には便利なんですが人が使ったの見るのは(特に変な使い方してると)拷問ですからねー。

    昔汚いソースコード引き継いで大変だったんで読みにくくなる可能性がある言語仕様にはアレルギーがあります。C言語で何の関連性もない変数をなぜか配列で確保してて、関数内でローカルにしか使ってないのに外部で定義して引数ポインタ渡ししてて、しかも6個しか要素確保してないのに7個使っててバグになってたと言う・・・。Python好きはその頃の苦い記憶のせいかもしれません。
    演算子のオーバーライドは大抵便利ですがメソッドの動的書き換えは危なっかしいんでどうかなーとも思います。ただ「何もかも動的」っていう思想はそれはそれで便利なんでトレードオフでしょうか(安全性考えるならJava使えって話だし)。
    メタプログラミングは読みにくくなるんであまり使わないですねー。「便利」と思って使って後で後悔して作り直したり。ただ人のコードを読めるようにはなってないといけないんで知識としては必要だと思います。

  6. >hajimeさん
    演算子のオーバーロードですかね。
    便利ですよね!ベクトルの足し算オーバーロードとか!
    いまいちまだ使いこなせてませんが。。

    >hohehohe2さん
    >俺定義
    そうですね、、僕は関数名が大文字スタートってだけでもイライラしてしまうタイプなので、、

    >汚くなる言語仕様
    なるほど、hohehohe2さんのPython愛が垣間見えましたw
    たしかにPythonはその他の言語に比べて、どこまでいってもかなり綺麗にまとまりますね。
    Cとかはどこまでもいける分その人に依りますしね、、
    過去のバグの事例はものすごいですね、、でも普通にありそうでもあるので怖いです。。

    >メタプログラミング
    やっぱり読みにくくはなりますよね、、
    僕は具体的に使用出来るケースとか威力とかまだあまりわかってないので、いらん憧れを持ってしまっていますwww
    でもやはりシンプルイズベストの思想は忘れないべきかなと!自戒として!!
    知識としては、ってことなので、引き続き勉強はしておこうと思います。

     
    うーん、みなさん結構おれおれ言語またはおれおれルールには否定的ですね。でもやっぱりメリットないことには百害あって一利なしですしね。

    参考になります!ウス!

コメントを残す

メールアドレスが公開されることはありません。