コンピュータプログラミングにおいて、ランタイムシステム、または単にランタイムとは、プログラムが作成されるコンピュータと、そのプログラムが実行されるコンピュータの両方に存在するサブシステムのことです。この名称は、コンパイル言語のコンパイル時と実行時の区分に由来しており、同様に、プログラムの作成(コンパイル)とターゲットマシンでの実行(ランタイム)に関わるコンピュータプロセスを区別しています。[ 1 ]ランタイム環境(RTE)は、ランタイムが動作するコンテキストです。
ほとんどのプログラミング言語には、プログラムが実行される環境を提供する何らかのランタイムシステムがあります。この環境は、アプリケーションメモリの管理、プログラムが変数にアクセスする方法、プロシージャ間でパラメータを渡すメカニズム、オペレーティングシステム(OS)とのインターフェースなど、多くの問題に対処する場合があります。コンパイラは、正しいコードを生成するために、特定のランタイムシステムに応じて仮定を行います。通常、ランタイムシステムはスタックとヒープの設定と管理に責任を持ち、ガベージコレクション、スレッド、または言語に組み込まれたその他の動的機能などの機能が含まれる場合があります。 [ 1 ]
すべてのプログラミング言語は実行モデルを規定しており、多くの言語はそのモデルの少なくとも一部をランタイムシステムで実装しています。ランタイムシステムの動作の定義の一つとして、「プログラム自体に直接起因しないあらゆる動作」が挙げられます。この定義には、関数呼び出し前にパラメータをスタックに置くこと、関連する動作の並列実行、ディスクI/Oなどが含まれます。
この定義によれば、コンパイル言語、インタプリタ言語、組み込みドメイン固有言語など、ほぼすべての言語にランタイムシステムが存在する。Pthreads(POSIXスレッド)のようなAPI呼び出し型のスタンドアロン実行モデルでさえ、実行モデルの動作を実装するランタイムシステムを備えている。
ランタイムシステムに関する学術論文のほとんどは、並列ランタイムシステムの実装の詳細に焦点を当てています。並列ランタイムシステムの注目すべき例として、人気のある並列プログラミングモデルであるCilkが挙げられます。 [ 2 ] proto-runtime ツールキットは、並列ランタイムシステムの作成を簡素化するために作成されました。[ 3 ]
実行モデルの動作に加えて、ランタイムシステムは、型チェック、デバッグ、コード生成および最適化などのサポートサービスも実行できます。[ 4 ]
ランタイムシステムは、実行中のプログラムがランタイム環境とやり取りするためのゲートウェイでもあります。ランタイム環境には、アクセス可能な状態値だけでなく、プログラムが実行中にやり取りできるアクティブなエンティティも含まれます。例えば、環境変数は多くのオペレーティングシステムの機能であり、ランタイム環境の一部です。実行中のプログラムは、ランタイムシステムを介して環境変数にアクセスできます。同様に、ディスクやDVDドライブなどのハードウェアデバイスも、プログラムがランタイムシステムを介してやり取りできるアクティブなエンティティです。
ランタイム環境のユニークな用途の一つは、その実行のみを許可するオペレーティングシステム内での使用です。つまり、起動から電源オフまで、OS全体は、そのランタイム環境内で実行されているアプリケーションのみに使用されます。他のコードの実行、またはアプリケーションにおける何らかの障害は、ランタイム環境を破壊します。ランタイム環境が破壊されると、OSも破壊され、すべての処理が停止し、再起動が必要になります。読み取り専用メモリから起動する場合、安全で単一目的のシステムが構築されます。
こうした直接バンドルされたランタイムシステムの例としては、以下のようなものがある。
C言語のランタイムシステムは、コンパイラによって実行可能イメージに挿入される一連の特定の命令群です。これらの命令は、プロセススタックの管理、ローカル変数用の領域の確保、関数呼び出しパラメータのスタック最上位へのコピーなどを行います。
言語の動作のうち、どの動作がランタイムシステム自体の一部であり、どの動作が特定のソースプログラムによって決定されるのかを明確に判断する基準は、多くの場合存在しません。例えば、C言語では、スタックの設定はランタイムシステムの一部です。この動作はグローバルに不変であるため、個々のプログラムのセマンティクスによって決定されるものではありません。つまり、すべての実行において同じ動作が維持されます。このような体系的な動作は、特定のプログラムのセマンティクス(テキストが直接、結果を計算するコードに変換される)を実装するのではなく、言語の実行モデルを実装するものです。
特定のプログラムのセマンティクスと実行環境の分離は、プログラムのコンパイル方法の違いに反映されています。ソースコードをすべての関数を含むオブジェクトファイルにコンパイルする方法と、プログラム全体を実行可能なバイナリにコンパイルする方法です。オブジェクトファイルには、含まれる関数に関連するアセンブリコードのみが含まれますが、実行可能なバイナリには、実行環境を実装する追加のコードが含まれます。オブジェクトファイルには、リンクによって解決される実行環境からの情報が欠落している場合があります。一方で、オブジェクトファイル内のコードは、実行システムにおける前提条件に依存しています。たとえば、関数は、実行環境で使用される呼び出し規約に応じて、特定のレジスタまたはスタック位置からパラメータを読み取る場合があります。
もう一つの例は、アプリケーションプログラミングインターフェース(API)を使用してランタイムシステムとやり取りする場合です。このAPIへの呼び出しは、通常のソフトウェアライブラリへの呼び出しと同じように見えますが、呼び出しの途中で実行モデルが変わります。ランタイムシステムは、ライブラリが記述されている言語とは異なる実行モデルを実装しています。通常のライブラリのコードを読む人は、ライブラリが記述されている言語を知っているだけで、ライブラリの動作を理解できます。しかし、ランタイムシステムを呼び出すAPIのコードを読む人は、呼び出しが記述されている言語を知っているだけでは、API呼び出しの動作を理解できません。ある時点で、何らかのメカニズムによって、実行モデルは呼び出しが記述されている言語のものではなくなり、ランタイムシステムによって実装されている実行モデルに切り替わります。たとえば、トラップ命令は、実行モデルを切り替える方法の1つです。この違いが、PthreadsなどのAPI呼び出し実行モデルを通常のソフトウェアライブラリと区別するものです。 Pthreads呼び出しとソフトウェアライブラリ呼び出しはどちらもAPIを介して呼び出されますが、Pthreadsの動作は呼び出し言語では理解できません。むしろ、Pthreads呼び出しは外部の実行モデルを作動させ、それはPthreadsランタイムシステム(多くの場合、OSカーネル)によって実装されます。
極端な例を挙げると、物理CPU自体を、特定のアセンブリ言語のランタイムシステムの実装と見なすことができます。この見方では、実行モデルは物理CPUとメモリシステムによって実装されます。同様に、高水準言語のランタイムシステム自体も、他の言語を用いて実装されています。これにより、ランタイムシステムの階層構造が形成され、CPU自体(あるいは実際にはマイクロコード層以下のロジック)が最下位レベルのランタイムシステムとして機能します。
コンパイル型言語やインタプリタ型言語の中には、アプリケーションコードがランタイムシステムと直接やり取りできるインターフェースを提供するものがあります。Java言語Threadの`start`クラスはその一例です。`start`クラスを使うと、(1つのスレッドによって実行される)コードが他のスレッドの開始や停止などの処理を実行できます。通常、タスクスケジューリングやリソース管理といった言語のコアとなる動作は、このような方法ではアクセスできません。
ランタイムシステムによって実装される高レベルの動作には、画面へのテキスト描画やインターネット接続の確立といったタスクが含まれる場合があります。多くの場合、オペレーティングシステムもこれらの動作を提供しており、利用可能な場合は、ランタイムシステムは、ランタイムシステムの呼び出しをオペレーティングシステムの呼び出しに変換する抽象化レイヤーとして実装されます。これにより、異なるオペレーティングシステムが提供するサービスの複雑さや差異が隠蔽されます。これはまた、OSカーネル自体をランタイムシステムと見なすことができ、OSの動作を呼び出す一連のOS呼び出しをランタイムシステムとの相互作用と見なすことができることを意味します。
究極的には、ランタイムシステムは、プロセッサの命令セットさえも隠蔽するPコードマシンや仮想マシンなどのサービスを提供する可能性がある。これは、 AWKなどの多くのインタプリタ型言語や、Javaなどの一部の言語で採用されているアプローチであり、これらの言語は、マシンに依存しない中間表現コード(バイトコードなど)にコンパイルされることを前提としている。この構成により、言語の実装と異なるマシンへの適応が簡素化され、リフレクティブプログラミングなどの高度な言語機能の効率が向上する。また、明示的な再コンパイル手順なしに、同じプログラムをどのマシンでも実行できる。これは、ワールドワイドウェブの普及以来、非常に重要な機能となっている。実行速度を向上させるために、一部のランタイムシステムは、マシンコードへのジャストインタイムコンパイル機能を備えている。
ランタイムシステムの現代的な側面の一つに、並列実行動作があります。例えば、Pthreadsのミューテックス構造やOpenMPの並列セクション構造などが挙げられます。このような並列実行動作を備えたランタイムシステムは、プロトランタイムのアプローチに従ってモジュール化することができます。
ランタイムシステムの初期の注目すべき例としては、 BASICとLispのインタプリタが挙げられます。これらの環境にはガベージコレクタも含まれていました。Forth は、中間表現コードにコンパイルされるように設計された言語の初期の例であり、そのランタイムシステムは、そのコードを解釈する仮想マシンでした。理論上の例ではありますが、ドナルド・クヌースのMIXコンピュータもよく知られています。
C言語や、動的メモリ割り当てをサポートするそれ以降の言語では、ランタイムシステムにプログラムのメモリプールを管理するライブラリも含まれていました。
オブジェクト指向プログラミング言語では、ランタイムシステムが動的な型チェックやメソッド参照の解決も担当することが多かった。
コンパイラは、対象マシン上でこれらの抽象化をサポートするために、オペレーティングシステムやその他のシステムソフトウェアと連携する必要があります。
[…]
SpeedStart
により、ソフトウェアが使いやすくなります。CP/M アプリケーション ライブラリのすべてのソフトウェアには、新しい SpeedStart バージョンの
CP/M
オペレーティング システムが搭載されており、プログラム ディスクに直接組み込まれています。これらのアプリケーションを使用するには、ディスクを
IBM PC
に挿入し、システムを起動するだけで準備完了です。これにより、別のオペレーティング システムをインストールしたり、ディスクを交換したり、アプリケーション プログラムを起動したりする必要がなくなります。 CP/MアプリケーションライブラリのSpeedStartソフトウェアには、以下の機能も備わっています。[…] CP/Mのランタイムバージョンを無料で提供します。[…] 新しいアプリケーションプログラムを毎回インストールする必要がなくなります。[…]
Digital Research社
の強力な16ビットオペレーティングシステムである
CP/M-86
と、最先端のマルチタスク対応
Concurrent CP/M
オペレーティングシステムとの互換性を提供します。[…]
[…]
Dr. Logoは1983年秋に
IBM PC
向けに初めて市販され、
Softsel Hot List
のトップに躍り出た
。市販版には、
システムの電源を入れると
自動的に起動する
CP
/M
の短縮版である
SpeedStart CP/Mが含まれていた。[…]
[…]
SpeedStart
のご紹介- 独自のロード アンド ゴー ソフトウェア システム。CP/M アプリケーション ライブラリは、業界最高の有名ブランドの
IBM PCソフトウェアを提供するだけではありません。当社の各
アプリケーションは、独自の SpeedStart シングル ディスク システムによる比類のない利便性を提供します。SpeedStart は、強力な
CP/M-86
オペレーティング システムの特別バージョンで、当社の各ソフトウェア ディスクに組み込まれています。作業の準備ができたら、ディスクをロードして IBM PC の電源を入れるだけで、すぐに作業を開始できます。SpeedStart は、別のオペレーティング ディスクをロードしてソフトウェアを「インストール」するという時間のかかる作業を不要にします。実際、SpeedStartシステムは、現在入手可能などのソフトウェアよりも迅速かつ容易に作業を進めることができます。しかも、追加料金は一切かかりません。さらに、SpeedStartをバイパスすることで、将来のIBM PCオペレーティングシステムである、画期的なマルチタスク対応の
Concurrent CP/M
上でソフトウェアを実行することも可能です。[…]
[…]
Artline 2オペレーティングシステムは
GEM/4
になりました[…] GEM/4 へのすべての変更は
、Ventura Publisher
との互換性を維持するために
Lee Lorenzen
と
Don Heiskell
と協力して行われました
。 […]
{{cite book}}:|work=無視されました (ヘルプ){{cite book}}:|work=無視されました (ヘルプ){{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)