ASP.NET と C#.NET の違い
どうも、shin'nosuke さんです。
shin'nosuke Online のほうの アクセスログを表示するページのURLが長いので、覚える気もなくって、そのブックマークが入ったパソコンをしばらく立ち上げていなかったのですが、最近やっとネットワークに参加させて、久しぶりに、コンピューティングティップスのアクセスログを見てみたら、
先月のページアクセスの1位が、僅差であぷせとねでぶが、不動の1位だったASP.NETで印刷したいひとに勝っていて、おや、あぷせとねでぶ人気あるなあと思っていたら、3位が、昨年の今頃からずっとほったらかしになっているASP.NET と C#.NET は何が違うのかが、それらの半分くらいのページビューをもらっていて、ああこりゃいかん、ちゃんと書き上げなくては、と思いました。もうわけもわからず、ASP.NET をやっていて、書いているのは、C# 言語だけど、ASP.NET って結局なんやねん、というひとのために、ちゃんと書こうかと、直近の提案書もひと段落したので、あと残ってるプログラムのめどがついたらちゃんと書き上げます。(いつになるやら)そのために、Word で 8ページくらいになっている書きかけ文章(HTMLにすらなっていない)の要約をしときます。
昨年の印象に残った言葉のみなさんにも書いたように、このテーマのきっかけは、営業のねえさんが発した「何がちがうんですか?」発言による。ASP.NET と C#.NET の違いを問うたものだが、一言でいうと言葉が足りないし、全部を理解しようと思うと言葉が大量になる。( Word を開ける)
1.ASP.NET はフレームワークであり、C#.NET は言語である
そもそも、ASP.NET と C#.NET は 両方とも、.NET ってついててわかりにくいが、別の土俵のものである。ようするに、セダンとワゴンの違いではなくって、セダンとカーナビの違いだったり、小籠包と餃子の違いではなくって、小籠包と豚肉のような違いがある。土俵というか、カテゴリーが違う。正しい表現だと、ASP.NET はフレームワークで、C#.NET はプログラミング言語である。わかった。プログラミング言語は何かわかるから、C#.NET のほうはわかった。Fortran と同じようなものだね。じゃあ、ASP.NET はなにか、だいたい、共通チームのひとがよくいっている、フレームワークってなんのことだ。いや、また、依存性を注入する Spring のことか。まだ Winter じゃないか。
2.フレームワークとは1からプログラムを書く手間を省けるようにしたルールと関数の集まりである
きょうびのプログラマーはイベントドリブンモデルについて理解はあるだろう。ボタンをクリックしたときの動作を、イベントハンドラーと呼ばれるサブルーチンとして、あらかじめ記述しておくと、ボタンがクリックされたときに、クリックイベントが発生して、その動作が行われるというものである。
さて。ここで、よく考えてみてほしい。あなたの知っている Fortran にイベントなんてあったか、そもそも、プログラムは上から下に流れているはずなのに、なんで、ユーザーの操作に応じて、任意の場所のコードが実行されるのか。
Visual Basic というツール(.NET じゃないやつ)を例にして、考えてみる。これは、Windows アプリケーションの生産性を飛躍的に向上させたものだったが、何と比べて、生産性が向上したかというと、Windows SDK とよばれる、Cで1から Windows アプリケーションを記述する方法と比べて向上した。これには、C だから当然 main 関数があり、上から下にコードが流れる。ウィンドウをひとつ開くにも大変な量のコードを書く必要があり、ボタンがクリックされたかどうかの判断や、テキストボックスの値の取得にも、少なくないコードを書く必要があったが、あなたが知る限り、Visual Basic では、たったこれらのために、たくさんのコードを書く必要があったか。言わずもがな、書く必要はない。これは、Visual Basic が、SDK で書く必要のあるコードをあらかじめ記述しておいて、新しいルールに基づいて、手間を省いたコードを書けるようにしたからである。(あらかじめ記述されたコードがいわゆるVBランタイムに入っている。) Visual Basic は Windows 用に拡張された BASIC 言語そのもののことも指すが、このような手間を省いたルール=フレームワークを提供したといえる。
ASP.NET は、Visual Basic の考え方を踏襲し、ビジュアルな画面デザイン、イベントドリブン型のプログラミングモデルを実現したフレームワークである。ようするに、Visual Basic でいう、言語を指す部分以外のフレームワークの部分を ASP.NET という、ということである。
3.ASP.NET は しくみの部分で、C#.NET は言語のことを指している
Visual Basic というツールでは、Windows アプリケーションを、Visual Basic フレームワークのうえで、Visual Basic 言語 を書いていたといえる。言語とフレームワークが同じだった。というより、当時は分けるという発想がなくって、SDK の たいへんな量のコーディングを以下に簡単にするかを考えると、BASIC という選択は必然だったろう。
ASP.NET は Web アプリケーションのフレームワークであるが、Visual Studio 20XX というツールでは、Web アプリケーションを、ASP.NET フレームワークのうえで、複数の言語で書けるようになっている。その代表が、C#.NET と Visual Basic .NET (VB.NET) である。なぜ、複数の言語で書けるのか。これには、2000年からの直近の歴史のお勉強をするほうが早い。
4. .NET は Java の Microsoft 実装である
世界が21世紀になりかけのころ、世界ではたくさんの Windows と Visual Basic による Web アプリケーションが動いていた。しかし、徐々に世界ではインターネットが広まるようになり、アプリケーションも、個々の端末にインストールが必要な Visual Basic アプリケーションではなく、インターネットエクスプローラさえあれば使える、Web アプリケーションが広まっていった。もともと、Java はテキストや画像だけのホームページに、Windows アプリケーションのような操作性を持ち込もうとしたものだったのだが(;アプレットのこと。今はその目的ではほとんど使われていない。)、個々の端末にJava実行環境(JRE とか JDK などという)というプログラムさえインストールされていれば、OS や Webブラウザを問わず、プログラムが動くことを志向した。そして、簡潔なオブジェクト指向・スレッド機能(プログラムを同時にいくつも動かすこと)・ネットワーク機能を言語仕様としてサポートした新しい言語であった。一方のVisual Basic はどうだったかというと、オブジェクトベースではあったが、完全なオブジェクト指向ではなく、スレッドも使えなく、標準機能でネットワーク機能ももっていなかった。そして、Visual Basic にあるトラブルが少なくなくなっていった。それは「レジストリ・ヘル」といわれるもので、Windows には、レジストリという個々のコンピュータの設定を持っているのだが、Visual Basic で作られたアプリケーションのほとんどは、インストールのたびにレジストリに値を書き込んでいた。ある部品のバージョンが上がるたびに、別の内容がレジストリに書き込まれ、それが繰り返されることで、ソフトウェアのインストール状況によって動くPCと動かないPCが出てきたのである。一方の Java は、JREさえ入っていれば、個々のプログラムのインストールすらいらないのに、こちとら、インストールがいるうえ、動かないこともあるなんて。そんで、Web にも使えないわ、スレッド作れないわ、インターネットのご時勢、ネットワーク機能もないなんて。Windows アプリケーションの高度な動作のしくみは、このレジストリーを介するものがほとんどで、Microsoft は ソフトウェアの動作機構そのものを、大きく刷新する必要に迫られた。そして、リリースされた大きな刷新が、いわゆる「ドットネット」である。
どうなったのかというと、オペレーティングシステムの機能を直接操作するのを極力やめさせ、.NET Framework という実行環境を経由してプログラムを動かすようにした。Visual Basic は オペレーティングシステムを直接操作するものだったから、新しい開発環境と新しい言語を用意した。新しい言語は、簡潔なオブジェクト指向・スレッド機能・ネットワーク機能を言語仕様としてサポートした言語となった。ようするに、Windows の新しい動作機構は、Java の考え方が採用されたといえ、それを記述するための言語も必然的に似たようなものとなった。誤解を恐れずに言い切るならば、.NET は Java の Microsoft 実装である。
5.C#.NET は Java 言語によく似ており、VB.NET は C# の文法を BASIC にしたものである
とはいえ、.NET と Java の違いのひとつには、Java は Java 実行環境に Java 言語からしか操作できないのに対して、.NET は .NETFramework に、複数の言語から操作できるようにした点がある。.NET Framework の新しい言語のベースは間違いなく C# で、C# は Java にいくつかの改良を加えたものといえるのだが、これまで、Windows アプリケーションを Visual Basic で作ってきた人たちはたまらない。Visual Basic 言語はどこへいってしまうのか、C# を覚えろというのか、というこれまでの経緯に配慮し、オブジェクト指向じゃなかった Visual Basic は、C# の仕様( Java の仕様 ) に合わせられ、ついにオブジェクト指向となった。.NETFramework 上の言語は、.NETFramework の機能に準ずるので、C#.NET と VB.NET は同じことができると考えてよい。(ただ若干の言語仕様の差異はある。)
6.ASP.NET もういちど
.NET という言葉と、ASP.NET と C#.NET と VB.NET と Java の関係を書いてみた。ここまでの説明で不足しているのは、「ASP.NET」にある「.NET」の意味だが、.NETFramework 上で動作する Visual Basic フレームワークライクなWebアプリケーションフレームワークであると理解すればよい。ちなみに、ASP.NET には、.NET がついてない、ASP(Active Server Page) というのもあり、この進化形が ASP.NET であると思ってかまわない。両者の違いは、ASPはHTMLのなかにVBScriptというVisual Basicのサブセットを使ってロジックを書くのに対して、ASP.NETはイベントドリブンで、イベントハンドラにC#やVB.NETが書ける。ASPは.NETFrameworkのうえでは動かない。
7.ほんとうの C# のエンジニア
.NETFramework は Webアプリケーションだけのものではないから、Windows アプリケーションももちろん書ける。だから、Windows アプリケーションしか経験のない C# のエンジニアが、C#だからといって現場に来てみたら、実は ASP.NET だった、というのはとても怖い。さらに、ドットネットドットネットといわれて、ASP.NET の VB.NET のエンジニアが、Windows アプリケーションの C#.NET の現場に来てももっと怖い。ことばの意味はたいせつだ。
とはいえ、今書いたテクノロジーは、Visual Studio 20XX を使うが、フレームワークのベースは Visual Basic であり、言語仕様のベースは Java である。Mid$ → substring とかの言語ごとの馴染みの有無はあるにはあるが、.NET というものは、Windows アプリケーションなら、Visual Basic 経験者で、Java のコーディングが問題ないこと、Web アプリケーションなら、Visual Basic 経験者で、Java による Web アプリケーションの経験がある、もしくは、CGI(Perl) や PHP の経験者ならば、問題なく対応できる。
しかしながら、C# と限定されたときが非常に怖い。Java と C# の仕様はほとんどが共通しているが、Java に あって C# にないことよりも、C# にあって Java にない仕様を理解して、C# を操っているプロフェッショナルというのが、非常に少ないが、いらっしゃる。プログラミング技法や、アルゴリズムの面で、Java より C# を好み、考えてコーディングしている方が、非常に少ないのだが、いるのだなあ。
だから、C# 限定だったことが非常に怖かったところの、なにがちがうのか発言。ふうむ。
東京、大阪、名古屋、地方で仕事のやり方が違うの知ってる?会社の文化にもよるんだけど、10数年この業界にて、感覚が染み付いたなあ。スピードの早さはこの順だけど、それぞれの地域の特色が出ている。東京の仕事のやり方は、関西からみると、少し冷たく見えるが、それは、いくばくかの、割り切りによるものだろう。実際のところ、仕事だから、しょうがないってのもある。このひと東京から来てるなってのはすぐわかる。大阪は東京に比べると、冷たくはない。やりやすい。怒られるけど、でも、神戸、大阪、京都でも少しずつ違う。名古屋は早くない代わりに根比べ。大局を見る。そして地方。地方はね、ふるさとをメンテナンスするように、家族のために早く起き、家族のために働き、家族のために早く帰る。ぼくはこの場所が実家と似ているから何年もいるわけだが、ここで生まれたわけじゃないんだよな。ねえさんは ASP.NET と C#.NET のちがいをこの説明で理解してくれるだろうが、似ているから住んでいるけど、故郷で働くことと故郷に似た場所で働くことの違いも理解してくれるだろうか。これも、ASP.NET と C#.NET のちがいくらいに難しいことだろうなあ。
ごきげんよう。