これは非常に基本的な質問ですが、完全に理解したことはありません。最近、.NET CoreとASP.NET 5を研究するときに、このトピックをより完全に理解する必要があると感じました。
記事共通言語ランタイム(CLR)の紹介を読むと、次のテキストが見つかります。
すべてのプログラムは、そのランタイム環境に驚くほど多くの依存関係を持っています。最も明らかに、プログラムは特定のプログラミング言語で書かれていますが、それはプログラマーがプログラムに織り込む多くの仮定の最初のものにすぎません。すべての興味深いプログラムには、マシンの他のリソース(ユーザー入力、ディスクファイル、ネットワーク通信など)とやり取りできるランタイムライブラリが必要です。プログラムは、何らかの方法で(解釈またはコンパイルのいずれかによって)ネイティブハードウェアが直接実行できる形式に変換する必要もあります。
さて、ランタイム環境のこの考え方は非常に基本的であるようですが、.NETで作業するときだけでなく、プログラミング全般を扱うときも非常に重要です。それは理解することが非常に重要である一般的な概念のようです。
今日まで、私は常にそれについて直感的で簡単な理解を1つ持っていました。ランタイム環境は、コードが実行される環境です。しかし、これはそれを理解するかなり緩い方法です。上記のテキストから推測できるように、おそらくそれだけではありません。
その設定では:一般的にランタイム環境は実際には何ですか? .NETだけでなく、一般的なプログラミングでは、ランタイム環境とは何ですか?それは単なる概念的なものですか、それとも.NETのCLRのようなソフトウェアの一部ですか?要約すると、ランタイム環境の考え方を適切に理解するにはどうすればよいですか?
ランタイム環境を構成するコンポーネントがいくつかあります。すべてのコンポーネントがすべての環境に適用できるわけではありません(たとえば、アセンブラー、C++、およびC#にはすべて異なるランタイム機能があります)。
覚えておいてください、コンピューターはすべてレイヤーと抽象化です。上記のリストからわかるように、ランタイムは、ベアメタルと実行中のプログラムの間にある抽象概念の集まりです。
TL; DR回答:
Runtime Envionmentはやや曖昧な用語で、コードが実行される仮想マシンと、コードが期待する標準ライブラリおよびサービスを総称します利用できるものを見つけるために。また、コードと基盤となるオペレーティングシステムとの間の分離層と見なすこともできるため、コードに依存せず、移植性を高めることができます。
長い答え:
FORTRANとCOBOLが支配していた(あまり良くない)昔は、言語はまたランタイム環境でした。ほとんどのアプリケーションは、言語が提供する機能を使用して構築されており、それで十分でした。その結果、言語の構文は非常に複雑でしたが、それでも、言語を使用してできることは、言語の作成者がその言語を作成していたときに想像できるすべてのものに制限されていました。ファイルやデータベースへのアクセス、読み取り端末に文字を書き込んだり、端末から文字を書き込んだりしました。
Cが登場したとき、言語とランタイムライブラリは明確に区別されていました。 C言語自体は非常にミニマルであり、プログラムロジックを表現するために必要な最低限の要素だけを提供し、その他すべてをライブラリで実行することを委任します。標準ライブラリは一般的に使用されるものを提供し、他のもののために外部ライブラリを追加できます。
たとえば、C言語にはメモリ割り当ての概念が組み込まれていません。メモリを割り当てるには、標準ライブラリルーチンであるmalloc()
を呼び出す必要があります。そして、malloc()
が十分でない場合は、ニーズに適したものを提供する他のライブラリを使用できます。標準のランタイムライブラリはランタイム環境の先駆けでしたが、Cの時代にはUnixオペレーティングシステムがランタイム環境の役割を果たすことがほとんどであり、移植性の概念がなかったため、実際にはまだありませんでした。 Unixの世界、Unixの世界は唯一の世界でした。
JavaやC#などの移植可能な仮想マシンベースの言語が登場したとき、アプリケーションと基盤となるオペレーティングシステムとの間に追加の分離層を提供して、アプリケーションを実行できるようにする必要がありました。 Unix、Windows、またはその他のいずれかで、仮想マシンとそれに付属する豊富なライブラリセットによって提供されました。
ランタイム環境は一般的に何ですか?
はい、「ランタイム環境はコードが実行される環境」という幅広い理解は、その用語が定義されるのと同じくらい具体的です。
.NETだけでなく、一般的なプログラミングでは、ランタイム環境とは何ですか?
実際には、コードが実行されているハードウェア。コードが実行されているOS。実行時にコードで使用できるライブラリ。コードがアクセスできる環境変数。プログラムが実行されているロケール。(該当する場合)コードが実行されているJITコンパイラー/バイトコードインタープリター/ガベージコレクター/サンドボックス/アプリサーバー。
要約すると、ランタイム環境の考え方を適切に理解するにはどうすればよいですか?
仕事によって異なります。多くのプログラムはそれが本当に重要ではないので、まったくあまり気にしません。一部のプログラムは、実行するプラットフォームがハードウェアの違いを抽象化するのに優れていないため、またはコードが実行されている環境に応じてコードの動作を変えるため、多くの注意を払う必要があります。
しかし、用語として、「ランタイム環境」を知ることは、一般に、C#およびJavaで十分である)のような管理された言語を実行するために必要な中間の「もの」を指します。