.NET Frameworkの周辺(1)

.NET Frameworkの体系

《 初回公開:2019/10/05 , 最終更新:未 》

いまさらながら.NET Frameworkの中をうわっつらだけ少しかじってみる。
不確かな情報を雑にポチっと

あいまいな理解で。

【 目次 】

.NET Frameworkの体系

  • .NET Framework の概要 | Microsoft Docs
  • .NET Framework - Wikipedia

    .NET Frameworkにおける最も重要な概念は共通言語基盤 (CLI) に含まれている。
    CLIの目的は言語に依存しない開発環境および実行環境を提供することである。
    マイクロソフトによるCLIの実装は共通言語ランタイム (CLR) と呼ばれる。CLRは次の主要な5項目からなる。

  • 共通型システム (CTS: Common Type System)

  • 共通言語仕様 (CLS: Common Language Specification)
  • 共通中間言語 (CIL: Common Intermediate Language)
  • ジャストインタイムコンパイラ (JIT: Just-in-time compiler)
  • 仮想実行システム (VES: Virtual Execution System)

他にも気になるキーワードが

  • アセンブリ
  • メタデータ
  • アプリケーションドメイン

  • 基本クラスライブラリ (BCL)

参考Webサイト

参考書籍

  • プログラミング.NET Framework(初版) Jeffrey Richter

.NETの用語

.NETは意味不明な用語が多すぎ。
やたらと聞き覚えのない用語が出てきて、なんじゃこりゃ

共通言語基盤(CLI: Common Language Infrastructure)

  • 共通言語基盤 - Wikipedia

    共通言語基盤(きょうつうげんごきばん、英語: Common Language Infrastructure、略称 : CLI)は、.NET Frameworkの基幹を構成する実行コードや実行環境などについてマイクロソフトが策定した仕様である。
    仕様は、ECMA-335 および ISO/IEC 23271 として標準化され公開されている。
    CLIは、プログラミング言語やコンピュータ・アーキテクチャに依存しない環境を定義しており、様々な高水準言語で書いたソースコードが書き直すことなく他のプラットフォームでも使える。

概念

  • 共通型システム (CTS) — プログラミング言語間で共通して用いられる型の集合
  • メタデータ — プログラムの構造に関する情報。プログラミング言語上やツールなどから参照できる
  • 共通言語仕様 (CLS) — 相互運用性のためのプログラミング言語に対する規定
  • 仮想実行システム (VES) — CLIに適合したプログラムの読込と実行。メタデータを活用して動的に機械語を生成する

実装

  • Microsoft .NET Framework - マイクロソフトのデスクトップ向けの商用実装。様々なリソース、ライブラリ、ツールも含まれている。
  • シェアードソース共通言語基盤 - マイクロソフトによるリファレンス実装。シェアードソースのライセンスの元で利用できる。
  • .NET Compact Framework - マイクロソフトによるポータブルデバイス向けの商用実装。
  • Mono - オープンソースの実装として知られている。
  • Portable.NET - dotGNUプロジェクトの一環。こちらもオープンソースの実装である。
  • PlayStation Suite - ソニー・コンピュータエンタテインメントによる多機種共通環境を目指した実装。ECMA-335カスタム仕様[1]。

  • 『.NET フレームワーク』を徹底解説!!その特徴からできることまで、分かりやすくご紹介します。 ? Geekly Media

共通言語ランタイム(CLR: Common Language Runtime)

.NET Framework clr

  • 共通言語ランタイム - Wikipedia

    共通言語ランタイム (英: Common Language Runtime, CLR) とは、.NET Frameworkアプリケーションを実行するための仮想機械で、共通言語基盤 (CLI) のマイクロソフト自身による実装。

  • 共通言語ランタイム (CLR) の概要 - .NET Framework | Microsoft Docs

    .NET Framework には、共通言語ランタイムと呼ばれるランタイム環境が用意されています。
    共通言語ランタイムは、コードを実行し、開発プロセスを支援するサービスを提供します。

CLRは仮想マシーン?

共通型システム(CTS: Common Type System)

CTS Common Type System 共通型システム

  • 共通型システム - Wikipedia

    共通型システム(きょうつうかたしすてむ、英語: Common Type System、略称 : CTS)は、マイクロソフトが開発した.NET Framework対応のプログラミング言語で使われるデータ型の統一、もしくは統一された型のこと。
    ...
    .NET Frameworkに属する全ての言語は、2種類の言語仕様に則っていなければならない。1つがCTSであり、もう一つが共通言語仕様 (CLS) である。
    CTSとCLSによって、.NET Framework対応のプログラミング言語間で型の互換性が維持できる。
    CLSの一例を挙げると、クラスを定義できること、さらにクラス間の継承ができること、つまり、オブジェクト指向言語でなければならないことを定めている。

  • 共通型システム | Microsoft Docs

    共通型システム (CTS: Common Type System) は、共通言語ランタイムにおける型の宣言、使用、および管理の方法を定義しており、ランタイムによる言語間統合のサポートにおいても重要な役割を果たします。

  • 共通型システムと共通言語仕様 | Microsoft Docs

    CLS は CTS のサブセットです。
    つまり、CLS により厳しい規則がない限り、CTS のすべての規則は CLS にも適用されます。

  • C#で.NET Frameworkを使用するときのstring型とString型の違い - Qiita

共通言語仕様(CLS: Common Language Specification)

.NET Framework cls


共通型システムと共通言語仕様にのっとる事により、.NET Frameworkの言語は相互に共有利用が可能になると言える。

.NETの言語

  • C#
  • VB.NET
  • F#

  • .NET のツアー | Microsoft Docs

    Microsoft が開発とサポートに力を注いでいる .NET 言語は、C#、F#、Visual Basic (VB) の 3 つです。

基本クラスライブラリBCL(Base Class Library)とFCL(Framework Class Library)

.NET Framework fcl

  • 基本クラスライブラリ - Wikipedia

    基本クラスライブラリ(Base Class Library、通称BCL)は全てのCLI言語から利用可能な共通言語基盤 (CLI) 標準ライブラリである。
    ボーランドとマイクロソフトが1999年6月8日に結んだ特許契約の成果物で、Visual Component Libraryから派生したライブラリとなっている。
    ...
    BCLはときどきFramework Class Library (FCL) として間違って言及されることがあるが、これは、実際はマイクロソフト固有の名前空間を含むスーパーセットである。

VCLから派生、 やはりボーランドとアンダーソンヘジルスバークは偉大なり。

  • c# 一覧 BCL(基本クラス ライブラリ) と FCL(フレームワーク クラス ライブラリ) : 初心者入門サンプル

    完璧なガイドではありませんが、一般的な規則として、Systemで始まる名前空間はBCLの一部です。
    BCL以外にも、Microsoftが.NET Frameworkと共に提供するクラスはもっとたくさんあります。 一般に、これらの追加機能は、データベースアクセスやグラフィカルユーザーインターフェイス(WindowsフォームやWPF)などの幅広い機能領域をカバーします。 この全コレクション(BCLを含む)は、Framework Class Library(FCL)と呼ばれます。

CIL 共通中間言語

.NET Framework cil
CILはMSILとか単にILとか呼ばれることもある。

  • 共通中間言語 - Wikipedia

    共通中間言語(きょうつうちゅうかんげんご、英語: Common Intermediate Language、略称 : CIL("sil" や "kil" と発音される))は、共通言語基盤 (Common Language Infrastructure、CLI) で定義された最も低水準な人間が解読可能なプログラミング言語であり、.NET FrameworkやMonoにより使用される。CLI互換な実行環境をターゲットとしている言語はCILにコンパイルされる。
    そのCILはバイトコードスタイルフォーマットであるオブジェクトコードにより組み立てられている。
    CILはオブジェクト指向なアセンブリ言語であり、完全なスタックベースである。
    そのバイトコードはネイティブコードに翻訳されるか、仮想機械により実行される。
    .NET言語がベータリリースである間、CILはMicrosoft Intermediate Language (MSIL) と呼ばれていた。
    C#およびCLIの標準化により、現在ではバイトコードは公式にCILと呼ばれる。[1]

  • .NETの中間言語 | C#たんっ!

    一般的にいうと、マシン語(アセンブリ言語)は、実行環境でできることそのままな、低級言語です(ここでいう高低は、ハードウェアに近いか(低)、遠いか(高)を表します)。
    しかし、ILの場合は、そもそも.NETの仮想マシンがかなり高級です。
    なので、ILも、下手するとC言語のようなネイティブ言語よりもよっぽど高級です。

  • 心を決めて IL をやる #1 - maxfie1d のブログ

    C#などの.NETの言語はコンパイルされるとILに変換され、 実行時に実際のマシン語命令に変換されます。
    なので、通常開発者がILを意識する必要はないのですが .NETを深く理解したい勇気ある開発者はILも(ある程度)理解しているものです。

  • 【C#】CILの算術演算命令 - 滅入るんるん

.NET Frameworkの実行プロセス

  • 共通中間言語 - Wikipedia
    1. ソースコードはCILに変換される。CILは、CLIにとってはCPUに対するアセンブリと等価なものである。
    2. さらに、CILはいわゆるバイトコードの形に組み立てられ、アセンブリが生成される。
    3. CLIアセンブリの実行中、ネイティブコードを生成するためランタイムのJITコンパイラにコードが渡される。このステップを省き事前コンパイルも利用できるが、実行可能ファイルの移植性が犠牲となる。
    4. ネイティブコードがコンピュータのプロセッサで実行される。
  • IL の概要 - IL(.NET Framework の中間言語) | ++C++; // 未確認飛行 C

    C#をはじめとする、.NET対応言語は、.NETの仮想マシンが直接解釈できるILマシン語にコンパイルされます。アプリやライブラリは、このILの状態で配布します。
    一般的な(仮想マシンか実CPUか問わず)実行環境と同様に、ILには、マシン語と1対1に対応していて、ある程度人間でも読めるような言語(アセンブリ言語)が定義されています。
    ILは、.NET Frameworkの仮想マシンによって、都度、ネイティブ コード(実CPUが直接解釈できるマシン語)にコンパイルしながら(Just-In-Time方式のコンパイル、略してJIT)実行されます。

ILはオブジェクト指向プログラミングに適した機械語
ILはCPUに依存しない
仮想マシン(CLR)により実行される
実行時にCLRがCILをCPUネイティブの命令に変換する
ILを直接実行できるCPUが開発されれば変換なしにネイティブに実行できるはず。
ILはアプリケーションの堅牢性を提供する。
CLRはネイティブコードに変換時にコードの検証を行い安全性の確認をおこなう。

マネージコードとアンマネージ

マネージコード - CILは安全で堅牢

  • マネージコード - Wikipedia

    マネージコード (managed code) とは、.NET Frameworkにおける共通言語基盤 (CLI) に準拠した仮想機械上で実行される命令(コード)のことである。
    これに対してマネージコード以外のコードはアンマネージコード (unmanaged code) やネイティブコード (native code) と呼ばれる。
    ...
    マネージコードのプログラムは通常C#やVB.NETといった人間が読み書きしやすい言語で書かれ、共通中間言語 (CIL) にコンパイルされる。
    コードが実行される際、CILは仮想実行システム (VES) で実行環境(プロセッサアーキテクチャ)に依存した機械語にコンパイルされる。このコンパイルはマネージ実行環境のコンパイラによってなされるので、マネージ実行環境はコードが何をしようとしているのかを完全に知ることができる。

  • マネージド コードとは | Microsoft Docs

    ごく簡単に言うと、マネージド コードとは、その実行がランタイムによって管理されるコードです。
    この場合、問題のランタイムは、実装 (Mono または .NET Framework または .NET Core) に関係なく、共通言語ランタイムまたは CLR と呼ばれます。
    CLR は、マネージド コードの取得、そのマシン コードへのコンパイルと実行を担当します。
    それに加えて、ランタイムは、自動メモリ管理、セキュリティ境界、タイプ セーフなどのいくつかの重要なサービスも提供します。

  • .net oracleconnection 「管理」と「アンマネージ」の違い : 初心者入門サンプル

    マネージコード
    マネージドコードは、Visual Basic .NETおよびC#コンパイラが作成するものです。
    これは、とりわけ、ガベージコレクション、実行時の型チェック、参照チェックなどのサービスを提供するCLR(共通言語ランタイム)上で動作します。
    だから、「私のコードはCLRによって管理されている」と考えてください。
    Visual BasicとC#はマネージコードしか生成できません。
    したがって、これらの言語のいずれかでアプリケーションを作成する場合、CLRによって管理されるアプリケーションを作成しています。
    Visual C ++ .NETでアプリケーションを作成する場合は、必要に応じてマネージコードを生成できますが、オプションです。
    アンマネージドコード
    アンマネージコードはマシンコードに直接コンパイルされます。
    つまり、その定義では、従来のC / C ++コンパイラでコンパイルされたコードはすべて「アンマネージドコード」です。
    また、中間言語ではなく機械コードにコンパイルするので、移植性がありません。
    空きメモリ管理やCLRが提供するその他のものはありません。

  • .net ? “マネージド”と “アンマネージド”の違い - コードログ
  • 3つの視点でネイティブと.NETの適材適所を考察 - @IT
  • インサイド .NET Framework [改訂版]第1回 マネージ・コード/アセンブリ/モジュール(1/5) - @IT

LIのコードはマネージコードとも呼ばれる。
これは、共通言語ランタイムCLRにより管理(マネージメント)される事により安全(safe)なコードとして実行できるという事。
これに対し、従来の.NET以前の言語では本来の(ネイティブな)そのマシーンに組み込まれているCPUに依存したマシンコードに直接コンパイルされ実行されるのでスピードは速いが管理されていない(アンマネージな)コードとなる。
Javaの場合も同じような仮想環境で実行されるたマネージコードとみる事もできる。

アンマネージ(ネイティブ)

そのため、マネージコードでない本来のCPUのマシンコードにコンパイルされ実行されるものをアンマネージコードとかネイティブコードと呼ばれる。

safeとunsafe

LIはCLRによって管理されて実行されるので安全なコードとなる。
しかし、C#はUnsafeなコードも実行可能。

ソースコードをコンパイル

C#のコンパイル

c# コンパイラ csc.exe

csc.exe srcfile.vb

c# exe pdb ビルド ファイル

Visual Studio を使って C# アプリケーションをビルドすると、実行可能ファイル (.exe ファイル) の他に、 .pdb というファイルが作成されている。
これtって、何?

デバッグ用のファイルという事か。
ちなみに、ネイティブコンパイラーのようなobj,libファイルは作成されない。

VB.NETのコンパイル

vbc.exe

vbc.exe srcfile.vb

C#を逆コンパイル

ILSpy

コンパイラーはILコードとメタデータをマネージモジュールの中に出力する
メタデータとはモジュールの中にどのような型やメンバーなどが定義されているのかを記述したテーブル

JustDecompile

ILをアセンブル

ILコードをilasm.exeでアセンブル(機械語に変換)
ildasmツールで逆アセンブル

ILツール

Ilasm

Ildasm

ジャストインタイムコンパイラ (JIT: Just-in-time compiler)

JITはILをCPUネイティブな命令に変換する。
exeやdllには中間コードILの機械語が格納されていて、
実行時にCLRによって中間コードからネイティブコードに変換され実行される。

.NET Framework JIT

JITとAOT

JITの対比でAOTというのがあって、普通のネイティブコードコンパイラの事を言うみたい。
.NETでも最近はネイティブコードにコンパイルされるようになってきているみたい。

NGENというネイティブコードにコンパイルするツールもある。
また.NET Nativeという、直接ネイティブコードコードに変換する仕組みに変わってきているようである。

ページのトップへ戻る