近未来的プログラミング(1)

D言語のテンプレート機構は、明示的なインスタンス化が必要になる代わりに、C++には出来ないようなことまで出来る。それば事実なのだが、それがいいか悪いかは別問題である。思えばJavaC#にもGenericsが導入され、いよいよ本格的に足並みをそろえた感もある。

また、やねうらおも通常はC++でテンプレートを用いてかなり複雑なメタプログラミングを行なうこともある。しかしだ。やればやるほど、こういう方向性は根本的に誤っているのではないかという疑念をいだくようになった。

それぞれの言語がそれぞれの方法でテンプレートをサポートしたり、それぞれ異なる仕様のプリプロセッサを持っていたりするのは非常にばかげていると思う。現実問題として、C++のソースをC#、あるいはJavaに移植しないといけないことがある。この逆をしないといけないこともある。そういったときに、言語に依存する機能ほど移植を難解にするものはない。

その言語を使う限りは気持ちよくプログラミングできるのかも知れないが、そんなプログラムを移植させられる者はたまったもんではない。最近、それを特に感じる。

結局何が悪いかというと、Genericsやらメタプログラミングやら、プリプロセッサやら何やらかんやら。そういったものは、言語間で共通するサードパーティ製のツールで実現するべきであって、決して、言語仕様そのものを改定すべき問題ではなかったと思うのだ。たとえばmix-inにしても、AspectJ/C#/Cppを用いることで比較的すんなり実現できる。言語そのものにmix-inを取り入れて、それをその言語のアドバンテージかのように言うのは、もういい加減やめにしないか?DbyC(design by contract:表明つきプログラム)にせよ、何にせよだ。

結局何が必要かというと、もっと汎用的なテンプレートやDbyCを実現するための、Aspectほにゃららをも包括するようなツールと、そういったツールを受容する言語側の仕組みなのだ。決して、必要なのはGenericsでも何でもない。その言語にしかないような言語固有の機能なんてメリットでも何でもないのだ。いい加減、みんな早く目を醒ませ!

.NETによってどの言語でもライブラリを対等に呼び出せるようになったが、次にこの仕組みにより、どの言語も等しいgeneric programming、DbyC、mix-in、delegate、inner function、lambda、property etc..に関する機能を享受することが出来るようになるわけだ。CでもC#でも同一のステージに立つことが出来るようになる。言語間の差異は極限まで縮まる。まずは、そこまで思考を推し進めよう。続きは次回だ。