2005-12-19  Visual Basic6.0処理系の感想

Visual Basic6.0処理系(以下VBと表記)を使い始めて5か月ほどが経過しました。だいたい使えるようになったので感想をお話します。

【注意】実際に使っていたものはExcel VBAです。細かい説明をすると長くなるのでVBA≒VB6.0とお考えください。なおVB.NETは別ものなのであしからず。

VBは遅いか

巷では「VBは遅い」であるとか「VBで出来たソフトは不出来」という評判をよく耳にします。さらには「VBでソフトを作っている人間は無能」という乱暴な意見すら散見されます。確かにVBで作られたフリーソフトや業務用アプリケーションの中には反応が鈍かったり,画面の描画が欠けたりするものが存在します。

私はVBがインタプリタなのと,紛いにもBASICなので「遅くて使い物にならないのでは」と懸念していました。

実際に使ってみると,計算量のオーダーをきちんと意識して設計すれば遅くなりませんでしたし,システムに再描画の機会を適切に与えれば画面がおかしくなることもありませんでした。たとえば大量のレコードを探索するときは,ハッシュテーブルを使って計算量を減らす工夫をすれば実時間で処理が終わります。

いまどきのプロセッサはとんでもなく速いので,インタプリタだからといって支障が出るほど遅いなんてことはないのです。

関数ポインタの代替方法

VBにはポインタがありません。ポインタ型そのものはありませんが,オブジェクトの変数は暗黙で参照型ですし,プリミティブ型をサブルーチンやメソッドの引数に使う場合は値渡しと参照渡しを選ぶことができます。

「うーむ」と考え込んでしまったのは,関数ポインタ(実行コードの位置を指し示す)が使えないことでした。

並び替えのサブルーチンがあったとして,順序を返す関数をどうやって実装するのかちょっと悩みました。ところで関数ポインタが存在しないのはJavaも同じです。

Javaではインターフェイスにコールバックさせるメソッドを定義して,呼び出し元にはインターフェイスを実装したオブジェクトの参照を持たせるのが常套手段です。

VBも同じ発想でコールバックが実現できます。

例外処理

いちばん気になったのは例外処理です。VBにはtry-catch-finally構文が存在しないので,これに替わる手段を使わなければなりません。

try-catchの代替には「On error resume next」とif文による条件分岐を使います。VBにはシングルトンのErrオブジェクトというものがあり,エラーが発生するとErr.number属性にエラー値が代入されます。たとえばサブルーチンを呼び出した直後にif文でErr.numberの値を判定して,0以外であればサブルーチン内でエラーが発生したということになるのです。

私はfinallyの美しい換言案をまだ発見していません。ファイルを開いたときは,処理が成功しようが失敗しようが,途中でサブルーチンから抜けようがとにかく最後にはファイルを閉じたいということがよくあります。そんなときはfinallyの中でファイルを閉じておけば確実なのですが,VBではできないのです。

もちろんファイルを開いた後の処理を別のサブルーチンにしておいて,サブルーチンから抜けたらファイルを閉じる,という構造にすればfinallyの替わりにできそうです。でもこういう書き方は悪文になると思います。