D言語の記事
なんだかどうでも良い文章が長くなった。…が、こっちが本編である。
(こっちもどうでもいいけど)
時に上の記事より2週間ほど後、…というか一昨日、再度本屋に行った。
今回はCマガジンを買いに行ったのであるが。
そこでまた信じられないものを見た。なんとCマガジンが売切れかかっていた。
具体的には残り1冊になっていた。これまでこんなことは一度も無かったのに、
一体全体どういうことなのだろうか。みんなDirectX9.0SDK Updateが欲しいのか?
それはさておき。
かれこれCマガを読み始めて6年になるのだが、
どうにも最近は読むところがないなぁと思いつつ
惰性で購読していたりしていたのだが、
先月号をしっかり読み返してみるとなんだか結構読み応えがあった
ように思った。最近特集ぐらいしかまともに読んでいなかったからだろうか。
というわけで、色々思うところが出てきたりしたのだが、
今月号にD言語の記事が載っていた。
D言語は最初に聞いたとき、
「またおんなじ様な言語つくりやがって。
なに?GC付きのネイティブコンパイラ?
Ocamlでも使っときなちゃい!」
とか思ったとか思わんかったとか、そういう印象だったのだが、
記事を読んでみてもそういう印象かもしれない。
結局良くも悪くも字面も中身もC系の方言ですな…。
つまるところ、C#、Javaでは何がいけなくて、
そのいけないところを如何にD言語が解決してくれるのかが
さっぱり分からなかった。
想像だが、主にパフォーマンス方面の要求によるもの…だろうか?
まぁ、それは置いておくとして。
記事中に言語の機能比較表なるものが有ったのだが、
どうも、それを読んでいると突っ込みどころがワラワラと…。
そういうわけで、色々と突っ込んでみることにする。
お断りしておくが、私はScheme的設計概念の様なものを全面的に信仰しており、
さらにHaskell倒錯者であるので、そのような価値観を持った人間が
書いているということをあらかじめ考慮して頂きたい。
・特徴
いきなりだが…とくに言うことは無いか。
- 関数デリゲート
これは、thisポインタを部分適用した関数じゃないのだろうか…?
あえて一つの機能として書くほどでもないと思われるのだが。
- 出力関数パラメータ
これはなんでしょう?ちょっと分からず。
- 関数のネスト
D,C/C++,C#,Javaの中でDのみが出来るのか。
GCCに限るとCでも出来るといえるが、
まぁ、このあたりをちゃんと実装しているのは評価できる。
- 関数リテラル
これも分からず。λ式のことか?
- 動的クロージャ
動的???静的なクロージャってなんじゃい。
とりあえずこれが実装してあるのであればデリゲートは
要らないと思うのだがどうだろう。
・配列
- ライトウェイト配列
これも分からず…。Unboxedな配列のこと…?
- リサイズ配列
D言語のみがサポートということであるが…。
正直これは言語がサポートする意味がさっぱり分からない。
具体的にどういうメリットがあるのだろうか。
- ビット配列
これもしかり。
パフォーマンス的要因?それにしても言語がサポートしなくてもどうにでもなるはず。
- 組み込み文字列
DとC#とJavaがサポート…。
これも組み込みである必要性がどこにあるのか分からない。
例えばC++のstringとJavaのStringで使用感が違うだろうか。
- 配列のスライス
Perlとかには疎いのでよく分からなかったりするのだが、
そんなに必要なものには思えない…。
- 配列境界越えチェック
つまり配列が単なるメモリの塊とは違うということですな。
これも言語でサポートする意味が全く分からない。
- 強いtypedef
強いというのは…?
Haskellでいうところのnewtypeを持っているということだろうか。
- 文字列でのswitch
なんで文字列?もっと一般的に任意のオブジェクトにすりゃいいんじゃないの?
配列のエイリアス…?
何を意味するのか分からんです。
・オブジェクト指向プログラミング
Cのみxとなっている。
確かにCではつらいですな。
- 多重継承
C++のみ○。
私はまだ多重継承に悩まされた経験は無い…。
無くて困ったことも無いかもしれない。
- インタフェイス
C++が○になっているのは純粋仮想関数のみからなるクラスのことだろうか。
既存の演算子だけじゃなくて、演算子の定義ぐらい出来て欲しいところ。
- モジュール
特に言うことは無いか…。
- 動的クラスロード
C#とJavaだけ○になっている。
C++でもDLL使ってインターフェースへのポインタを返す関数などを実装すれば
出来るような気もする。
- クラスのネスト
まぁ、普通はできるよね…。
Cがxになっているのはそもそもクラスが無いから?
- 内部クラス
内部クラスとクラスのネストは何が違うんだ?
- covariantの返り値タイプ
分からん…。
- プロパティ
DとC#がサポートか。
まぁ、単純に便利だとは思うけど…。
・パフォーマンス
Dはインラインアセンブラが使えると。
D言語は結構直接的なアセンブリコードにコンパイルされるのだろうか。
- ハードウェア制御
これは何を意味するのだろうか…。
Windows環境下ならDeviceIOControl()さえ呼び出せれば何とか成るんで無いの?
- ライトウェイトオブジェクト
Java以外。これも何を意味するのか分からない…。
C#にあってJavaに無いといえば、
C#のstructに相当するものだろうか。
- 明示的なメモリ操作
なんともかんとも。
どっかからもらってきたメモリに書き込めるということ?
- VMへの非依存性
こんな項目を作るのはオカシイのではないか?
VMも含めて処理系だろう。
- ネイティブコード生成
D言語の目的の一つだろうか。
Javaがxとなっているがgcjにより部分的には可能だろう。
・ジェネリックプログラミング
- テンプレート
テンプレート…もちょっと抽象的な表現だとは思うけど…。
具体的な呼び出しに対応してコードを多重に生成するようなC++で言うところの
テンプレートだろうか。
JavaとかC#のGenericへの対応を見ている限りではそのようなことを
行うのに必ずしもコードを多重に生成する必要は無いようだが…。
その場合若干制約が生じたはず。
まぁ、そのような機能だとするとC#とJavaがxになっているのは
どうかと思う。まだ正式にリリースされていのだったかな…。
- mixin
Dのみのサポートか。
この辺はあまり勉強していないので正直よく分からないのだが、
AspectJがやっているようなことだろうか。
そういうわけなので、コメントは差し控え…。
- typeof
クラスのメタオブジェクトが取得できるということ?
DとC#がが○になっているけど、Javaはこういうことできなかったっけ?
- foreach
構文が一個増えたところでなんともカンとも…。
HaskellとかSchemeだとforeach自体を定義できる能力すら有するわけで。
- 制約
ジェネリックプログラミングの制約…?Dのみの機能ということだが、
何のことなのかは分からない…。
・信頼性
初めて他に無さそうな機能が…。これは評価します。
言語に組み込む必要が果たしてあるのだろうか。
テストコードを実装の近くに書くことが出来のが嬉しいか。
- 静的コンストラクトオーダ
静的オブジェクトの構築順を指定できるということかな?
確かにC++とかだと制御不能だけど、そもそも静的オブジェクトの
構築順を考慮しなければならないような状態が望ましくないと思う。
- 保障された初期化オブジェクト
C/C++以外はサポート。
関数型言語畑のものにとってはどうでもいいです…。
- RAII(自動デストラクタ)
知らない単語が良く出てくるなぁ…。
自動変数のスコープとともにデストラクタを起動するということか。
回収のタイミングの違いだけとも言えるけど、
ヒープ以外のリソースを使いたいときは無いと不便かもしらんなぁ。
- 例外処理
まぁ、もう普通は出来ますやろ。
- try-catch-finallyブロック
こんなのは出来ないほうが欠陥なわけで。
- スレッド同期プリミティブ
スレッドの同期を簡単に行える構文が用意されているかどうか…かな?
確かにセマフォとかを使って頑張るのはめんどくさいけど。
・互換性
- C言語スタイル
全部○…てCの方言5つ並べてこんなことを書かれてもなぁ…。
- 列挙型
Java以外。CとC#とでは微妙に扱いが違うような気もするけど。
- C言語の型
DとC…って、DがCの型を使えるようにしただけやん…。
- 80ビット浮動小数点
DとC。Cは環境依存だと思うけど。
これもDとC。複素数と虚数ってどう違うのか分からん。
Cって複素数を組み込みで持ってたっけ?
- C言語コードへの直接アクセス。
DとC/C++。C/C++は当然としても…。
cdecl呼び出し規約をサポートするという意味なのかなぁ。
- 既存デバッガの利用
DとC/C++。既存デバッガってなんだ。
- 構造体メンバのアライメント
Dのみ。C/C++も出来たような気がするんだけど…。
まぁ、できなくともマーシャリング出来ればそれでいいような気もする。
その必要の無いのがメリットといえばそうなのかもしれない。
- 標準オブジェクトファイル生成
DとC/C++。これもわざわざ項目書く意味がよく分からん…。
既存のリンカに渡せるってこと?
- マクロによるプリプロセッサ
C/C++のみ。
全く違う文法のものが混じると気持ち悪いということか?
・その他
- 条件コンパイル
Java以外。
プリプロセスで出来ることより、これだけ拝借した模様。
全部○…。こんなの処理系次第じゃないのか?
………
ふう、終わった。
なんだかだらだらと書いてしまったが、
色々と調べても分からないところもあった。
そういうわけで、この表をD言語を知らない人に見せてどうなのか、
という気もする。
最後に個人的な意見を述べさせてもらうと、
配列周りの機能がかなり充実しているが、
(スクリプト言語系を参考にしたのであろうか)
そのあたりがむしろ私の理想とは離れているように感じた。
(言語自体はシンプルなほうが望ましい…とか思っている)
C/C++の延長型言語のようにも感じられるが、
なかなかアグレッシブに流行の機能を取り込んでいるようだ。
まぁ、思ったよりも筋の良い言語なのかも知れないが、
どうにもこうにも目新しさが感じられない。
記事中に契約プログラミングとかの紹介があれば
また印象も変わったかもしれないが…。