ソフトウェアが動作する基盤をネットワーク上に設定し、インターネットを含むアプリケーションを様々な環境から利用することを考えた。これを.NET構想と呼ぶ。.NETとはソフトウェアが動作するためのソフトウェアの開発環境、通信規約を含む壮大な技術体系を指す。
.NET Frameworkは.NET対応アプリケーションが動作するための基盤である。
.NETではプログラミング言語の仕様を統一するためのCLSおよび、データ型を統一するためのCTSがある。これによりVBで作られたメソッドをC#で動かすなどが可能となる。
ADO.NETはデータベースへのアクセスを実現するためのクラスライブラリ
ASP.NETはWebアプリケーションやコンポーネントを含むクラスライブラリで構成されている。
.NET Framework対応の開発言語では、基本クラスライブラリが用意されており、クラスとして管理されている。各クラスは名前空間で管理されている。
.NET FrameworkはクラスライブラリとCLRで構成されている。
CLRはJITコンパイラ、ガベージコレクタ、クラスローダで構成されている。
CLRが必要な理由は、.NET Frameworkが目指す「プラットフォームに依存しないアプリケーション実行環境を構築」を実現するため。.NET Framework対応のプログラムはILに変換され、CLRがILをコンパイルし、マシンコードに再度コンパイルする。CPUやOSのプラットフォームを考慮しなくてよくなる。またCLRはCPUに合わせた最適なネイティブコードを生成する。
ランタイムとはアプリケーションを実行するために必要となるソフトウェアを指す。Windowsの場合はDLLで提供される。
JITコンパイラはコードを一行ずつ読んで実行するインタプリタとは異なり、必要なタイミングで都度コンパイルする。またコンパイルされたネイティブコードを再利用することも可能であり、処理速度が向上する。
クラスローダはライブラリ内のクラスを呼び出すのに使う。
ガベージコレクタは不要なメモリ領域を開放する。メモリリークを防ぐ。
プログラムが実行されると、スタック領域に値型、ヒープ領域に参照型のデータが保存される。ヒープ領域のデータは参照されるため、削除するタイミングが難しい。そこでCLRはメモリリークが発生していないかを随時確認し、起きていればガベージコレクタがよばれる。ガベージコレクタはヒープ上を占有しているデータをチェックして、参照しているプログラムがないか確認し、どこからも確認されていなければメモリ上から削除する。
CLRにおけるプログラム実行手順
MSIL形式の実行ファイルを起動すると、プログラムで使用されているクラスの情報がクラスローダによってメモリにロードされる。
JITコンパイラによって中間コードでるILがネイティブコードに変換される。
プログラムが実行される。
usingは任意の名前空間に属するクラスをクラス名だけで呼び出し可能にする。
namespaceは名前空間を宣言する。
staticはインスタンスを作成しなくてもメソッドを呼び出し可能にする。インスタンスとはクラスを実行時にメモリに転送されたデータを指す。必要なデータをメモリに転送することをインスタンス化という。共通するデータはstaticにする事でメモリ節約になる。
[STAThread]はSystem名前空間に属するSTAThreadAttributeクラスのことをさす。[]は属性を指定する。属性はクラスやメソッドに対して付加的な情報を与えることができる。ここではシングルスレッドであることを宣言している。
プロセスはOSから見た処理の実行単位、スレッドはプロセスの中に生成されるプログラムの実行単位
CTSは共通のデータ型を利用する仕組みをいう。VB,C#,C++では同じ型を使ってプログラムを行っている。
CTSに基づいて設計されている
値型と参照型に大別される。全てのデータ型がクラスによって定義される。System.Objectにデータ型を定義する全てのクラスが属する。従って、データ型を定義する全てのクラスはSystem名前空間に属するObjectクラスを継承して作成されていることが何となく想像出来る。.NET Frameworkの全てのクラスはSystem.Objectを継承している。System.Objectは全てのクラスのスーパークラスとなる。
文字列などの可変長のデータやサイズの大きいデータでなければ、値型の方が効率的。
ヒープ領域は参照型、スタック領域は値型、サブルーチンはどちらでもない領域に保持されている。
メモリ内では下位アドレスから順にスタティック領域、ヒープ領域、スタック領域とが取られる。
スタティック領域は下位アドレスから格納、スタック領域は上位アドレスから格納される。
単純なデータ構造は値方を使う。効率的なメモリ管理がヒープでは行われるが、参照型のデータ検索には単純なスタックよりも時間がかかり、コスト(メモリ開放など)もかかる。
複雑なデータ構造を持つデータをスタックにおくと、スタックが膨れ上がるため、データ検索に時間がかかる。参照型ではコピーなども参照先を変えるだけで良いため、処理が簡潔かつ軽量。
複雑なデータを持つ場合はクラス、簡潔なデータを持つ場合は構造体がよいと思われる。クラスの場合はクラス方の変数が指し示している情報(クラスがインスタンス化されているメモリアドレス)をコピーすればよいため、処理速