コードじぇねれーと4

今回で4回目になるコードじぇねれーとですが、おそらく今回が最後です。次の更新がいつになるか自分でも楽しみです^^

ここで、なぜソース生成を行うのか考えてみます。ソース生成を行うと

  • 生成元ソースと生成後ソースの同期を常に考える必要がある。
  • 生成ソースの更新を手動・もしくは自動でやるための準備が必要になる。
  • ソース生成プログラムを別に書く必要がある。

などのデメリットが出てきます。メリットは言語機能の大幅な拡張が行えることです。というか理由はこれしかないでしょう。本当はやりたく無いのです。それにもかかわらず、言語機能が足り無い・どうしても○○ができない、などどうにもならない理由で行うのです。

一般的にこれは言語の欠陥です。その言語の世界で閉じることができないので、しょうがなく外部ツールを持ち出すのです。よく考えてみてください。日本語ではどうしても表現できない○○があるから、そこだけは英語を使わざるを得ない、という状況を。日本語ではカタカナが使えるのでそんな状況は考えられないかもしれませんが、中国語だとすべて漢字で表す必要があり少しは現実味があるでしょうか。とにかく、かなりださいです。

言語機能が足りてないなら、拡張してもらうようMS*1やSunに働きかければ?という考えもあるかもしれません。しかし、それではだめなんですよ。プログラミング言語自然言語よりよほど単純(というか単純にせざるを得ない)ので、すべての機能を網羅することは実質的に不可能なのです。なので未知の言語の欠陥を埋めようとするなら、言語内に何らかの言語機能拡張機能が必要になるのです。私はそれこそが今まで見てきたソース生成を言語内で行う機能だと思うのです。

マクロは#defineなどで行われる文字列置き換え機能、つまりはソース生成機能です。lispはマクロとS式のおかげでめちゃめちゃな拡張性を得ています。「C++の設計と進化」によると、Bjarne Stroustrup はマクロを言語機能から削除しようとしたができなかったとありますね。マクロに変わる代替機能を提示できなかったためです。最近トレンドの言語では「美しくない」や「危険」という理由で言語機能から削除されているわけですが、マクロが無ければ外部ツールに頼らざるを得ません。本当に正しいのはいったいどちらでしょうね?

*1:MVPな方もいるのでなかなかマイ糞社とは書けなくなったな〜