web-dev-qa-db-ja.com

実行時間とコンパイル時間

実行時とコンパイル時の違いについて理解してください。

322
devforall

コンパイル時と実行時の違いは、先のとがった理論家が位相の区別と呼んでいる例です。特にプログラミング言語の経験があまりない人にとっては、学ぶのが最も難しい概念の1つです。この問題に取り組むために、私はそれが尋ねるのが役に立つと思います

  1. プログラムはどのような不変式を満たしますか?
  2. この段階で何が問題になる可能性がありますか?
  3. フェーズが成功した場合、事後条件は何ですか(私たちは何を知っていますか?)
  4. もしあれば、入力と出力は何ですか?

コンパイル時間

  1. プログラムは不変式を満たす必要はありません。実際、それは整形式のプログラムである必要はまったくありません。このHTMLをコンパイラに渡して、それを見張ることができます...
  2. コンパイル時に何が問題になる可能性があります:
    • 構文エラー
    • 型検査エラー
    • (まれに)コンパイラがクラッシュする
  3. コンパイラが成功したら、何がわかりますか?
    • プログラムはよく形成されていました---どんな言語でも意味のあるプログラムです。
    • プログラムの実行を開始することは可能です。 (プログラムはすぐに失敗するかもしれませんが、少なくとも私たちは試すことができます。)
  4. 入力と出力は何ですか?
    • 入力はコンパイルされるプログラムに加えて、コンパイルするためにインポートするために必要なヘッダファイル、インタフェース、ライブラリ、またはその他のブードゥーです。
    • 出力はアセンブリコード、再配置可能なオブジェクトコード、あるいは実行可能プログラムであることが望ましいです。あるいは、何か問題が発生した場合は、大量のエラーメッセージが出力されます。

実行時間

  1. プログラムの不変式については何もわかっていません - プログラマーが決めたものは何でも構いません。実行時不変式がコンパイラだけで強制されることはほとんどありません。プログラマーの助けが必要です。
  2. うまくいかないのは実行時エラーです。

    • ゼロ除算
    • NULLポインタを間接参照する
    • メモリ不足

    プログラム自体によって検出されるエラーもある可能性があります。

    • そこにないファイルを開こうとしています
    • Webページを見つけようとしていると主張されているURLが整形式ではないことを発見
  3. 実行時間が成功した場合、プログラムはクラッシュすることなく終了します(または続行します)。
  4. 入力と出力は完全にプログラマ次第です。ファイル、画面上のウィンドウ、ネットワークパケット、プリンタに送信されたジョブなど、名前を付けます。プログラムがミサイルを発射するならば、それは出力です、そして、それは実行時にだけ起こります:-)
431
Norman Ramsey

私はそれをエラーの観点から考えています。

コンパイル時間:

string my_value = Console.ReadLine();
int i = my_value;

文字列値にint型の変数を代入することはできないので、コンパイラはコンパイル時にがこのコードに問題があることを確実に認識しています。

実行時間

string my_value = Console.ReadLine();
int i = int.Parse(my_value);

ここでの結果は、ReadLine()によって返された文字列によって異なります。いくつかの値はint型に解析できますが、そうでないものもあります。これは実行時にのみ決定できます

153
pufferfish

コンパイル時間:あなた(開発者)がコードをコンパイルしている期間。

実行時間:ユーザーが自分のソフトウェアを実行している期間。

もっと明確な定義が必要ですか?

60
Yuval Adam

edit:以下はC#やそれに類する強く型付けされたプログラミング言語に当てはまります。

たとえば、プログラムを実行する前に次のエラーがコンパイラによって検出され(atコンパイル時)、コンパイルエラーが発生します。

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
21
M4N

ソースコードの[screen | disk | network]への変換は、(大体)2つの方法で行われます。それらをコンパイルと解釈と呼びます。

コンパイルされたプログラム(例はcとfortran):

  1. ソースコードは別のプログラム(通常はコンパイラ - go figureと呼ばれます)に入力され、実行可能プログラム(またはエラー)が生成されます。
  2. 実行可能ファイルが実行されます(ダブルクリックするか、コマンドラインで名前を入力します)。

最初のステップで起こることは「コンパイル時」に起こると言われ、2番目のステップで起こることは「実行時」に起こると言われます。

解釈されたプログラム(Microsoftベーシック(dos)およびpython(私は思う)の例):

  1. ソースコードは別のプログラム(通常はインタプリタと呼ばれます)に入力され、直接実行されます。ここでインタプリタはあなたのプログラムとオペレーティングシステム(あるいは本当に単純なコンピュータではハードウェア)の間の中間層として機能します。

この場合、コンパイル時と実行時の違いは、突き止めるのがかなり難しく、プログラマーやユーザーにとってはそれほど重要ではありません。

Javaは一種のハイブリッドであり、コードはバイトコードにコンパイルされ、その後、通常はバイトコードのインタプリタである仮想マシン上で実行されます。

プログラムがバイトコードにコンパイルされてすぐに実行される(awkやPerlのように)中間的なケースもあります。

18
dmckee

基本的に、あなたのコンパイラがあなたが何を意味するのか、あるいは値が「コンパイル時」であるのかを理解することができるならば、それをランタイムコードにハードコーディングすることができます。ランタイムコードの実行速度が遅くなるたびに計算を行わなければならない場合は明らかです。したがって、コンパイル時に何かを判断できれば、はるかに優れたものになります。

例えば。

コンスタントフォールディング:

私が書いた場合:

int i = 2;
i += MY_CONSTANT;

コンパイラーは、2が何であるか、そしてMY_CONSTANTが何であるかを知っているので、コンパイル時にこの計算を実行できます。そのため、実行ごとに計算を実行する必要がなくなります。

11
Spence

うーん、まあまあ、ランタイムはプログラムが実行されているときに発生するものを記述するために使用されます。

コンパイル時間は、プログラムが(通常はコンパイラーによって)ビルドされているときに発生することを説明するために使用されます。

8
dicroce

コンパイル時間:

コンパイル時に行われることは、結果として得られるプログラムが実行されるときに(ほとんど)無償で発生しますが、プログラムを構築するときに多大なコストが発生する可能性があります。

ランタイム:

ほぼ正反対です。あなたが構築するときにはほとんどコストがかからず、プログラムが実行されるときにはより多くのコストがかかります。

反対側から。コンパイル時に何かが実行された場合、それはあなたのマシン上でのみ実行され、何かが実行時に実行された場合、それはあなたのユーザのマシン上で実行されます。

関連性

これが重要な場所の例は、ユニット搬送タイプです。コンパイル時のバージョン( Boost.Units または Dでの私のバージョン ランタイムバージョンでは、値が含まれている単位に関する情報をまとめて、すべての操作と並行してチェックする必要がありますが、ネイティブの浮動小数点コードの問題を解決するのと同じくらい高速になります。一方、コンパイル時のバージョンでは、値の単位はコンパイル時に認識されるため、実行時の入力から来る場合には対応できません。

8
BCS

以前の同様の質問からの回答 実行時エラーとコンパイラエラーの違いは何ですか?

コンパイル/コンパイル時/シンタックス/セマンティックエラー:コンパイルエラーまたはコンパイル時エラーは、プログラミング言語の適切な構文とセマンティクスに従わないと、入力ミスによってエラーが発生します。コンパイル時エラーはコンパイラによってスローされます。すべての構文エラーが取り除かれるか、コンパイル時エラーがデバッグされるまで、プログラムは単一行を実行しません。
例:Cでセミコロンが抜けている、またはintIntとして誤って入力している。

ランタイムエラー:ランタイムエラーは、プログラムが実行状態にあるときに生成されるエラーです。この種のエラーはあなたのプログラムが予期せず振る舞う原因となり、あるいはあなたのプログラムを殺すことさえあります。それらはしばしば例外と呼ばれます。
例:存在しないファイルを読んでいると仮定すると、ランタイムエラーになります。

すべての プログラミングエラー の詳細については、こちらを参照してください。

8
Pankaj Prakash

たとえば、強く型付けされた言語では、型はコンパイル時または実行時にチェックできます。コンパイル時には、型に互換性がないとコンパイラが文句を言います。実行時には、プログラムをうまくコンパイルできますが、実行時には例外がスローされます。

5

他の答えへの追加として、私が素人にそれを説明する方法があります:

あなたのソースコードは船の青写真のようなものです。船の作り方を定義します。

青写真を造船所に渡し、彼らが造船中に欠陥を発見した場合、彼らは造船を中止し、船が乾ドックを離れたり水に触れたりする前に直ちにそれをあなたに報告します。これはコンパイル時エラーです。船は実際に浮遊したりエンジンを使ったりすることすらなかった。船が造られるのさえ妨げられたので、エラーは見つかりました。

あなたのコードがコンパイルされるとき、それは船が完成しているようなものです。建てられて行く準備ができて。あなたがコードを実行するとき、それは航海で船を起動するようなものです。乗客は乗船し、エンジンは作動し、船体は水上にあるので、これは実行時です。あなたの船がその乙女の航海(または余分な頭痛のために後に多分いくらかの航海)にそれを沈める致命的な欠陥を持っているなら、それは実行時エラーを被りました。

5
Jared K

単なるWordの違いでb/wコンパイル時間と実行時間。

コンパイル時:開発者は、プログラムを.Java形式で書き込み、クラスファイルであるBytecodeに変換します。このコンパイル中に発生したエラーはコンパイル時エラーとして定義できます。

実行時:生成された.classファイルは、追加機能のためにアプリケーションによって使用されます。ロジックが間違っていて実行時エラーであるエラーをスローします。

4
prasanna

これは、コンパイルの主題に関する 'Introduction to Java programming'の作者であるDaniel Liangによる引用です。

「高級言語で書かれたプログラムは、ソースプログラムまたはソースコードと呼ばれます。コンピュータではソースプログラムを実行できないため、ソースプログラムはtranslationintomachine codeにする必要があります。forexecution。翻訳は、インタプリタまたはcompilerと呼ばれる別のプログラミングツールを使用して実行できます。 (Daniel Liang、 「Javaプログラミング入門」 、p8)。

...彼は続きます...

「コンパイラはソースコード全体をmachine-codeファイルに変換してから、マシンコードファイルを実行します。」

高水準/人間が読めるコードを打ち込むとき、これは最初は無用です。それはあなたの小さな小さなCPUでの一連の「電子的出来事」に翻訳されなければなりません!これに向けた最初のステップはコンパイルです。

簡単に言うと、この段階でコンパイル時エラーが発生し、実行時エラーが後で発生します。

覚えておいてください:プログラムがエラーなしでコンパイルされたからといって、エラーなく実行されるという意味ではありません。

実行時エラーはプログラムライフサイクルの準備中、実行中または待機中の部分で発生しますが、コンパイル時エラーはライフサイクルの「新規」段階の前に発生します。

コンパイル時エラーの例:

構文エラー - あいまいな場合、どのようにしてコードをマシンレベルの命令にコンパイルできますか。あなたのコードは言語の構文規則に100%準拠する必要があります。そうでなければ、それは実用的な マシンコード にコンパイルできません。

実行時エラーの例:

メモリが足りなくなった場合 - たとえば、再帰関数を呼び出すと、特定の変数が与えられたときにスタックオーバーフローが発生する可能性があります。コンパイラはこれをどのように予測できますか。できない。

そしてそれがコンパイル時エラーと実行時エラーの違いです。

4
Thomas Flood

実行時とは、プログラムを実行したときに何かが起こることを意味します。

コンパイル時間は、プログラムをコンパイルしたときに何かが起こることを意味します。

2
Zifre

コンパイル時間:ソースコードを機械語に変換して実行可能ファイルにするまでの時間をコンパイル時間と呼びます。

実行時間:アプリケーションが実行されているとき、それは実行時間と呼ばれます。

コンパイル時エラーは、構文エラー、ファイル参照エラーの欠落です。実行時エラーは、ソースコードが実行可能プログラムにコンパイルされた後、およびプログラムの実行中に発生します。例としては、プログラムのクラッシュ、予期しないプログラムの動作、機能が機能しないなどがあります。

2

コンパイル時間:

コンパイル時に行われることは、結果として得られるプログラムが実行されるときに(ほとんど)無償で発生しますが、プログラムを構築するときに多大なコストが発生する可能性があります。ランタイム:

ほぼ正反対です。あなたが構築するときにはほとんどコストがかからず、プログラムが実行されるときにはより多くのコストがかかります。

反対側から。コンパイル時に何かが実行された場合、それはあなたのマシン上でのみ実行され、何かが実行時に実行された場合、それはあなたのユーザのマシン上で実行されます。

2
siva

これは、「実行時とコンパイル時の違い」という質問に対する回答の拡張です。 - 実行時とコンパイル時に関連するオーバーヘッドの違いは?

製品の実行時性能は、結果をより早く提供することによってその品質に貢献します。製品のコンパイル時のパフォーマンスは、編集 - コンパイル - デバッグのサイクルを短縮することによって、その適時性に貢献します。ただし、実行時のパフォーマンスとコンパイル時のパフォーマンスはどちらもタイムリーな品質を実現するための2番目の要素です。したがって、製品全体の品質と適時性の向上によって正当化される場合にのみ、実行時およびコンパイル時のパフォーマンスの向上を検討する必要があります。

さらに読むための素晴らしい情報源 はこちら

1
Amit Shekhar

私は常に、プログラム処理のオーバーヘッドと、それが前述のようにパフォーマンスに与える影響との関係で考えてきました。簡単な例は、私のオブジェクトに必要な絶対メモリをコードで定義するかどうかです。

定義されたブール値はxメモリを使用します。これはコンパイルされたプログラム内にあり、変更することはできません。プログラムを実行すると、xに割り当てるメモリの量が正確にわかります。

一方、汎用オブジェクト型(つまり、未定義のプレースホルダ、または巨大なBLOBへのポインタなど)を定義しただけでは、プログラムを実行して何かを割り当てるまで、オブジェクトに必要な実際のメモリはわかりませんそのため、評価する必要があり、メモリ割り当てなどは実行時に動的に処理されます(実行時のオーバーヘッドが増えます)。

動的に処理される方法は、言語、コンパイラ、OS、コードなどによって異なります。

そのメモでしかし、それは本当にあなたが実行時対コンパイル時を使用している文脈に依存するでしょう。

1
T.C

これは非常に簡単な答えです。

ランタイムおよびコンパイル時間は、ソフトウェアプログラム開発のさまざまな段階を指すプログラミング用語です。プログラムを作成するために、開発者は最初にプログラムがどのように機能するかを定義するソースコードを書きます。小さなプログラムには数百行のソースコードしか含まれないかもしれませんが、大きなプログラムには数十万行のソースコードが含まれるかもしれません。実行可能プログラムになるためには、ソースコードをマシンコードにコンパイルする必要があります。このコンパイルプロセスはコンパイル時と呼ばれます(コンパイラをトランスレータと見なします)。

コンパイルされたプログラムはユーザーが開いて実行することができます。アプリケーションが実行されているときは、ランタイムと呼ばれます。

「実行時」および「コンパイル時」という用語は、プログラマがさまざまな種類のエラーを指すためによく使用されます。コンパイル時エラーは、プログラムが正常にコンパイルされるのを妨げる構文エラーまたはファイル参照の欠落などの問題です。コンパイラはコンパイル時エラーを生成し、通常、ソースコードのどの行が問題を引き起こしているのかを示します。

プログラムのソースコードがすでに実行可能プログラムにコンパイルされている場合でも、プログラムの実行中にバグが発生する可能性があります。例としては、機能しない機能、予期しないプログラムの動作、プログラムのクラッシュなどがあります。これらの種類の問題は実行時に発生するため、実行時エラーと呼ばれます。

リファレンス

1
Ahmed KhaShaba

静的結合と動的結合という2つの異なるグループに分類できます。対応する値でバインディングがいつ行われるかに基づいています。参照がコンパイル時に解決される場合は静的バインディングであり、参照が実行時に解決される場合は動的バインディングです。静的結合および動的結合は、早期結合および遅延結合とも呼ばれます。時にはそれらは静的多型や動的多型とも呼ばれます。

Joseph Kulandai.

1
user3708939

この例を見てください。

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)

コンパイル時に特定のケースがチェックされたときと同様に、プログラムがすべての条件を満たすと、実行時に特定のケースがチェックされ、出力が得られます。それ以外の場合は、コンパイル時または実行時エラーが発生します。

1
Mathan_kumar

あなたが上司であり、あなたがアシスタントとメイドを持っていて、あなたが彼らにやるべきタスクのリストを与えると想像してください。アシスタント(コンパイル時)はこのリストをつかみ、タスクが理解できるかどうか調べます厄介な言語や構文は書かなかったので、彼はあなたがJobに誰かを割り当てたいのだと理解しているので彼はあなたに彼を割り当て、そして彼はあなたがコーヒーを欲しいと理解し、彼の役割は終わってメイド(ランタイム)それらのタスクを実行するように彼女はあなたにいくつかのコーヒーを作るために行きますが、突然彼女はそれを作ることをやめるか彼女がそれを作るのをやめます。 ).

1
Ala'a

実行時とコンパイル時の主な違いは次のとおりです。

  1. コードに構文エラーと型チェックがあると、コンパイル時エラーが発生します。ここで、実行時:コードの実行後にチェックします。例えば:

int a = 1 int b = a/0;

ここで、最初の行の最後にセミコロンがありません---オペレーションbの実行中にプログラムを実行した後のコンパイル時エラー - >無限の実行時エラー - >.

  1. コンパイル時はコードによって提供される機能の出力を探しませんが、ランタイムは行います。
1
Sindhu

私見あなたはそれが非常に複雑な主題であるのでランタイムとコンパイル時間の違いについて考えるために多くのリンク、リソースを読む必要があります。私は私がお勧めしているこの写真/リンクのいくつかの下にリストがあります。

それが上で述べられていることとは別に、私は時々それに1000語の価値がある絵を加えたいと思います:

  1. この2つの順序は、最初はコンパイル時で、次に実行します。コンパイルされたプログラムは、ユーザーが開いて実行できます。アプリケーションが実行されているときは、ランタイムと呼ばれます。コンパイル時、次にランタイム1です。 compile time and then runtime1 ;

CLR_diagコンパイル時、次にruntime2  CLR_diag compile time and then runtime2

 from Wiki  

https://en.wikipedia.org/wiki/Run_timehttps://en.wikipedia.org/ wiki/Run_time_(program_lifecycle_phase)

実行時、実行時、または実行時は、以下を参照することがあります。

コンピューティング

実行時間(プログラムライフサイクルフェーズ)、コンピュータプログラムの実行期間

ランタイムライブラリ、プログラミング言語に組み込まれた関数を実装するように設計されたプログラムライブラリ

ランタイムシステム、コンピュータプログラムの実行をサポートするように設計されたソフトウェア

ソフトウェアの実行、実行時段階で命令を1つずつ実行するプロセス

enter image description hereenter image description here

enter image description hereenter image description hereenter image description hereenter image description hereenter image description here コンパイラの一覧 enter image description hereenter image description herehttps://en.wikipedia.org/wiki/List_of_compilers

  • googleで検索し、ランタイムエラーとコンパイルエラーを比較します。

runtime errors

compile errors ;

  1. 私の意見では知っておくべき非常に重要なこと:3.1ビルドvsコンパイルとビルドライフサイクルの違い https://maven.Apache.org/guides/introduction/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日に回答しました。

実行とは、バイナリ実行可能ファイル(またはインタプリタ言語の場合はスクリプト)をコンピュータ上で新しいプロセスとして実行することです。コンパイルとは、ある高水準言語で書かれたプログラム(マシンコードと比べてより高い)を構文解析し、構文を調べ、ライブラリーをリンクし、その後最適化を行ってから、出力としてバイナリ実行可能プログラムを作成するプロセスです。この実行可能ファイルは、マシンコード、またはある種のバイトコード(つまり、ある種の仮想マシンを対象とした命令)の形式である可能性があります。ビルドには通常、依存関係のチェックと提供、コードの検査、コードのバイナリへのコンパイル、自動テストの実行、および生成されたバイナリやその他のアセット(イメージ、構成ファイル、ライブラリなど)の展開形式の特定のフォーマットのパッケージ化が含まれます。ほとんどのプロセスはオプションであり、構築しているターゲットプラットフォームに依存するものもあります。例として、Tomcat用のJavaアプリケーションをパッケージ化すると、.warファイルが出力されます。 C++コードからWin32実行可能ファイルを構築することは、単に.exeプログラムを出力するか、または.msiインストーラー内にパッケージ化することもできます。

0
leonidaa

パブリッククラス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{

}

0
sankar banerjee