公開:

CLR(Common Language Runtime)とは?意味をわかりやすく簡単に解説

text: XEXEQ編集部


CLR(Common Language Runtime)とは

CLRとはCommon Language Runtimeの略称であり、.NET Frameworkの中核をなすランタイム環境のことを指します。CLRは.NETアプリケーションの実行に必要な各種サービスを提供し、メモリ管理やセキュリティ、例外処理などを担っています。

CLRは.NETアプリケーションのコードを実行する際に、中間言語であるMicrosoft Intermediate Language(MSIL)にコンパイルされたコードを、実行時にネイティブコードに変換します。このJITコンパイルと呼ばれる仕組みにより、異なるプラットフォームでも同じコードを実行できるクロスプラットフォーム性を実現しています。

CLRが提供するガベージコレクションは使用されなくなったメモリを自動的に解放する機能です。この機能により、開発者はメモリ管理の負担から解放され、効率的なアプリケーション開発が可能になります。

CLRのセキュリティ機能はアプリケーションの信頼性を高めるために重要な役割を果たしています。コード アクセス セキュリティ(CAS)と呼ばれる仕組みにより、信頼されたコードにのみ特定の操作を許可することで、システムの安全性を確保しています。

CLRは異なるプログラミング言語で記述されたコードの相互運用性を促進します。共通型システム(CTS)と呼ばれる仕組みにより、C#、VB.NET、F#など、.NET対応言語で記述されたコードを同一のアプリケーション内で利用できます。

CLRによるメモリ管理の仕組み

CLRによるメモリ管理の仕組みに関して、以下3つを簡単に解説していきます。

  • ガベージコレクションによるメモリの自動解放
  • マネージヒープとスタックの役割
  • ジェネレーションによるオブジェクトの管理

ガベージコレクションによるメモリの自動解放

CLRのガベージコレクションは使用されなくなったオブジェクトが占有するメモリを自動的に解放する仕組みです。この機能により、開発者はメモリ管理の煩雑な作業から解放され、効率的なアプリケーション開発が可能になります。

ガベージコレクションは定期的にメモリ内のオブジェクトを調査し、参照されなくなったオブジェクトを特定します。そして、それらのオブジェクトが占有していたメモリを解放し、再利用可能な状態にします。

ガベージコレクションのタイミングはCLRが自動的に判断します。メモリ不足などの状況に応じて、適切なタイミングでガベージコレクションが実行されるため、開発者が明示的に呼び出す必要はありません。

マネージヒープとスタックの役割

CLRにおけるメモリ管理ではマネージヒープとスタックという2つの領域が重要な役割を果たします。マネージヒープは動的に割り当てられたオブジェクトが格納される領域であり、ガベージコレクションの対象となります。

一方、スタックはメソッドの呼び出しに伴う一時的な変数や引数が格納される領域です。スタックに格納されたデータはメソッドの終了とともに自動的に解放されるため、ガベージコレクションの対象にはなりません。

マネージヒープに格納されたオブジェクトは参照型変数を通じてアクセスされます。参照型変数自体はスタック上に格納され、オブジェクトへのメモリアドレスを保持しています。

ジェネレーションによるオブジェクトの管理

CLRのガベージコレクションではオブジェクトをジェネレーション(世代)に分類して管理します。ジェネレーションはオブジェクトの生存期間に基づいて割り当てられ、0から2まで3つのジェネレーションが存在します。

新しく作成されたオブジェクトはジェネレーション0に割り当てられます。ガベージコレクションが実行されると、ジェネレーション0のオブジェクトが調査され、生存しているオブジェクトはジェネレーション1に昇格します。

同様に、ジェネレーション1のオブジェクトは次のガベージコレクションでジェネレーション2に昇格します。ジェネレーション2は長期間生存するオブジェクトが格納される領域であり、ガベージコレクションの頻度が低くなります。

CLRによるセキュリティ機能

CLRによるセキュリティ機能に関して、以下3つを簡単に解説していきます。

  • コードアクセスセキュリティ(CAS)の仕組み
  • 証明書に基づくコードの信頼
  • セキュリティ権限の制御

コードアクセスセキュリティ(CAS)の仕組み

コードアクセスセキュリティ(CAS)はCLRが提供するセキュリティモデルの一つです。CASはコードの信頼性に基づいて、特定の操作に対するアクセス許可を制御する仕組みです。

CASではコードの信頼レベルに応じて、セキュリティ権限のセットが割り当てられます。信頼レベルはコードの発行元や配置場所などの情報に基づいて決定され、信頼されたコードには高い権限が、信頼されないコードには低い権限が与えられます。

コードが特定の操作を実行しようとすると、CLRはコードの権限を検証します。必要な権限がコードに割り当てられている場合、操作は許可されますが、権限が不足している場合はセキュリティ例外が発生します。

証明書に基づくコードの信頼

CLRのセキュリティモデルではデジタル証明書を使用してコードの信頼性を確立することができます。証明書はコードの発行元の身元を証明し、コードが改ざんされていないことを保証します。

証明書は信頼された認証局によって発行され、コードに署名されます。CLRはコードの実行前に証明書を検証し、証明書が信頼できる認証局によって発行されたものであることを確認します。

証明書に基づくコードの信頼により、信頼できるコードには高い権限が付与され、安全な実行環境が確保されます。一方、信頼されない証明書を持つコードや署名されていないコードは制限された権限で実行されます。

セキュリティ権限の制御

CLRのセキュリティモデルではセキュリティ権限を細かく制御することができます。セキュリティ権限はファイルシステムへのアクセス、ネットワーク通信、レジストリの操作など、様々な操作に対して設定されます。

開発者はコードに必要な最小限の権限を宣言的に指定することができます。これにより、コードが必要以上の権限を持つことを防ぎ、セキュリティリスクを軽減できます。

また、管理者はセキュリティポリシーを通じてセキュリティ権限を集中管理することができます。セキュリティポリシーはマシンレベル、ユーザーレベル、アプリケーションレベルで設定され、権限の継承や上書きが可能です。

CLRによる言語の相互運用性

CLRによる言語の相互運用性に関して、以下3つを簡単に解説していきます。

  • 共通型システム(CTS)の役割
  • 共通言語仕様(CLS)の概要
  • 言語間でのコードの呼び出しと継承

共通型システム(CTS)の役割

共通型システム(CTS)はCLRが提供する型システムであり、異なるプログラミング言語間での型の互換性を確保する役割を果たします。CTSはすべての.NET対応言語で共通して使用される型のセットを定義しています。

CTSには整数型、浮動小数点型、ブール型、文字列型、オブジェクト型など、基本的なデータ型が含まれます。また、クラス、インターフェース、委任、列挙型など、オブジェクト指向プログラミングに必要な型も定義されています。

CTSにより、異なる言語で記述されたコードが同じ型システムを使用することができ、言語間の相互運用性が実現されます。つまり、ある言語で定義された型を、別の言語で seamlessly に使用することが可能になります。

共通言語仕様(CLS)の概要

共通言語仕様(CLS)は.NET対応言語がサポートすべき機能のサブセットを定義した仕様です。CLSは言語間の相互運用性を確保するために、言語に依存しない共通の規則を定めています。

CLSはデータ型、名前付け規則、メソッドのシグネチャ、例外処理など、言語に依存しない要素を規定しています。.NET対応言語はCLSに準拠することで、他の言語との相互運用性を保証します。

CLSに準拠したコードはCLS準拠と呼ばれます。CLS準拠のコードは他のCLS準拠の言語から呼び出すことができ、言語の境界を越えた再利用が可能になります。

言語間でのコードの呼び出しと継承

CLRの言語の相互運用性により、異なる言語で記述されたコードを呼び出したり、継承したりすることができます。つまり、ある言語で定義されたクラスやメソッドを、別の言語から直接利用できます。

たとえば、C#で記述されたクラスを、VB.NETから継承してサブクラスを作成することができます。また、F#で定義された関数を、C#から呼び出すことも可能です。

言語間でのコードの呼び出しや継承はCTSとCLSによって実現されます。共通の型システムと言語仕様により、言語の境界を越えてコードを共有し、再利用することができます。

参考サイト

  1. Microsoft. https://www.microsoft.com/ja-jp
「コンピュータ」に関するコラム一覧「コンピュータ」に関するニュース一覧
ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。