実行時とコンパイル時の違いは何ですか?
27 に答える
コンパイル時と実行時の違いは、先のとがった理論家がフェーズの区別と呼ぶものの例です。特にプログラミング言語のバックグラウンドがあまりない人にとっては、学ぶのが最も難しい概念の 1 つです。この問題にアプローチするには、
- プログラムはどの不変条件を満たしますか?
- この段階で何が問題になる可能性がありますか?
- フェーズが成功した場合、事後条件は何ですか (何がわかりますか)?
- もしあれば、入力と出力は何ですか?
コンパイル時間
- プログラムは、不変条件を満たさなくてもかまいません。実際、整形式のプログラムである必要はまったくありません。この HTML をコンパイラにフィードして、barf を見ることができます...
- コンパイル時に何が問題になる可能性がありますか:
- 構文エラー
- 型チェック エラー
- (まれに) コンパイラがクラッシュする
- コンパイラが成功した場合、何がわかりますか?
- プログラムはよくできていて、どの言語でも有意義なプログラムでした。
- プログラムの実行を開始することができます。(プログラムはすぐに失敗するかもしれませんが、少なくとも試すことはできます。)
- インプットとアウトプットは何ですか?
- 入力は、コンパイルされるプログラムと、コンパイルするためにインポートする必要のあるヘッダー ファイル、インターフェイス、ライブラリ、またはその他のブードゥー教でした。
- 出力は、アセンブリ コード、再配置可能なオブジェクト コード、または実行可能プログラムであることが望ましいです。または、何か問題が発生した場合、出力は一連のエラー メッセージです。
実行時間
- プログラムの不変条件については何も知りません。それらはプログラマーが入れたものです。実行時の不変条件は、コンパイラだけで強制されることはめったにありません。プログラマーの助けが必要です。
問題が発生する可能性があるのは、実行時エラーです。
- ゼロ除算
- null ポインターの逆参照
- メモリ不足
また、プログラム自体によって検出されるエラーが存在する可能性があります。
- 存在しないファイルを開こうとしている
- Web ページを検索しようとして、疑わしい URL の形式が正しくないことを発見する
- ランタイムが成功した場合、プログラムはクラッシュすることなく終了 (または継続) します。
- 入力と出力は完全にプログラマ次第です。ファイル、画面上のウィンドウ、ネットワーク パケット、プリンターに送信されたジョブなど、名前は何でも構いません。プログラムがミサイルを発射する場合、それは出力であり、実行時にのみ発生します:-)
私はそれをエラーの観点から考え、いつキャッチできるかを考えています。
コンパイル時間:
string my_value = Console.ReadLine();
int i = my_value;
文字列値を int 型の変数に割り当てることはできないため、コンパイラはコンパイル時にこのコードに問題があることを確実に認識します。
実行時間:
string my_value = Console.ReadLine();
int i = int.Parse(my_value);
ここでの結果は、ReadLine() によって返された文字列によって異なります。一部の値は int に解析できますが、他の値は解析できません。これは実行時にのみ決定できます
コンパイル時間:開発者がコードをコンパイルする期間。
実行時間:ユーザーがソフトウェアを実行している期間。
もっと明確な定義が必要ですか?
(編集: 以下は、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
ソースコードを[screen|disk | network]で発生するものに変換するには、(おおよそ)2つの方法があります。それらをコンパイルと解釈と呼びます。
コンパイルされたプログラム(例はcとfortranです):
- ソースコードは別のプログラム(通常はコンパイラと呼ばれます-図を参照)に送られ、実行可能プログラム(またはエラー)が生成されます。
- 実行可能ファイルが実行されます(ダブルクリックするか、コマンドラインで名前を入力します)
最初のステップで発生することは「コンパイル時」に発生すると言われ、2番目のステップで発生することは「実行時に」発生すると言われます。
インタプリタされたプログラム(例:MicroSoftベーシック(dos)およびpython(私は思う)):
- ソースコードは、直接「実行」する別のプログラム(通常はインタプリタと呼ばれます)に送られます。ここで、インタープリターは、プログラムとオペレーティングシステム(または非常に単純なコンピューターのハードウェア)の間の中間層として機能します。
この場合、コンパイル時と実行時の違いを特定するのはかなり難しく、プログラマーやユーザーとの関連性ははるかに低くなります。
Javaは一種のハイブリッドであり、コードはバイトコードにコンパイルされ、仮想マシン上で実行されます。仮想マシンは通常、バイトコードのインタープリターです。
プログラムがバイトコードにコンパイルされてすぐに実行される中間的なケースもあります(awkやperlのように)。
基本的に、コンパイラが「コンパイル時に」何を意味するか、または値が何であるかを理解できる場合、これをランタイムコードにハードコードできます。明らかに、実行時コードが毎回計算を実行する必要がある場合は、実行速度が低下するため、コンパイル時に何かを決定できる場合ははるかに優れています。
例えば。
一定の折り畳み:
私が書く場合:
int i = 2;
i += MY_CONSTANT;
コンパイラは、2 と MY_CONSTANT が何であるかを知っているため、コンパイル時にこの計算を実行できます。そのため、実行ごとに計算を実行する必要がありません。
うーん、まあ、ランタイムは、プログラムの実行中に発生する何かを記述するために使用されます。
コンパイル時間は、プログラムが (通常はコンパイラによって) ビルドされているときに発生することを説明するために使用されます。
コンパイル時間:
コンパイル時に行われることは、結果のプログラムが実行されるときに (ほとんど) コストが発生しませんが、プログラムをビルドするときに大きなコストが発生する可能性があります。
ランタイム:
多かれ少なかれ正反対です。構築するときのコストはほとんどなく、プログラムを実行するときのコストは高くなります。
反対側から; コンパイル時に何かが行われた場合、それはあなたのマシンでのみ実行され、何かが実行時に実行された場合は、ユーザーのマシンで実行されます。
関連性
これが重要な例は、ユニット運搬タイプです。コンパイル時のバージョン ( Boost.UnitsやD の私のバージョンなど) は、ネイティブの浮動小数点コードで問題を解決するのと同じくらい高速になりますが、実行時のバージョンでは、値が単位に関する情報を詰め込む必要があります。すべての操作とともにチェックを実行します。一方、コンパイル時のバージョンでは、値の単位がコンパイル時にわかっている必要があり、値が実行時の入力に由来する場合には対処できません。
他の回答への追加として、素人に説明する方法は次のとおりです。
ソース コードは船の設計図のようなものです。それは船がどのように作られるべきかを定義します。
設計図を造船所に渡し、船の建造中に欠陥が見つかった場合、造船所は造船を中止し、船が乾ドックを離れたり水に触れたりする前に、すぐに報告します。これはコンパイル時エラーです。船は実際に浮かんだり、エンジンを使用したりすることさえありませんでした。船を作ることさえできなかったので、エラーが発見されました。
コードがコンパイルされると、船が完成するようなものです。構築済みで、すぐに使用できます。コードを実行することは、船を航海に出すようなものです。乗客が乗り込み、エンジンが作動し、船体が水上にあるので、これがランタイムです。あなたの船に致命的な欠陥があり、処女航海で沈没した場合 (または、さらに頭痛の種になった後の航海)、実行時エラーが発生しました。
例: 厳密に型指定された言語では、コンパイル時または実行時に型をチェックできます。コンパイル時に、型に互換性がない場合、コンパイラが文句を言うことを意味します。実行時には、プログラムを問題なくコンパイルできますが、実行時に例外がスローされます。
簡単に言えば、コンパイル時間と実行時間の違いです。
コンパイル時: 開発者はプログラムを .java 形式で書き込み、クラス ファイルであるバイトコードに変換します。このコンパイル中に発生したエラーは、コンパイル時エラーとして定義できます。
実行時: 生成された .class ファイルは、追加機能のためにアプリケーションによって使用されます & ロジックが間違っていることが判明し、実行時エラーであるエラーがスローされます
実行時間とは、プログラムを実行したときに何かが起こることを意味します。
コンパイル時とは、プログラムをコンパイルするときに何かが起こることを意味します。
コンパイル時間:
コンパイル時に行われることは、結果のプログラムが実行されるときに (ほとんど) コストが発生しませんが、プログラムをビルドするときに大きなコストが発生する可能性があります。ランタイム:
多かれ少なかれ正反対です。構築するときのコストはほとんどなく、プログラムを実行するときのコストは高くなります。
反対側から; コンパイル時に何かが行われた場合、それは自分のマシンでのみ実行され、何かが実行時に実行された場合は、ユーザーのマシンで実行されます。
私見では、多くのリンクやリソースを読んで、ランタイムとコンパイル時間の違いについて理解する必要があります。これは非常に複雑な問題だからです。私がお勧めするこの写真/リンクのいくつかを以下にリストします。
上で述べたこととは別に、時には 1000 語に値する画像を追加したいと思います。
- この 2 つの順序: 最初はコンパイル時で、次に実行します。コンパイルされたプログラムは、ユーザーが開いて実行できます。アプリケーションが実行されているとき、それは runtime と呼ばれます: コンパイル時、次に runtime1
;
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
- Google で検索し、実行時エラーとコンパイル エラーを比較します。
;
- 私の意見では、知っておくべき非常に重要なこと: 3.1 ビルドとコンパイルの違いとビルド ライフサイクル https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
3.2 この 3 つの違い: コンパイル vs ビルド vs ランタイム
https://www.quora.com/What-is-the-difference-between-build-run-and-compile Fernando Padoan、言語設計に少し興味がある開発者 2 月 23 日に回答済み他の答えに:
running は、バイナリ実行可能ファイル (またはインタープリター言語の場合はスクリプト) を取得して、コンピューター上で新しいプロセスとして実行されます。コンパイルとは、何らかの高水準言語 (機械語と比較するとより高度な言語) で記述されたプログラムを解析し、その構文、セマンティクスをチェックし、ライブラリをリンクし、おそらく何らかの最適化を行い、バイナリ実行可能プログラムを出力として作成するプロセスです。この実行可能ファイルは、マシン コードまたは何らかのバイト コードの形式である可能性があります。つまり、ある種の仮想マシンをターゲットとする命令です。ビルドには通常、依存関係のチェックと提供、コードの検査、コードのバイナリへのコンパイル、自動テストの実行、および結果のバイナリとその他のアセット (イメージ、構成ファイル、ライブラリなど) の特定の形式のデプロイ可能なファイルへのパッケージ化が含まれます。ほとんどのプロセスはオプションであり、一部はビルド対象のプラットフォームに依存することに注意してください。たとえば、Tomcat 用の Java アプリケーションをパッケージ化すると、.war ファイルが出力されます。C++ コードから Win32 実行可能ファイルをビルドすると、.exe プログラムを出力するだけでなく、.msi インストーラー内にパッケージ化することもできます。
私は常に、プログラム処理のオーバーヘッドと、それがパフォーマンスにどのように影響するかについて考えてきました。簡単な例は、オブジェクトに必要な絶対メモリをコードで定義するかどうかです。
定義されたブール値はxメモリを必要とし、これはコンパイルされたプログラムにあり、変更できません。プログラムを実行すると、x に割り当てるメモリの量が正確にわかります。
一方、一般的なオブジェクト タイプ (つまり、未定義のプレース ホルダーまたは巨大なブロブへのポインターのようなもの) を定義するだけの場合、オブジェクトに必要な実際のメモリは、プログラムを実行して何かを割り当てるまでわかりません。 、したがって、それを評価する必要があり、メモリ割り当てなどが実行時に動的に処理されます (実行時のオーバーヘッドが増えます)。
動的に処理される方法は、言語、コンパイラ、OS、コードなどによって異なります。
ただし、実行時とコンパイル時を使用しているコンテキストによって異なります。
これらは、静的バインディングと動的バインディングの 2 つの大まかなグループに分類できます。これは、対応する値でバインディングがいつ行われるかに基づいています。参照がコンパイル時に解決される場合は静的バインディングであり、参照が実行時に解決される場合は動的バインディングです。静的バインディングおよび動的バインディングは、アーリー バインディングおよびレイト バインディングとも呼ばれます。静的ポリモーフィズムおよび動的ポリモーフィズムと呼ばれることもあります。
ジョセフ・クランダイ。
これは、「実行時とコンパイル時の違いは?」という質問に対する回答の拡張です。--実行時とコンパイル時のオーバーヘッドの違いは?
製品の実行時のパフォーマンスは、結果をより迅速に提供することにより、製品の品質に貢献します。製品のコンパイル時のパフォーマンスは、編集、コンパイル、デバッグのサイクルを短縮することで、適時性に貢献します。ただし、実行時のパフォーマンスとコンパイル時のパフォーマンスはどちらも、タイムリーな品質を達成するための二次的な要因です。したがって、実行時およびコンパイル時のパフォーマンスの向上は、全体的な製品の品質と適時性の向上によって正当化される場合にのみ考慮する必要があります。
ここでさらに読むための優れた情報源:
ここに非常に簡単な答えがあります:
ランタイムとコンパイル時間は、ソフトウェア プログラム開発のさまざまな段階を指すプログラミング用語です。プログラムを作成するために、開発者はまず、プログラムがどのように機能するかを定義するソース コードを記述します。小さなプログラムには数百行のソース コードしか含まれない場合がありますが、大きなプログラムには数十万行のソース コードが含まれる場合があります。ソースコードは、実行可能なプログラムになるためにマシンコードにコンパイルする必要があります。このコンパイル プロセスは、コンパイル時間と呼ばれます (コンパイラを翻訳者と考えてください)。
コンパイルされたプログラムは、ユーザーが開いて実行できます。アプリケーションが実行されているとき、それはランタイムと呼ばれます。
「実行時」および「コンパイル時」という用語は、プログラマーがさまざまな種類のエラーを指すためによく使用します。コンパイル時エラーとは、構文エラーやファイル参照の欠落など、プログラムの正常なコンパイルを妨げる問題です。コンパイラはコンパイル時にエラーを生成し、通常はソース コードのどの行が問題を引き起こしているかを示します。
プログラムのソース コードが既に実行可能プログラムにコンパイルされている場合、プログラムの実行中に発生するバグがまだ残っている可能性があります。例としては、動作しない機能、予期しないプログラムの動作、またはプログラムのクラッシュが含まれます。この種の問題は実行時に発生するため、実行時エラーと呼ばれます。
SOにとっては良い質問ではありませんが(特定のプログラミングの質問ではありません)、一般的には悪い質問ではありません。
些細なことだと思うなら、読み取り時とコンパイル時はどうでしょうか。これを区別するのに役立つのはいつですか。コンパイラが実行時に利用できる言語はどうですか?Guy Steele(ダミーではありません)は、CLプログラマーがこれを制御するために使用できるEVAL-WHENについてCLTL2に7ページを書きました。定義には2文でかろうじて十分ですが、それ自体は説明がはるかに不足しています。
一般的に、言語設計者が避けようとしているように見えるのは難しい問題です。彼らはしばしば「ここにコンパイラがあります、それはコンパイル時のことをします;それ以降のすべては実行時です、楽しんでください」と言うだけです。Cは、計算のための最も柔軟な環境ではなく、実装が簡単になるように設計されています。実行時にコンパイラを使用できない場合、または式を評価するタイミングを簡単に制御する機能がない場合は、マクロの一般的な使用法を偽造するために言語をハックする傾向があります。または、ユーザーがシミュレートするデザインパターンを考え出す場合もあります。より強力な構造を持つ。実装が簡単な言語は間違いなく価値のある目標ですが、それがプログラミング言語の設計のすべてであるという意味ではありません。(私はEVAL-WHENをあまり使用しませんが、EVALなしの生活を想像することはできません。)
また、コンパイル時と実行時の問題領域は膨大であり、まだほとんど調査されていません。SOが議論を行うのに適切な場所であるとは限りませんが、この領域をさらに探求することをお勧めします。特に、それがどうあるべきかについて先入観を持っていない人はそうです。質問は単純でも愚かなものでもありません、そして私たちは少なくとも質問者を正しい方向に向けることができました。
残念ながら、私はこれに関する良い参考文献を知りません。CLTL2はそれについて少し話しますが、それについて学ぶのは良くありません。