ランタイムシステムとは
ランタイムシステムは、コンピュータプログラムの実行モデルを実装するもので、プログラムが動作する期間であるランタイムフェーズとは異なります。多くの
プログラミング言語に存在し、その言語の規定された動作順序を制御します。近年、「ランタイムシステム」という用語は広がり、実行時に動的に決定されるほぼすべての動作を指すようになりました。
概要
すべての
プログラミング言語は実行モデルを持ち、多くの場合、その一部はランタイムシステムによって実装されます。プログラムの直接的な動作以外のすべてがランタイムシステムの動作であると定義することもできます。この定義では、関数呼び出し前のパラメーターのスタック配置、ディスクI/O、並列実行などがランタイムシステムに含まれます。
コンパイル言語、インタープリター言語、組み込み
ドメイン固有言語など、基本的にすべての言語にランタイムシステムが存在します。並列処理API(Pthreadsなど)も、実行モデルを実装するランタイムシステムの一例です。
学術論文では、並列ランタイムシステムの実装に焦点を当てたものが多く、Cilkのランタイムシステムや、proto-runtimeツールキットなどが研究されています。
ランタイムシステムは、実行モデルの実装に加えて、型検査、
デバッグ、コード生成、最適化などのサポートサービスを提供することもあります。
ランタイム環境との関係
ランタイムシステムは、実行中のプログラムがランタイム環境(RTE)と対話するための窓口です。ランタイム環境には、プログラムの実行中にアクセスできるステート値だけでなく、ディスクドライブやキーボードなど、プログラムが対話できるアクティブなエンティティも含まれます。
例えば、環境変数はランタイム環境の一部であり、プログラムはランタイムシステムを通じてアクセスできます。DVDドライブのようなハードウェアも、プログラムがランタイムシステムを通じて対話できるアクティブエンティティです。
特定の用途では、OS全体がRTE内で実行されることがあります。これにより、高いセキュリティとシンプルなミッション専用システムが実現できますが、RTEが破損するとOS全体が停止し、再起動が必要になります。
例
C言語のランタイムシステムは、コンパイラーが実行可能イメージに挿入する特定の命令セットであり、プロセッサーのスタック管理、局所変数領域の作成、関数呼び出しパラメーターのスタックへのコピーなどを担当します。どの言語動作をランタイムシステムの一部と見なすかは明確な基準がない場合もありますが、Cのスタック動作は、その体系的な性質からランタイムシステムの一部と見なされます。
また、ランタイムシステムとの対話にはAPIを使用することがあります。このAPI呼び出しは通常の
ライブラリ呼び出しのように見えますが、実行モデルが変化します。ランタイムシステムは、
ライブラリ記述時に意図された言語の実行モデルとは異なる実行モデルを実装します。POSIXスレッドなどのAPIを介した並列実行も、ランタイムシステムによって実装される外部の実行モデルの一例です。
高度な機能
一部の言語では、ランタイムシステムと直接対話するためのインターフェースが提供されます。例えば、
JavaのThreadクラスはスレッドの開始や停止を可能にします。ただし、タスク
スケジューリングやリソース管理など、言語の核となる部分は通常アクセスできません。
ランタイムシステムによって実装される高レベルな動作には、画面へのテキスト描画やインターネット接続などがあります。これらはOSによって提供される場合もあり、その場合、ランタイムシステムはOS呼び出しを翻訳する抽象化レイヤーとして機能します。
さらに、ランタイムシステムは、
Pコードマシンや仮想マシンといった、プロセッサーの命令セットを隠蔽するサービスを提供することもあります。これにより、言語の実装と移植が容易になり、リフレクションなどの高度な言語機能の効率が向上します。また、再コンパイルせずにプログラムを異なるマシンで実行することも可能になります。
実行を高速化するために、ランタイムシステムは
機械語への実行時コンパイルを実装することもあります。
極端な例では、物理CPU自体を特定のアセンブリ言語のランタイムシステムの実装と見なすことができます。この考え方では、実行モデルはCPUシステムとメモリシステムによって実装されます。つまり、高級言語のシステム自体が別の言語で実装され、階層的な構造を形成します。
現代のランタイムシステムは、Pthreadsのミューテックスや
OpenMPの並列セクションなど、並列実行の動作も提供します。これらの並列実行の動作は、proto-runtime手法に従ってモジュール化されることがあります。
歴史
初期のランタイムシステムとしては、
BASICやLispのインタープリターが挙げられます。これらにはガベージコレクターも含まれていました。Forthは
中間言語コードにコンパイルする初期の例であり、仮想マシンとして機能しました。理論的な例としては、
ドナルド・クヌースのMIXコンピューターがあります。
動的メモリ確保をサポートするCなどの言語では、メモリプールを管理する
ライブラリもランタイムシステムに含まれていました。オブジェクト指向言語では、ランタイムシステムが動的型検査とメソッド参照の解決も行うことが多くなりました。
まとめ
ランタイムシステムは、コンピュータプログラムの実行において不可欠な要素であり、言語の動作モデルを実装し、実行時の動作を制御します。コンパイル言語からインタープリター言語まで、幅広い
プログラミング言語に存在し、その機能は多岐にわたります。プログラムの効率性と柔軟性を向上させる上で、重要な役割を果たしています。