回答:
コンパイル時と実行時の違いは、先のとがった理論家がフェーズ区別と呼んでいるものの例です。これは、特にプログラミング言語の知識があまりない人にとって、学ぶのが最も難しい概念の1つです。この問題に取り組むために、私は尋ねることが役立つと思います
うまくいかない可能性があるのは実行時エラーです:
また、プログラム自体によって検出されたエラーがある可能性があります。
私はそれをエラーの観点から、そしていつキャッチされるのかを考えています。
コンパイル時間:
string my_value = Console.ReadLine();
int i = my_value;
文字列値にint型の変数を割り当てることはできないため、コンパイラーはコンパイル時に確実に認識しますにこのコードに問題がある
実行時間:
string my_value = Console.ReadLine();
int i = int.Parse(my_value);
ここでの結果は、ReadLine()によって返された文字列によって異なります。一部の値はintに解析できますが、他の値はできません。これは実行時にのみ決定できます
.app
拡張機能にコンパイルするのは、コンパイル時が初めてですか?または、ユーザーがアプリを起動するたびに起動時に発生しますか?
コンパイル時間:開発者であるあなたのコードをコンパイルしている期間。
実行時間:ユーザーがソフトウェアを実行している期間。
より明確な定義が必要ですか?
int x = 3/0
。何も印刷しません。それでも実行時エラーと見なされますか?
(編集:以下はC#および類似の強く型付けされたプログラミング言語に適用されます。これが役立つかどうかはわかりません)。
たとえば、プログラムを実行する前に次のエラーがコンパイラーによって(コンパイル時に)検出され、コンパイルエラーが発生します。
int i = "string"; --> error at compile-time
一方、コンパイラでは以下のようなエラーは検出できません。実行時(プログラムの実行時)にエラー/例外が表示されます。
Hashtable ht = new Hashtable();
ht.Add("key", "string");
// the compiler does not know what is stored in the hashtable
// under the key "key"
int i = (int)ht["key"]; // --> exception at run-time
ソースコードから[画面|ディスク|ネットワーク]への変換は、(おおよそ)2つの方法で実行できます。それらをコンパイルおよび解釈と呼びます。
コンパイルされたプログラム(例としては、CおよびFortranです)。
最初のステップで発生することは「コンパイル時」に発生すると言われ、2番目のステップで発生することは「実行時」に発生すると言われています。
で解釈プログラム(例えば、マイクロソフトのDOS上の基本的な()とPython(と思います)):
この場合、コンパイル時と実行時の違いを突き止めるのはかなり難しく、プログラマやユーザーにとってはそれほど重要ではありません。
Javaは一種のハイブリッドであり、コードはバイトコードにコンパイルされ、通常はバイトコードのインタープリターである仮想マシン上で実行されます。
プログラムがバイトコードにコンパイルされてすぐに実行される中間のケースもあります(awkやperlのように)。
基本的に、コンパイラがあなたの意味や「コンパイル時」の値を理解できる場合、これをランタイムコードにハードコードできます。明らかに、実行時コードが実行速度が遅くなるたびに計算を行う必要がある場合、コンパイル時に何かを決定できる場合は、はるかに優れています。
例えば。
一定の折りたたみ:
私が書いた場合:
int i = 2;
i += MY_CONSTANT;
コンパイラーは、2とは何か、MY_CONSTANTとは何かを知っているため、コンパイル時にこの計算を実行できます。そのため、実行ごとに計算を実行する必要がなくなります。
コンパイル時に行われる処理は、結果として得られるプログラムの実行時に(ほとんど)コストがかかりますが、プログラムのビルド時に大きなコストがかかる可能性があります。
ほぼ正反対です。ビルド時のコストはほとんどなく、プログラムの実行時のコストは高くなります。
反対側から; コンパイル時に何かが行われた場合、それはあなたのマシン上でのみ実行され、ランタイム時に何かがユーザーのマシン上で実行されます。
これが重要な例として、ユニットキャリングタイプがあります。コンパイル時のバージョン(Boost.UnitsまたはDの私のバージョンなど)は、ネイティブの浮動小数点コードの問題を解決するのと同じくらい高速になり、実行時のバージョンは、値の単位に関する情報をパックする必要があります。で、すべての操作と一緒にそれらのチェックを実行します。一方、コンパイル時バージョンは、値の単位がコンパイル時にわかっていることを前提としており、それらがランタイム入力に由来する場合を処理できません。
以前の同様の質問の回答から、実行時エラーとコンパイラエラーの違いは何ですか?
コンパイル/コンパイル時間/構文/セマンティックエラー:コンパイルまたはコンパイル時エラーは、入力ミスが原因で発生したエラーです。プログラミング言語の適切な構文およびセマンティクスに従わない場合、コンパイラによってコンパイル時エラーがスローされます。すべての構文エラーを削除するか、コンパイル時エラーをデバッグするまで、プログラムは1行を実行できません。
例:Cのセミコロンがない、またはとタイプミスしint
ているInt
。
実行時エラー:実行時エラーは、プログラムが実行状態にあるときに生成されるエラーです。これらのタイプのエラーにより、プログラムが予期せぬ動作をしたり、プログラムが強制終了される場合があります。それらはしばしば例外と呼ばれます。
例:存在しないファイルを読み取っていると、ランタイムエラーが発生するとします。
すべてのプログラミングエラーの詳細については、こちらをご覧ください
他の答えへのアドオンとして、ここに私が素人にそれを説明する方法があります:
あなたのソースコードは船の青写真のようなものです。船の製造方法を定義します。
造船所に設計図を渡して、造船中に欠陥を見つけた場合、造船所は造船を中止し、船が乾ドックを離れたり水に触れたりする前にすぐに報告します。これはコンパイル時のエラーです。船が実際に浮いたり、エンジンを使用したりすることさえありませんでした。船が作られさえしなかったため、エラーが見つかりました。
コードがコンパイルされると、完成した船のようです。ビルド済みですぐに使用できます。コードを実行すると、船を航海に出すようなものです。乗客は搭乗し、エンジンが作動しており、船体は水上にあるため、これはランタイムです。乙女の航海(または多分余分な頭痛のための航海)で沈む致命的な欠陥が船にある場合、ランタイムエラーが発生しました。
例:強く型付けされた言語では、型はコンパイル時または実行時にチェックできます。コンパイル時にそれは、型に互換性がない場合にコンパイラが文句を言うことを意味します。実行時とは、プログラムを正常にコンパイルできることを意味しますが、実行時に例外がスローされます。
コンパイルの主題に関する、「JAVAプログラミング入門」の著者であるDaniel Liangからの引用は次のとおりです。
「高級言語で書かれたプログラムは、ソースプログラムやソースコードと呼ばれている。コンピュータは、ソースプログラムを実行することはできませんので、ソースプログラムがされている必要があり、翻訳にマシンコードのために実行。翻訳と呼ばれる別のプログラミングツールを使用して行うことができますインタプリタまたはコンパイラ。」(Daniel Liang、「Javaプログラミング入門」、p8)。
...彼は続けます...
「コンパイラーはソースコード全体をマシンコードファイルに変換し、マシンコードファイルが実行されます。」
高レベル/人間が読めるコードを打ち込むとき、これは最初は役に立たないです!これは、ごく小さなCPUでの「電子的な出来事」のシーケンスに変換する必要があります。これに向けた最初のステップはコンパイルです。
簡単に言うと、コンパイルエラーはこのフェーズで発生し、実行エラーは後で発生します。
覚えておいてください:プログラムがエラーなしでコンパイルされたからといって、エラーなしで実行できるわけではありません。
ランタイムエラーは、プログラムのライフサイクルの準備完了、実行中、または待機中の部分で発生し、コンパイル時エラーは、ライフサイクルの「新規」ステージの前に発生します。
コンパイル時エラーの例:
構文エラー-あいまいな場合、コードをどのようにマシンレベルの命令にコンパイルできますか?コードは、言語の構文規則に100%準拠している必要があります。そうでない場合、実際のマシンコードにコンパイルできません。
実行時エラーの例:
メモリ不足-たとえば、再帰関数の呼び出しは、特定の程度の変数を指定すると、スタックオーバーフローを引き起こす可能性があります。コンパイラはこれをどのように予測できますか?できない。
そして、それはコンパイル時エラーと実行時エラーの違いです
コンパイル時間: ソースコードを実行可能コードになるようにマシンコードに変換するのにかかる時間をコンパイル時間と呼びます。
ランタイム: アプリケーションが実行されているとき、それはランタイムと呼ばれます。
コンパイル時エラーは、これらの構文エラー、ファイル参照エラーの欠落です。ランタイムエラーは、ソースコードが実行可能プログラムにコンパイルされた後、プログラムの実行中に発生します。例としては、プログラムのクラッシュ、予期しないプログラムの動作または機能が機能しないなどがあります。
あなたが上司であり、アシスタントとメイドがいて、彼らに実行するタスクのリストを与えると想像してください。アシスタント(コンパイル時)がこのリストを取得し、タスクが理解できるかどうか、そしてあなたが厄介な言語や構文で書かれていなかったため、ジョブに誰かを割り当てたいと彼は理解しているので、彼をあなたに割り当て、コーヒーを飲みたいと理解しているので、彼の役割は終わり、メイド(実行時)これらのタスクの実行を開始するため、彼女はあなたにいくつかのコーヒーを作りに行きますが、突然、作るコーヒーが見つからないため、彼女は作るのをやめるか、別の方法でお茶を作ります(エラーを見つけたためにプログラムが別の方法で動作するとき) )。
「実行時とコンパイル時の違いは?」という質問に対する回答の拡張です。- ランタイムとコンパイル時間に関連するオーバーヘッドの違いは?
製品の実行時のパフォーマンスは、結果をより早く提供することにより、品質に貢献します。製品のコンパイル時のパフォーマンスは、編集、コンパイル、デバッグのサイクルを短縮することにより、適時性に貢献します。ただし、実行時のパフォーマンスとコンパイル時のパフォーマンスの両方が、タイムリーな品質を実現するための二次的要素です。したがって、製品全体の品質と適時性の改善によって正当化される場合にのみ、実行時とコンパイル時のパフォーマンスの改善を検討する必要があります。
ここでさらに読むための素晴らしい情報源:
私は常にそれをプログラム処理のオーバーヘッドと比較して考え、以前に述べたようにそれがパフォーマンスにどのように影響するかを考えてきました。単純な例は、コードでオブジェクトに必要な絶対メモリを定義するかどうかです。
定義されたブール値はxメモリを必要とし、これはコンパイルされたプログラム内にあり、変更できません。プログラムを実行すると、xに割り当てるメモリ量が正確にわかります。
一方、一般的なオブジェクトタイプ(つまり、未定義のプレースホルダーまたは巨大なBLOBへのポインター)を定義するだけの場合、プログラムを実行して何かを割り当てるまで、オブジェクトに必要な実際のメモリはわかりません。なので、評価する必要があり、メモリ割り当てなどは実行時に動的に処理されます(実行時のオーバーヘッドが増加します)。
動的に処理される方法は、言語、コンパイラ、OS、コードなどによって異なります。
ただし、その点については、実際に実行時間とコンパイル時間のどちらを使用しているかによって異なります。
静的バインディングと動的バインディングの2つの異なるグループに分類できます。これは、対応する値でバインディングがいつ行われるかに基づいています。参照がコンパイル時に解決される場合は静的バインディングであり、実行時に参照が解決される場合は動的バインディングです。静的バインディングと動的バインディングは、アーリーバインディングとレイトバインディングとも呼ばれます。時には、それらは静的多型および動的多型とも呼ばれます。
ジョセフ・クランダイ。
ここに非常に簡単な答えがあります:
ランタイムとコンパイル時間は、ソフトウェアプログラム開発のさまざまな段階を指すプログラミング用語です。プログラムを作成するために、開発者はまずプログラムがどのように機能するかを定義するソースコードを記述します。小さなプログラムは数百行のソースコードしか含まない場合がありますが、大きなプログラムは数十万行のソースコードを含む場合があります。実行可能プログラムになるためには、ソースコードをマシンコードにコンパイルする必要があります。このコンパイルプロセスはコンパイル時間と呼ばれます(コンパイラをトランスレータと考えてください)。
コンパイルされたプログラムは、ユーザーが開いて実行できます。アプリケーションが実行されているとき、それはランタイムと呼ばれます。
「ランタイム」および「コンパイル時」という用語は、さまざまなタイプのエラーを指すためにプログラマーがよく使用します。コンパイル時エラーは、構文エラーやファイル参照の欠落などの問題であり、プログラムを正常にコンパイルできません。コンパイラはコンパイル時エラーを生成し、通常、問題の原因となっているソースコードの行を示します。
プログラムのソースコードがすでに実行可能プログラムにコンパイルされている場合でも、プログラムの実行中にバグが発生する可能性があります。例には、機能しない機能、予期しないプログラムの動作、またはプログラムのクラッシュが含まれます。これらのタイプの問題は、実行時に発生するため、ランタイムエラーと呼ばれます。
私見では、ランタイムとコンパイル時間の違いを理解するために多くのリンクやリソースを読む必要があります。これは非常に複雑なテーマであるためです。私がお勧めするこの写真/リンクのいくつかを以下にリストします。
上記で述べたこととは別に、時には1000ワードに相当する画像を追加したいと思います。
CLR_diagコンパイル時間、次にruntime2
from Wiki
https://en.wikipedia.org/wiki/Run_time https://en.wikipedia.org/wiki/Run_time_(program_lifecycle_phase)
ランタイム、ランタイム、またはランタイムは、以下を参照する場合があります。
コンピューティング
実行時間(プログラムライフサイクルフェーズ)、コンピュータプログラムが実行されている期間
ランタイムライブラリ、プログラミング言語に組み込まれた関数を実装するために設計されたプログラムライブラリ
ランタイムシステム、コンピュータプログラムの実行をサポートするように設計されたソフトウェア
ソフトウェア実行、実行時フェーズ中に命令を1つずつ実行するプロセス
コンパイラーのリスト https://en.wikipedia.org/wiki/List_of_compilers
;
3.2この3つの違い:コンパイルvsビルドvsランタイム
https://www.quora.com/What-is-the-difference-between-build-run-and-compile フェルナンドパドアン、言語設計に少し興味がある開発者回答済み2月23日答えは後戻り他の答えへ:
実行すると、バイナリ実行可能ファイル(またはインタプリタ言語のスクリプト)がコンピュータ上で新しいプロセスとして実行されます。コンパイルとは、高水準言語で記述されたプログラムを解析し(マシンコードと比較すると高い)、その構文、セマンティクス、ライブラリのリンクを確認し、おそらく最適化を行ってから、バイナリ実行可能プログラムを出力として作成するプロセスです。この実行可能ファイルは、マシンコードまたはある種のバイトコード(つまり、ある種の仮想マシンをターゲットとする命令)の形式である可能性があります。ビルドには通常、依存関係の確認と提供、コードの検査、コードのバイナリへのコンパイル、自動テストの実行、および結果のバイナリとその他のアセット(イメージ、構成ファイル、ライブラリなど)のデプロイ可能なファイルの特定の形式へのパッケージ化が含まれます。ほとんどのプロセスはオプションであり、一部は構築対象のプラットフォームに依存することに注意してください。例として、Tomcat用のJavaアプリケーションをパッケージ化すると、.warファイルが出力されます。C ++コードからWin32実行可能ファイルを構築すると、.exeプログラムを出力するだけでなく、.msiインストーラー内にパッケージ化することもできます。
この例を見てください:
public class Test {
public static void main(String[] args) {
int[] x=new int[-5];//compile time no error
System.out.println(x.length);
}}
上記のコードは正常にコンパイルされ、構文エラーはなく、完全に有効です。しかし、実行時に次のエラーがスローされます。
Exception in thread "main" java.lang.NegativeArraySizeException
at Test.main(Test.java:5)
コンパイル時に特定のケースがチェックされたときのように、実行後、プログラムがすべての条件を満たすと特定のケースがチェックされ、出力が得られます。そうしないと、コンパイル時または実行時エラーが発生します。
パブリッククラスRuntimeVsCompileTime {
public static void main(String[] args) {
//test(new D()); COMPILETIME ERROR
/**
* Compiler knows that B is not an instance of A
*/
test(new B());
}
/**
* compiler has no hint whether the actual type is A, B or C
* C c = (C)a; will be checked during runtime
* @param a
*/
public static void test(A a) {
C c = (C)a;//RUNTIME ERROR
}
}
class A{
}
class B extends A{
}
class C extends A{
}
class D{
}
これはSOに適した質問ではありません(特定のプログラミングの質問ではありません)が、一般に悪い質問ではありません。
それが取るに足らないことだと思う場合:読み取り時とコンパイル時についてはどうですか?これはいつ区別すると便利ですか?コンパイラーが実行時に使用できる言語についてはどうですか?Guy Steele(ダミーではない、彼)は、CLプログラマーがこれを制御するために使用できるEVAL-WHENについてCLTL2で7ページを書きました。定義には2文でかろうじて十分ですが、それ自体は説明にはほど遠いものです。
一般に、言語デザイナーが避けようとしているように見えるのは難しい問題です。彼らはしばしば「ここにコンパイラがあります、それはコンパイル時のことをします;それ以降はすべてランタイムです、楽しんでください」と言います。Cは実装が簡単になるように設計されており、計算のための最も柔軟な環境ではありません。実行時にコンパイラーを使用できない場合、または式が評価されるタイミングを簡単に制御する機能がない場合、マクロの一般的な使用を偽造するために言語のハックが発生する傾向があるか、ユーザーがシミュレーションするデザインパターンを思い付くより強力な構造を持っています。実装が簡単な言語は間違いなく価値のある目標ですが、だからといってそれがプログラミング言語の設計のすべてであるというわけではありません。(私はEVAL-WHENをあまり使用しませんが、それなしの人生を想像することはできません。)
そして、コンパイル時と実行時の問題空間は巨大であり、未だ大部分が調査されていません。それは、SOが議論を行うのに適切な場所だと言っているわけではありませんが、私はこの領域をさらに探索することをお勧めします。質問は単純でも馬鹿でもないし、少なくとも審問官を正しい方向に向けることができた。
残念ながら、これに関する適切な参考資料は知りません。CLTL2は少しそれについて話しますが、それについて学ぶのは素晴らしいことではありません。