三つの刀

C++ と C# と VB の三つでコードを書いてみて思ったのは、VB が最も高級な言語であるということです。それは特に「静的変数」を示すキーワードに現れています。次に、三つの言語で value という Int32 型の静的変数を宣言する一例を示します。

// in C++
static int value = 0;

// in C#
static int value = 0;

' in VB
Shared value As Integer = 0

そもそも何が「静的」なのかというと、変数の格納領域が静的に確保されるということです。通常、変数のための領域はスタック上に確保され、関数を呼び出した時に確保、関数から戻るときに解放されます。一方、静的変数は( thread-static は例外として)プロセスの生成時に確保、プロセスの終了時に解放されます。

変数の寿命という観点からすると、確かに static というキーワードは的を得ています。しかしプログラマの立場から見るとどうでしょうか。例えばあるクラスのメンバ関数の内部における static 変数については、どのインスタンスからそのメンバ関数を呼び出しても同じ変数にアクセスすることから、全てのインスタンスで「共有」している変数であると考えることができます。つまり、「変数のための領域が static である」と考える C++, C# よりも、「変数が全てのインスタンスで Shared である」という概念を持つ VB が、より高級な言語であると言えると思います。


私は以前 VB5.0 を使用していたのですが、今の .NET 2003 は大幅に改良されたと思います。それまでは、オブジェクト指向だといっても C++ のそれとはほど遠い仕様だったし、構造化についても、特に実行時エラーの処理が昔の BASIC のままで不完全でした。また、何よりプログラムの不具合や外部ライブラリのエラーによって開発環境そのものが異常終了するのには、不満を通り越してあきれてしまいました。現行バージョンではこれらの問題が全て解決し、とても快適です。.NET Framework を利用すれば、VC++ で設計したクラスをそのまま VB でも利用できるし、WindowsAPI を呼び出さなくても(呼び出すこともできますが)豊富なラッパー クラスがあるし、解りやすく開発しやすい真の RAD ツールになりました。互換性の問題がない限り、いまさら以前の VB を購入する理由はないでしょう。開発チームの、既存コードとの互換性を捨ててでも、プラットフォームの機能を制約なく利用するために一から構築しなおすという方針は、大正解だったと思います。

一方で VC++ については、.NET に対応したコードを生成できるという以外に、あまり進化していません。しかもその「対応」というのが、従来の C++ との互換性を考慮した「マネージ拡張」と呼ばれるものであり、結果として C++ のコードと .NET のコードが混在することになり、複雑化してしまいました。純粋に C/C++ や MFC の機能だけを利用したコードを書くとか、ほとんどが COM や WindowsAPI のラッパーであるとか、タイムクリティカルな処理をするといった場合に使用すると効果的ですが、.NET Framewwork を利用した普通のデスクトップ アプリケーションを書くには向いていません。VB か VC# を使ったほうが簡単です。

VC# の使い道については、VB の機能に加えて「部分的なアンマネージ コードの実行」「 Standard Edition の開発環境におけるライブラリの作成」が可能なので、それらが必要な場合に利用するとよいでしょう。それが必要ない場合は、やはり VB のほうが高速にプログラムを開発できるのでお勧めです。VC++ のプログラマにとってはどちらがよいかは微妙なところです。VC# は文法が似ていますが、似ているということは「紛らわしい」とも言えるので、いっそのことぜんぜん違う VB を使うほうが良いかもしれません。

最後に、.NET Framework SDK をダウンロードすればコンパイラ等のツールが無料で使用できるので、とりあえず実験してみたい方はダウンロードするのも手かと思います。こちらの VB コンパイラはライブラリを作成可能です。