ランタイムとコンパイル時間


370

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


私は非常に小さいが明確な例を挙げました...それは非常に細部に威圧されません。その後、すべての答えが通り抜けるかもしれません。彼らは素晴らしい...
sankar banerjee 19/07/25

回答:


479

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

  1. プログラムはどの不変条件を満たしますか?
  2. このフェーズで何がうまくいかないのでしょうか?
  3. フェーズが成功した場合、事後条件は何ですか(何を知っていますか)。
  4. もしあれば、入力と出力は何ですか?

コンパイル時間

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

実行時間

  1. プログラムの不変条件については何も知りません---プログラマーが入力したものは何でもです。実行時の不変条件は、コンパイラーだけで強制されることはめったにありません。プログラマーの助けが必要です。
  2. うまくいかない可能性があるのは実行時エラーです:

    • ゼロ除算
    • nullポインターの逆参照
    • メモリ不足

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

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

13
それがカバーするもの(+1)については非常に良い答えですが、コンパイル時と実行時のメタプログラミングの側面についても触れないでください。これは、IMHOが最も興味深い部分です。この回答が受け入れられれば、OPが求めていた範囲から外れる可能性があることを認めます。
BCS

4
いいです、私の講義中に誰かが私にそれについて尋ねた場合、私はあなたの答えを使います:-)
e-

12
これは本当にいい答えです。それはかなり明確でわかりやすいです。Googleでそれほど明確な答えを見つけるのは簡単ではありません。
Tarik、

7
あなたがしばらくプログラミングしたとしても、それを得るのはまだ簡単ではありません...それは初心者の人だけではありません。OPによる良い質問。
PositiveGuy

11
「プログラムは不変条件を満足する必要はありません。実際、それは整形式のプログラムである必要はありません。このHTMLをコンパイラーにフィードして、それを見ることができます...」私はあなたの言っていることがわかりませんここに。これは、この技術的なごみでいっぱいではなく、簡単に説明できますか?
PositiveGuy

175

私はそれをエラーの観点から、そしていつキャッチされるのかを考えています。

コンパイル時間:

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

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

実行時間:

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

ここでの結果は、ReadLine()によって返された文字列によって異なります。一部の値はintに解析できますが、他の値はできません。これは実行時にのみ決定できます


59
これは私たち全員が理解できることです。ここに一般的なゴミ技術用語はありません。いいね。
PositiveGuy

iPhoneアプリの場合:開発者がコードを.app拡張機能にコンパイルするのは、コンパイル時が初めてですか?または、ユーザーがアプリ起動するたび起動に発生ますか?
ハニー、

1
これは.APPに開発者が最初にコンパイルされ@Honey
maytham-ɯɐɥʇʎɐɯ

2
これは、概念的にコンパイル時と実行時の違いをカバーする優れた最終的な回答です。私は同様に選ばれた学問的な教授の答えに感謝しますが、これは明確で簡潔です。この回答を読んだ後は、戻って選択した回答を読むことができます。ありがとう
mojave 2018

72

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

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

より明確な定義が必要ですか?


12
@BCS:OPは、インタプリタ言語またはバイトコンパイルしてから実行されるワンステップ言語を使用したプログラミングを非常に簡単に紹介していたため、区別が必要になることはありませんでした。素朴な質問ですがばかげていません
dmckee ---元モデレーターの子猫

@dmckee:この答えは元の質問よりも多くの情報コンテンツを持たないため、ユーザーにとっても役に立たないと思います。この答えが答えるという質問をする人は誰もビジネスプログラミングを持っていません(そして私 OPがそれを求めていたとは思いません)。
BCS

簡単な質問があります。典型的なランタイムエラーがゼロで除算されていると誰かが言ったとき、変数がある場合はどうでしょうかint x = 3/0。何も印刷しません。それでも実行時エラーと見なされますか?
ロッベン、2015年

iPhoneアプリの場合:開発者がコードを初めて.app拡張子にコンパイルするのはコンパイル時ですか?または、ユーザーがアプリを起動するたびに起動時に発生しますか?開発者のコ​​ードがコンパイルされているコンパイル時間である場合、なぜそれを気にするのでしょうか?これはユーザーエクスペリエンスに影響しないということですか?それは開発者を時間を無駄にするだけなので!
ハニー

1
それはあなたがそれを使用いけない場合でも、ランタイムエラーになります私はあなたがすべてのこの時間後にあなたの答えを持っていると仮定し、しかし、私はothers.yesのためにそれにお答えします@Robben
فربدضروري

22

編集:以下は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

例外。ハッシュテーブルは1つでしたが、最大のステップは.net 1.1から.net 2.0になり、型なしから型付きのデータセット(そして今ではlinq)になりました。危険なデータベースを使用して壊れたフォームをトラブルシューティングしようとすると、とても悲しくなります。
スペンス、

19

ソースコードから[画面|ディスク|ネットワーク]への変換は、(おおよそ)2つの方法で実行できます。それらをコンパイルおよび解釈と呼びます。

コンパイルされたプログラム(例としては、CおよびFortranです)。

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

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

解釈プログラム(例えば、マイクロソフトのDOS上の基本的な()とPython(と思います)):

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

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

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

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


11

基本的に、コンパイラがあなたの意味や「コンパイル時」の値を理解できる場合、これをランタイムコードにハードコードできます。明らかに、実行時コードが実行速度が遅くなるたびに計算を行う必要がある場合、コンパイル時に何かを決定できる場合は、はるかに優れています。

例えば。

一定の折りたたみ:

私が書いた場合:

int i = 2;
i += MY_CONSTANT;

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


また、ランタイムバインドコードよりもコンパイル時コードを維持する方が簡単です。コンパイル時に、コンパイラを使用していくつかのものをチェックできます。実行時に同じものをテストすると、チェックに時間がかかるようになります。
user1154664

10

うーん、まあ、ランタイムは、プログラムの実行中に発生する何かを記述するために使用されます。

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


8

コンパイル時間:

コンパイル時に行われる処理は、結果として得られるプログラムの実行時に(ほとんど)コストがかかりますが、プログラムのビルド時に大きなコストがかかる可能性があります。

ランタイム:

ほぼ正反対です。ビルド時のコストはほとんどなく、プログラムの実行時のコストは高くなります。

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

関連性

これが重要な例として、ユニットキャリングタイプがあります。コンパイル時のバージョン(Boost.UnitsまたはDの私のバージョンなど)は、ネイティブの浮動小数点コードの問題を解決するのと同じくらい高速になり、実行時のバージョンは、値の単位に関する情報をパックする必要があります。で、すべての操作と一緒にそれらのチェックを実行します。一方、コンパイル時バージョンは、値の単位がコンパイル時にわかっていることを前提としており、それらがランタイム入力に由来する場合を処理できません。


8

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

コンパイル/コンパイル時間/構文/セマンティックエラー:コンパイルまたはコンパイル時エラーは、入力ミスが原因で発生したエラーです。プログラミング言語の適切な構文およびセマンティクスに従わない場合、コンパイラによってコンパイル時エラーがスローされます。すべての構文エラーを削除するか、コンパイル時エラーをデバッグするまで、プログラムは1行を実行できません。
例:Cのセミコロンがない、またはとタイプミスしintているInt

実行時エラー:実行時エラーは、プログラムが実行状態にあるときに生成されるエラーです。これらのタイプのエラーにより、プログラムが予期せぬ動作をしたり、プログラムが強制終了される場合があります。それらはしばしば例外と呼ばれます。
例:存在しないファイルを読み取っていると、ランタイムエラーが発生するとします。

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


7

他の答えへのアドオンとして、ここに私が素人にそれを説明する方法があります:

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

造船所に設計図を渡して、造船中に欠陥を見つけた場合、造船所は造船を中止し、船が乾ドックを離れたり水に触れたりする前にすぐに報告します。これはコンパイル時のエラーです。船が実際に浮いたり、エンジンを使用したりすることさえありませんでした。船が作られさえしなかったため、エラーが見つかりました。

コードがコンパイルされると、完成した船のようです。ビルド済みですぐに使用できます。コードを実行すると、船を航海に出すようなものです。乗客は搭乗し、エンジンが作動しており、船体は水上にあるため、これはランタイムです。乙女の航海(または多分余分な頭痛のための航海)で沈む致命的な欠陥が船にある場合、ランタイムエラーが発生しました。


5

例:強く型付けされた言語では、型はコンパイル時または実行時にチェックできます。コンパイル時にそれは、型に互換性がない場合にコンパイラが文句を言うことを意味します。実行時とは、プログラムを正常にコンパイルできることを意味しますが、実行時に例外がスローされます。


4

簡単に言うと、コンパイル時間と実行時間の違いです。

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

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


4

コンパイルの主題に関する、「JAVAプログラミング入門」の著者であるDaniel Liangからの引用は次のとおりです。

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

...彼は続けます...

「コンパイラーはソースコード全体をマシンコードファイルに変換し、マシンコードファイルが実行されます。」

高レベル/人間が読めるコードを打ち込むとき、これは最初は役に立たないです!これは、ごく小さなCPUでの「電子的な出来事」のシーケンスに変換する必要があります。これに向けた最初のステップはコンパイルです。

簡単に言うと、コンパイルエラーはこのフェーズで発生し、実行エラーは後で発生します。

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

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

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

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

実行時エラーの例:

メモリ不足-たとえば、再帰関数の呼び出しは、特定の程度の変数を指定すると、スタックオーバーフローを引き起こす可能性があります。コンパイラはこれをどのように予測できますか?できない。

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


2

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

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


2

コンパイル時間:

コンパイル時に行われる処理は、結果として得られるプログラムの実行時に(ほとんど)コストがかかりますが、プログラムのビルド時に大きなコストがかかる可能性があります。ランタイム:

ほぼ正反対です。ビルド時のコストはほとんどなく、プログラムの実行時のコストは高くなります。

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


2

コンパイル時間: ソースコードを実行可能コードになるようにマシンコードに変換するのにかかる時間をコンパイル時間と呼びます。

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

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


2

あなたが上司であり、アシスタントとメイドがいて、彼らに実行するタスクのリストを与えると想像してください。アシスタント(コンパイル時)がこのリストを取得し、タスクが理解できるかどうか、そしてあなたが厄介な言語や構文で書かれていなかったため、ジョブに誰かを割り当てたいと彼は理解しているので、彼をあなたに割り当て、コーヒーを飲みたいと理解しているので、彼の役割は終わり、メイド(実行時)これらのタスクの実行を開始するため、彼女はあなたにいくつかのコーヒーを作りに行きますが、突然、作るコーヒーが見つからないため、彼女は作るのをやめるか、別の方法でお茶を作ります(エラーを見つけたためにプログラムが別の方法で動作するとき) )。


1

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

製品の実行時のパフォーマンスは、結果をより早く提供することにより、品質に貢献します。製品のコンパイル時のパフォーマンスは、編集、コンパイル、デバッグのサイクルを短縮することにより、適時性に貢献します。ただし、実行時のパフォーマンスとコンパイル時のパフォーマンスの両方が、タイムリーな品質を実現するための二次的要素です。したがって、製品全体の品質と適時性の改善によって正当化される場合にのみ、実行時とコンパイル時のパフォーマンスの改善を検討する必要があります。

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


1

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

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

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

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

ただし、その点については、実際に実行時間とコンパイル時間のどちらを使用しているかによって異なります。


1

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

ジョセフ・クランダイ。


1

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

  1. コードに構文エラーと型チェックがある場合は、コンパイル時エラーをスローします。コードは、run-time:itとしてコードの実行後にチェックします。例えば:

int a = 1 int b = a/0;

ここで、最初の行の最後にセミコロンはありません--->操作bの実行中にプログラムを実行した後のコンパイル時エラー、結果は無限--->実行時エラーです。

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

1

ここに非常に簡単な答えがあります:

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

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

「ランタイム」および「コンパイル時」という用語は、さまざまなタイプのエラーを指すためにプログラマーがよく使用します。コンパイル時エラーは、構文エラーやファイル参照の欠落などの問題であり、プログラムを正常にコンパイルできません。コンパイラはコンパイル時エラーを生成し、通常、問題の原因となっているソースコードの行を示します。

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

リファレンス


0

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

上記で述べたこととは別に、時には1000ワードに相当する画像を追加したいと思います。

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

CLR_diagコンパイル時間、次にruntime2  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ここに画像の説明を入力してください ここに画像の説明を入力してください

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

実行時エラー

コンパイルエラー ;

  1. 私の意見では、知っておくべき非常に重要なこと: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 フェルナンドパドアン、言語設計に少し興味がある開発者回答済み2月23日答えは後戻り他の答えへ:

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


0

この例を見てください:

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)

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


0

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

実際のコードを読むことで、コードのコンパイル構造を理解できます。使用されたパターンを理解しない限り、実行時の構造は明確ではありません。


-1

これはSOに適した質問ではありません(特定のプログラミングの質問ではありません)が、一般に悪い質問ではありません。

それが取るに​​足らないことだと思う場合:読み取り時とコンパイル時についてはどうですか?これはいつ区別すると便利ですか?コンパイラーが実行時に使用できる言語についてはどうですか?Guy Steele(ダミーではない、彼)は、CLプログラマーがこれを制御するために使用できるEVAL-WHENについてCLTL2で7ページを書きました。定義には2文でかろうじて十分ですが、それ自体は説明にはほど遠いものです。

一般に、言語デザイナーが避けようとしているように見えるのは難しい問題です。彼らはしばしば「ここにコンパイラがあります、それはコンパイル時のことをします;それ以降はすべてランタイムです、楽しんでください」と言います。Cは実装が簡単になるように設計されており、計算のための最も柔軟な環境ではありません。実行時にコンパイラーを使用できない場合、または式が評価されるタイミングを簡単に制御する機能がない場合、マクロの一般的な使用を偽造するために言語のハックが発生する傾向があるか、ユーザーがシミュレーションするデザインパターンを思い付くより強力な構造を持っています。実装が簡単な言語は間違いなく価値のある目標ですが、だからといってそれがプログラミング言語の設計のすべてであるというわけではありません。(私はEVAL-WHENをあまり使用しませんが、それなしの人生を想像することはできません。)

そして、コンパイル時と実行時の問題空間は巨大であり、未だ大部分が調査されていません。それは、SOが議論を行うのに適切な場所だと言っているわけではありませんが、私はこの領域をさらに探索することをお勧めします。質問は単純でも馬鹿でもないし、少なくとも審問官を正しい方向に向けることができた。

残念ながら、これに関する適切な参考資料は知りません。CLTL2は少しそれについて話しますが、それについて学ぶのは素晴らしいことではありません。


4
あなたにとって良いプログラミングの質問ではないものはすべて相対的です。それは素晴らしい質問だと思ったし、もっと知りたかった。はい、私は一般的な「概念」と、コンパイル時と実行時とは何かを知っていますが、実行時とコンパイル時で実際に発生する問題を知りたいです。それはあなたがプログラムするときに重要であり、気づく必要があるそれらの陰謀です。それはあまり具体的ではないので、彼が尋ねているのはそのためです。人々がここに座って、このような一般的な質問は、開発者が把握する最も重要な質問のいくつかであるときは意味がないと言うのは嫌です。
PositiveGuy

1
質問に価値がない場合は、それが問題です。それが一般的であるならば、それには理由があります。一般的な質問が嫌いだからといって、世界があなたの役に立つと思うことを中心に展開しているわけではありません。彼はこれを尋ねることに特定の意図を持っており、彼は両方をよりよく理解して定義するための幅広い回答を求めています。それを得る?
PositiveGuy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.