C++/CLI

Cマガの4月号でC++/CLIの特集をやってた。VC.NET以降はVCでも.NETコードをはけるけど、C++/CLIC++の.NET用の機能拡張だというのがいまいち理解できひん。.NET対応するだけなら表面上の構文は関係なくコンパイラの都合だと思うんやけど、なぜに新しい文法が発生するんだろうか。とりあえず追加された言語拡張を眺めてみたところ

ガベージコレクションはものすごくありがたい。実際問題として効率なんて関係ない用途なんてのは山ほどあるわけで、効率を犠牲にするだけで安全性が買えるならうれしい場面とゆーのはあるもんやし。Javaのありがたみの半分くらいはこれやと思う。仮想マシンが残りの半分。まぁそれはえーとして、問題なのはソース上の表記法。ref/valueキーワードをclass宣言の頭につけてgcnewでインスタンスを作るところまではまぁ許せるが、ポインタに代わるハンドル型の宣言に使う演算子が「 ^ 」。これは見にくい。ものすごく醜い。まぁ確かにほとんどの記号が演算子として予約されてるから使えるのは限られてるけどさー。サンプルソースを見た瞬間違和感がものすごくある。じゃあポインタの*はなんだって話になるんやけどさー。見慣れたら気にせんよーなるんかなー。
インターフェイスはもろにJavaのパクリやなー。interfaceだけじゃなく、さらにabstractもキーワードとして追加されるとvirtualとごちゃごちゃになって使い分けできないと思うんやけど。従来までの純粋仮想関数宣言のみ抽象基底クラスじゃなぜいけないのか、まぁ初心者にわかりにくいってのはあるけど今さらinterface追加する必要性はないと思うなぁ。ますますJavaになってまう。そもそも.NET自体が仮想マシンって時点でJavaのパクリといえばそーやねんけど。
イベントはイベントのハンドラとかメッセージマップとかをMFCの芸術的なマクロじゃなくて言語レベルで解決しようってかんじかなー。このへんめんどくてあんまり読んでない(;´ー`)
オーバーライドって今さらキーワード追加する意味がわかんないです。既に言語レベルでわかってることやのに、なんか仮想関数の曖昧な呼び出しを解決するためっぽいけどやたらめったらキーワードを増やすのはどうだろう。
ジェネリクスに至っては完全にtemplateとかぶっちゃってるやんΣ(´□`;.NETで言語に依存しないジェネリクスをサポートせねばならんというのはわかる。しかし、C++には既にtemplateがあるのにそれとは別にジェネリクスを追加するとまったくもって意味わからん。しかもJavaも5.0からgenericsが追加されるのに、C++/CLIがgenericだなんてややこしすぎ。もうどうせなら同じにしてくれ。
.NET対応のためにそこまで新しいキーワードを追加する必要があるんかがまったくもって謎です。インターフェイスとかオーバーライドとかジェネリクスとかはその中間コードを別の言語から利用することを考えるとたしかに統一的なフォーマットにしたいってのはわからんでもないが。そーゆー意味では確かに.NET用の言語拡張が必要な気もせんことはないけどなー、C++の既にある機能とかぶっちゃって何がなんだかわからん。うー。そんなことならC#でやってくれってかんじやわ。言語拡張して改善というよりも改悪やで。まぁM$が勝手にやってるだけやからC++の言語仕様そのものにはまったくもって関係ないんやけど、.NETとゆー流れはWin上でアプリ作るのには無視できひんようにこれからはなってくやろーと思うし。てかそれがM$の戦略やねんけどな。なんかキーワードがいろいろ増えるのは百万歩譲ってよしとしても、あのハンドル宣言演算子「 ^ 」は耐えられない。コンパイラ構文解析の都合上、一番無難やったんがANDなんか知らんけどさー、ソースのあちこちに「 ^ 」が連発するのは気持ち悪い。まったくもって憂鬱やわ...。