web-dev-qa-db-ja.com

ランタイムとコンパイル時の違いは何ですか?

では、ランタイムとは何ですか?特定のプロセッサでは実行できない、半分コンパイルされたコードを実行する仮想マシンですか。もしそうなら、仮想マシンとは何ですか?半分コンパイルされたコードをマシン固有のコードにさらに変換するのは別のソフトウェアですか?したがって、中間コードにコンパイルせず、マシンコードに直接変換/コンパイルする言語の1つについて話している場合はどうでしょうか。その状況でのランタイムは何ですか?それはハードウェア(CPUとRAM)ですか?

また、コンパイル時と実行時の違いは何ですか?それらはソフトウェアライフサイクルの段階ですか。プログラムはもともとテキストファイルの集まりですよね?したがって、それらをコンパイルまたは変換してデータの形式にし、メモリにロードしてプロセッサで実行できるか、「マネージド」言語の場合は、ハードウェアで実行する前にさらにコンパイルする必要があります。管理言語とは正確には何ですか?

最後に、デバッグ時間などはありますか?

私はコンピュータサイエンスを勉強している最初の学期です、そしてそれは私に非論理的に物事がどのように教えられているかを本当に混乱させます。 「情報」は私の喉に押し込まれていますが、関連するすべてのものを明確に定義されたコンポーネントと関係の単一のシステムに編成することによってすべてを理解しようとすると、行き詰まります。

よろしくお願いします、ギャレット

9

人間による推論に適した種類のコード(「ソースコード」と呼びましょう)は、基盤となるハードウェア(CPUやGPUなど)で物理的に実行する前に、変換のいくつかの段階を通過する必要があります。

  1. ソースコード。
  2. [オプション]中間コード(.NETMSILやJavaバイトコードなど)。
  3. ターゲットに準拠したマシンコード 命令セットアーキテクチャ
  4. シリコンの論理ゲートを実際に反転させるマイクロコード。

これらの翻訳は、プログラムの「ライフサイクル」のさまざまなフェーズで実行できます。たとえば、特定のプログラミング言語またはツールは、開発者が1から2に翻訳することを選択する場合があります。プログラムを「ビルド」し、ユーザーがプログラムを「実行」すると、2から3に変換します(これは通常、「仮想マシン」と呼ばれるソフトウェアによって実行されます1 ユーザーのコンピューターにプリインストールする必要があります)。このシナリオは、C#やJavaなどの「マネージド」言語で一般的です。

または、「ネイティブ」言語で一般的なように、ビルド時に1から3に直接翻訳することもできます。 CやC++など。

34の間の変換は、ほとんどの場合、基盤となるハードウェアによって行われます。これは技術的には「ランタイム」の一部ですが、通常は抽象化されており、開発者にはほとんど見えません。

「コンパイル時間」という用語は、通常、1から2(または)への変換を示します。3)。プログラムが実際に実行される前のコンパイル時に実行できる特定のチェックがあります。たとえば、メソッドに渡される引数のタイプが、宣言されたメソッドパラメーターのタイプと一致することを確認します(言語が「強く型付けられている」と仮定)。エラーが早期に発見されるほど、修正が容易になりますが、これは柔軟性とバランスを取る必要があります。そのため、一部の「スクリプト」言語には包括的なコンパイル時チェックがありません。

「ランタイム」という用語は、通常、2(または3)からの翻訳を意味します。4まで。いわゆる「インタープリター言語」によって行われるように、実行時に1から直接翻訳することも可能です。

コンパイル時にキャッチできない特定の種類の問題があり、実行時にそれらを識別するために適切なデバッグ手法(デバッガー、ロギング、プロファイラーなど)を使用する必要があります。実行時エラーの典型的な例は、そこにないコレクションの要素にアクセスしようとした場合です。これは、実行時に例外として現れる可能性があり、コンパイラーにとって複雑すぎる実行フローの結果です。コンパイル時に「予測」します。

「デバッグ時間」は、デバッガが実行中のプログラムに接続されている間(またはデバッグログなどを監視しているとき)の単なる実行時間です。


 1 これを、VMwareやOracleVirtualBoxなどのネイティブコードを実行するように設計された仮想マシンと混同しないでください。

12

コンパイル時と実行時は通常、チェックが発生するとき、またはエラーが発生する可能性があるときを指します。たとえば、C#のような静的に型付けされた言語では、静的な型のチェックはコンパイル時に行われます。つまり、たとえば文字列をint変数に割り当てようとすると、アプリケーションをコンパイルできません。一方、実行時とは、コードが実際に実行される時間を指します。たとえば、例外は常に実行時にスローされます。

仮想マシンなどについては、 C#は、 共通中間言語 (CIL、またはIL)にコンパイルされる言語です。結果は、使用する.NET言語に関係なく同じコードになります(C#とVB.NETはどちらもILを生成します)。次に、.NET Frameworkは、実行時に ジャストインタイムコンパイル を使用してこの言語を実行します。そうですね、.NET Frameworkは、ターゲットマシンコードに対して特別なサブ言語を実行する仮想マシンとして見ることができます。

デバッグ時間については、デバッグ時にプログラムを実行しているので、そんなことはないと思います。したがって、どちらかといえば、デバッグ時はデバッガーが接続されたランタイムになります。しかし、そのような用語は使用しません。

4
poke

コンパイル時間-コンパイラーがコードのコンパイルを試行する期間。例:「コンパイラーは、コンパイル時に3つのタイプのエラーを検出したため、プログラムをコンパイルできませんでした。」

ランタイム-プログラムが実行されている期間。例:「論理エラーであるため、実行時までエラーを発見しませんでした。」

ランタイムマシンと仮想マシンは2つの別個のアイデアです。最初の質問は、私には意味がありません。

仮想マシンは確かに、「オブジェクト」[Java、C#など]コードをマシン上で実行できるバイトコードに変換するソフトウェアプログラムです。言語が仮想マシンを使用する場合、ジャストインタイムコンパイルも使用することがよくあります。つまり、コンパイル時と実行時は本質的に同時に発生します。

逆に、C、C++などのコンパイル言語は通常、マシンで実行される前にバイトコードにコンパイルされるため、コンパイル時と実行時は完全に分離されます。

一般に、「マネージド」言語にはガベージコレクションがあり(割り当てと割り当て解除でメモリを直接操作することはありません[JavaとC#はどちらも例です])、ある種の仮想マシンで実行されます。

3
Peter Geiger