Visual Basic 中学校 コラム
VB.NET 2002 対応 VB.NET 2003 対応 VB2005 対応

 

Visual Basic 中学校 >

VBに関する4つの大誤解

 

ここ数年VBに対する否定的な誤解が思いのほか通用しているようで、心配になってきましたので個人的によく流布している誤解をまとめて一挙に検証することにします。

この回の要約

・誤解1:VBは初心者用の言語である?!

・誤解2:VBよりC#の方が優れている?!

・誤解3:新しく言語を勉強するならVBは避けた方が良い?!

・誤解4:VBはC#やJavaに駆逐されていずれなくなる?!

・VBの「遺産」部分を肯定的に評価するか、否定的に評価するかがVBについての誤解の根本的な原因である。実際には好みの問題に過ぎず、優劣の問題に転嫁するところから間違いが生じている。

 

1.VBは誤解されている!

 

Visual Basic 中学校ではあまり時事的な内容の記事は書かないようにしていますが、ここ数年Visual Basicに関する誤った見解が多く広がっているように見受けられ、それを正すために今回はこの誤解を解くべく新たに記事を執筆することにしました。

私が問題にしている誤解というものは、どれも反Visual Basic的なものでありVisual Basic 中学校の管理者としてはもはや看過できません。

今回は代表的な4つの誤解を取り上げてそれぞれ説明し、最後には誤解をとりまく根本的な原因について話をまとめます。VB好きなひともアンチVBな人も一度目を通してみて下さい。

 

誤解1:VBは初心者用の言語である?!

 

結論:まったくの誤解であるか、VB自体ではなくVBのプログラマへの批判である。

この誤解は一番多く見かけます。大体の場合、プログラム経験がそれほど豊富でない人ほどこのようなことを言っているようです。ちゃんとした技術者がこのような発言をするところは聞いたことがありません。

とは言え、この誤解はまったく根拠がないものでもなくなかなか根が深いです。

この誤解の根拠となっているものの1つはVBの歴史です。VBの基となった言語であるBASICは確かに教育用の言語として開発され、「BASIC」と言う名前も「基本」という意味です。またBASICは「Beginner's All purpose Symbolic Instruction Code」の略語で、これは直訳すると「初心者用多目的記号命令コード」となります。

ここで「Beginner(初心者)」と言う言葉が入っているところからVBは初心者用であるという誤解が生じるようです。

BASICではプログラム初心者に配慮してわかりすい文法が採用されており、機能や性能を犠牲にして簡単さ、わかりやすさを目指しました。 このような来歴からすると確かに、BASICは初心者用の言語であると言えるでしょう。

しかし、BASICが発展して誕生した現代のVisual Basicではこのような初期の簡単さ、わかりやすさを継承しつつ、高機能・高性能を獲得しています。

※「高機能」には異論はないと思いますが、「高性能」に関しては異論がある方もいらっしゃるでしょう。でも、少なくともC#やJaveとは同程度の性能なのですからこの表現もあながち間違っているとはいえないでしょう。とは言え性能面でC言語(C#ではない)に劣ることは事実です。

したがって今では、「初心者用の言語」ではなく「初心者でも始めやすい言語」と読んだ方が適切です。

このあたりの事情が十分に理解されていないため未だに「初心者用の言語」と呼ばれています。せっかく「初心者でも始めやすい」良い言語なのにこのような誤解が基で敬遠されるようではとてももったいないです。

 

もう1つの原因はもっと奥が深いものです。実は誤解の原因はVB自体にあるのではなくVBのプログラマにあるのです。まったく残念なことではありますがVBのプログラマは他の言語のプログラマに比べて「レベル」が低いようなのです。

そしてVBを誤解している人は実はVBのプログラマに対する批判であるにもかかわらず、VB自体を批判しているつもりになっている場合があるようでなかなか複雑です。

現在のプログラム言語では「オブジェクト指向」が全盛であり、言語をはじめさまざまな環境・情報・リソースがオブジェクト指向の元で最大限の効果を発揮するように構成されています。

ところがVBプログラマの半分くらいはこの「オブジェクト指向」をよく理解しないでプログラムをしてしまっており、ばりばりにオブジェクト指向でプログラムしているC#やJavaなどの他の言語のプログラマと比べるとレベルが低いということになるのです。

どうしてVBのプログラマのレベルが低いのか考えると次の3つの原因があります。

ここに至ってはもはやこれはVBという言語が初心者用であるとか初心者用でないとかいう問題ではなく、プログラマのスタンスや意識付けの問題であることは明らかです。

 

ところで、ではこのような非オブジェクト指向的なプログラマの人々はどうあるべきなのでしょうか?理想的なのはまずオブジェクト指向をちゃんと理解してから自分のプログラミングのスタンスを確立していくことが必要でしょう。どのようなプログラムでも必ずオブジェクト指向を採用すべきだとは考えられていませんが、この話はまた別のテーマになってしまいますので今回は深入りしないことにします。

 

誤解2:VBよりC#の方が優れている?!

 

結論:根拠薄弱である。重箱の隅をつつくような議論に終始し、議論自体に実がない。

これも完全な誤解です。C#の経験が少しあってVBの経験がまったくない人はこのような誤解に陥りがちのようです。VBとC#は機能・性能ともに同じです。両者は兄弟の関係にあるともいえます。

この誤解の根拠となっているのが「C#にできてVBにできないことがある」ということです。確かにC#でできてVBにできないことはあります。でもそれらの機能のゆえにC#の方が優れていると言えるようなものは1つもありません。もっともいくつかうらやましい機能があることは事実ですが、「VBにできてC#にできないこと」もちゃんと存在しているし、このあたりは引き分けと言って良いでしょう。

ちなみにVBにできてC#にできないことで、私が気に入っている機能は次の3つです。

・暗黙の型変換

Optionalによる省略可能引数

On Errorによる非構造化例外処理

逆にこれらの機能をVBのデメリットととらえる人もいます。

C#にできてVBにできないことで、私がうらやましいのはインクリメント演算子(++)と、匿名メソッドです。インクリメント演算子はVBには馴染まないように思いますのであきらめているのですが、匿名メソッドの方は将来のバージョンではサポートして欲しいものです。

このちょっとだけの比較を見てもVBとC#に大差ないことがわかっていただけるのではないでしょうか?VBを使用すべきかC#を使用すべきかを検討するときに材料となるのは機能や性能の差ではなく、単なる好みや過去の遺産を活用するとか、たまたまVBを持っているとか言う要素に過ぎないのです。

 

なお、こういった「○○にできて△△にできないこと」というのは方法論的な話なのであまり意味がないと感じています。特に最近の言語は歴史的な積み重ねがあるのでどれも洗練されて おり、方法的には異なる部分があっても結果としては同じことが実現できる場合が多いです。

この観点でいくと「C#で実現できる結果でVBで実現できない結果はない」と言えますし、逆もそうです。こういったことを云々してVBを遠ざけるような行為自体にまったく意味がないと言ってよいでしょう。

 

誤解3:新しく言語を勉強するならVBは避けた方が良い?!

 

結論:これは好みの問題である。

これはとても悲しい誤解です。VBこそが初心者がもっとも始めやすい言語だと思うのですが…。

この誤解の根拠となっているのが現在主流となっているプログラミング言語の歴史と近縁関係です。この事情を図にまとめてみました。

■図1:プログラム言語の派生関係

この図は主な言語の大体の派生関係を表しています。そして下半分の赤い大きな四角の部分が現在主流となっている言語です。

たとえば、PascalはFORTRANから派生した言語で、さらに発展してTurbo Pascalを生み出したと言うことがこの図には表現されています。この図では純粋な言語の名前と特定の会社の製品名が混ざっていますが一般的な認識に従ったつもりです。

はじめに謝っておきますが、この図は今回の話に関係ありそうな言語を中心にまとめてあるのでこの図には載っていない言語はたくさんあります。特にperlやrubyなどのスクリプト系の言語は結構活躍しているのですが、この図には一切載っていません。また、「現在主流」というのはあくまでも私の周りの話で、COBOLやFORTRANなど現在でも現役の処理系として活躍している非主流の言語はいくつかあります。

さて、図を見ていただくとわかるのですがC言語から派生したファミリーがとても繁栄しています。C言語ファミリー以外で健闘しているのはVBとハトコのDelphiくらいです。

C, C++, Jave, C#は同じ系統の言語だけあって構文が似ています。1つを習得すればもう1つを習得するのに必要な苦労の量が減るかもしれません。こう言った観点から新しく言語を勉強するなら孤立しているVBは避けてC言語系の言語、とくにC#かJavaをやった方が良いという話がでてくるのです。

 

もう1つの理由はここ数年プログラム界で圧倒的な支持を集めている「オブジェクト指向」というアプローチです。JaveやC#はこの「オブジェクト指向」を体現する言語ですが、VBは必ずしもそうではありません。

VBでも本格的なオブジェクト指向を使ったプログラムは可能ですが、オブジェクト指向をあまり意識しないプログラムも可能なのです。

オブジェクト指向プログラマの観点では「オブジェクト指向をあまり意識しないプログラム」をされてしまうと困るわけです。なにごとでも全体が統一されてるときに最大の効果を発揮するからです。ですから、新しく言語を始める人にはびっしりとオブジェクト指向を学んでもらいたいと言う意味も含めてVBはお勧めできないということになるわけです。

 

これらに対する反論は実はありません。このような主張は筋が通っているものと思います。ですが、だからと言って逆の主張に意味がないとも思えません。たとえば、VBは初心者でもプログラムが簡単に組めるようなさまざまな配慮のある言語です。ですから、初心者がプログラム世界を体験するのにはとても優れています。さらに、なれていけば本格的なプログラム、オブジェクト指向プログラムも可能なわけですから、どっぷりVBの世界に浸ると言うのも良い選択肢です。

要はスタンスの問題ですね。クラシック音楽も素晴らしいけれど、ロックにも見るべきものはあると言う話と同じです。

 

誤解4:VBはC#やJavaに駆逐されていずれなくなる?!

 

結論:根拠薄弱である。

将来のことを語っているわけですから「誤解」と決め付けるわけにも行きませんが、随分乱暴な推測と言うことはできます。

この誤解は他の誤解から派生したものと考えることができます。つまり、VBは「初心者向けの言語」で、「C#より劣っていて」、「新しく勉強するならVBは避けたほうが良い」のであるからやがてはなくなっていくだろうというわけです。

確かにこれらの点を誤解している方から見ればVBはいずれなくなると考えるのも無理はないことでしょう。

なお、実際の言語別シェアの統計は不明なのですが、プロのプログラマの方々の話を聞いていると回りではVBばかり使っているという人とC#ばかり使っているという人が結構います。要するにどちらも良く使われているということなのでしょう。

私の交友範囲が.NET関連に限られているのでJavaなどの他の言語の実際のところはわからないのですが、JavaはJavaでまたたくさん使われているようです。

なお、Microsoft Officeに標準搭載されているマクロ言語はVisual Basic for Applications、通称VBAと呼ばれており、この言語は名前からわかるようにVBそのものです。ただし.NET以前の古いタイプのVBです。

マイクロソフトはこのVBAを.NET Framework対応のものに置き換える計画に着手しており、既にExcelやWordなどいくつかのOffice製品ではVBAに代わって.NET以降のVBやC#などでプログラムを行うことが可能になっています。これをVisual Studio Tools for Office(略称VSTO)と呼びます。

また、新しいバージョンのSQL Serverでは従来は特殊なSQL文で行う必要があったストアドプロシージャと呼ばれる種類のプログラムを、やはりVBやC#で行うことができる機能が追加されています。

このようにマイクロソフトはVBやC#など自社の.NET言語の使用範囲を貪欲に拡大して言っており、この状況を考える限りではVBとC#の兄弟は当分はなくなる心配はなさそうです。

他にもVBScriptなどVBが使えるシーンはあります。実際VBを覚えるとこれらの習得がかなり容易になり、現在のところJavaやC#をしのいでVBこそが最も応用範囲が広い言語と言ってもいいでしょう。

  VB C# Java
VBA (Visual Basic for Office)    
VBS (Visual Basic Script)  
Visual Studio Tolls for Office  
SQL Server  

■表1:VBの応用。C#にくらべて歴史がある分応用が広い。

表にまとめるとこのような感じになります。Java欄は参考のためにつけただけなのであまり気にしないでください。Javaにはもっと他に活躍できる場所がありますが私があまり詳しくないのでこの表では省いているだけです。

VB欄ではVB.NET以前のものと以降のものを区別していません。

 

2.まとめ

 

以上で大きな誤解については一通り説明したつもりです。最後に誤解の起因する全体の状況を眺めています。

VBはC#やJavaよりも歴史がある言語で、その歴史性のゆえに「遺産」をもっています。この遺産とは主にVBの非オブジェクト指向的な部分を指しています。

■図2:VBにはJavaやC#と同じようにオブジェクト指向的な部分がちゃんと存在しているが、非オブジェクト指向的な部分もある。

JavaやC#などのように新しい言語では言語全体が統一された思想でよく設計されておりオブジェクト指向に馴染むようになっています。また最近の風潮として静的型指定に馴染む点にも注目して下さい。ここでのはなしでは静的型指定なども「オブジェクト指向的」としてひとくくりにしてしまいます。(※「的」という文字にこめた私の説明を簡単にしたいという気持ちをくみ取ってください。)

一方のVBは.NET化を果たしたVB2002(VB.NET 2002)以降では完全なオブジェクト指向言語となりましたが、過去の「遺産」として非オブジェクト指向的なものを多く抱えています。動的型指定についてもこの「遺産」と言って良いでしょう。ここで言う動的型指定とは遅延バインディングや暗黙の型変換を指しています。

オブジェクト指向的な部分 非オブジェクト指向的な部分 = 「遺産」
Class, Inheirts, Overrides, Implementsなど
Option Strict On
TryCatch
Module
Option Strict Off
On Error

■表2:VBの機能をオブジェクト指向的な部分と「遺産」部分にわける

VBが特殊なのはこの「遺産」部分があるからです。この「遺産」をメリットと考える人々はVBのことをとても好きになります。逆にこの「遺産」をデメリットと考える人はVBをあまり好きになれないかもしれません。特にJavaやC#でプログラムを覚えた人には違和感があることでしょう。

また、このオブジェクト指向的な新しい機能と「遺産」である非オブジェクト思考的な機能を好き勝手にごちゃまぜにして使用するVBのプログラマのスタンスに関しても他の言語のプログラマは違和感を覚えるかもしれません。

ここでま説明すればわかっていただけると思うのですが、要するにこれは好みの問題であって優劣の問題ではないのです。違和感や好みの問題を優劣の問題にすりかえてしまっているところがVBが大きく誤解されている根本的な原因であると私は考えています。

私自身はオブジェクト指向は大好きです。またVBの「遺産」的な部分も大好きです。例外処理はTry 〜 CatchよりもOn Errorを好みますし、Option StrictはOffにするのが好きで、暗黙の型変換はばりばり使っています。

みなさんも自分のプログラミングスタイルに自信を持つと同時に、他のプログラミングスタイルへの理解も大切にしましょう。そのために言語の機能やオブジェクト指向について大いに学んでいきましょう。よく知らないで自分のスタイルだけを主張するのは単なる「頑固」でしかありませんので気をつけてください。