D at 20 Hits and Missesを議論する

本記事では、Walter Bright氏が D言語の良かった点・悪かった点を振り返った D at 20 Hits and Misses を参照しながら、プログラム言語のあるべき姿について、プログラマー視点で語ります。
D at 20 Hits and Misses は Walter Bright氏自身のプレゼンも Youtube で公開されています。
D言語開発の経緯とその発展については、こちらのブログ記事(日本語)が詳しいです。

20 Hits and Misses とあるけど、数えてみると20より全然多いんだよね(笑)。
我々は普段は C++ 使いで、D言語に関しては完全に門外漢なので、話せそうな内容をピックアップしてきましょう。

よろしく。



早速、最初の項目は「No Preprocessor」

これは、プリプロセッサが無いことが良いということですか?

そう言ってるね。
実際、プリプロセッサって無い言語の方が多いんだよね。Java でも、新しい Go や Rust や Swift でも。

言われてみるとそうですね。普段 C++ を使っているので、意識しませんでした。

C++ もマクロを減らそうとする意図があるよね。inline関数とかテンプレートとか。ただし、#include や #ifdef とかは代替え手段がないから、使うしかないよね。
かなり後ろの方に「Modules」という項目があるんだけど、これはD言語が行った、#includeからの脱却だよね。



続く2つの項目は「Unicode all the way」「Miss: Agnostically Supporting UTF-16 and UCS-2」
現在なら UTF-8 一択だね。

D言語が登場したのは2001年なんですね。この頃にはまだ UTF-8 一択とはしにくかったかも。でも、振り返ると後悔してしまいそうですね。



続いて「2's Complement Arithmetic」
これは C言語の回でも触れたけど、C言語が2の補数を前提としていないのは、現実的にはマイナスの作用しかないんだよね。

1の補数って教科書でしか見たことないです。符号付き整数の加算回路をどうするんだ、という話ですよね。

私も2の補数しか見たことない。
が、驚くべきことに、Youtubeのプレゼンを見ると、1の補数を見たことある人が会場に何人かいるんだよね。

一体どんな環境だったんでしょうね。

想像つかないね。

自作したPCとかかもしれないですね。



続いて「Miss: bit Data Type」
これは C++ の std::vector<bool> でも同じことが起こってしまったよね。1つのサイズに複数の値を入れれるようにすると、ポインタを取れなくなるんで、面倒なことばっかり起こるんだよね。

std::vector<bool> の場合、std::vector<bool> だけ他の std::vector<T> と動作が変わってしまうという点もマイナスで、完全な失敗作ですね。



だいぶ飛ばして、次は「Strings are Arrays」

これは、文字列型が無いのが良い、ということですか?

そう言っているね。

私は文字列型がある方が便利でいいと思います。strcat() ではなく +演算子で連結したいです。

まあ、次の項目に「Miss: Then We Botched It」とあるし、文字列というのは一筋縄では行かないよね。



次は続けて2項目「Built In Unittests」「Built In Documentation Generation」

ビルトインで提供されていると、プログラマー間のブレが少なくなるし、いいですよね。やっぱり標準が一番ですから。

Documentation Generation は誰が作っても機能として大差なさそうだけど、Unittest はセンスが出るよね。つまり、xUnit系のような仰々しいユニットテストだと、使わない人が出てくると思う。
D言語の Unittest のスペックを見る限り、極めてシンプル・軽量そうで、これならD言語を書く人はもれなく使うような、センスのある Unittest じゃないかな。



続いて「Pure Functions」

これはいいですね!

C++のメンバ関数のconstのようなものだね。

副作用なしというのは、宣言する価値が大いにありです。
もう一押し言うと、デフォルトが pure で修飾子なしで、pure でない時に修飾子が必要な方がいいですね。副作用無しを推奨する意味で、記述量も少なくて済むようにすべきです。

おぉ、Rust方式。

Rust は非constの時は mut が必要ですが、あれは変数が対象ですからね。pure関数という言語仕様は非常に優れていると思います。



これで最後にしましょう。「Miss: Contracts」
Contractって何だ?

「契約プログラミング」のようです。Wikipediaには、D言語をはじめ3言語が紹介されていますね。
でも、Miss ということは失敗だと振り返っているわけですよね。何が失敗だったのでしょう。

正直良くわからないけど、D言語の契約の仕組みと、手書きでassertを書いたものと、それほど差がないというのが失敗と判断した理由じゃないかな。言語仕様としてそこまでサポートしなくてもよかった、という。

0 件のコメント:

コメントを投稿