コンパイル時とランタイムは、ソフトウェア開発で使用される 2 つのプログラミング用語です。コンパイル時間はソース コードが実行可能コードに変換される時間であり、実行時間は実行可能コードの実行が開始される時間です。コンパイル時と実行時は両方とも、さまざまな種類のエラーを指します。
コンパイル時エラー
コンパイル時エラーは、間違った構文を書いたときに発生するエラーです。プログラミング言語で間違った構文やセマンティクスを作成すると、コンパイラによってコンパイル時エラーがスローされます。コンパイラーは、プログラムからすべてのエラーが除去されるまで、プログラムの実行を許可しません。プログラムからすべてのエラーが除去されると、コンパイラーは実行可能ファイルを生成します。
コンパイル時エラーには次のようなものがあります。
- 構文エラー
- セマンティックエラー
構文エラー
プログラマがどのプログラミング言語の構文にも従わない場合、コンパイラは構文エラーをスローします。
例えば、
配列リストのソート
int a、b:
上記の宣言は C と同様にコンパイル時エラーを生成します。すべてのステートメントはセミコロンで終わりますが、ステートメントの最後にコロン (:) を置きます。
セマンティックエラー
セマンティック エラーは、ステートメントがコンパイラにとって意味を持たない場合に発生します。
例えば、
ネットワークオペレーティングシステム
a+b=c;
上記のステートメントはコンパイル時エラーをスローします。上記のステートメントでは、「c」の値を「a」と「b」の合計に割り当てています。これは、代入演算子の左側には 1 つの変数しか含めることができず、代入演算子の右側には変数を 1 つしか含めることができないため、C プログラミング言語では不可能です。代入演算子には複数の変数を含めることができます。
上記のステートメントは次のように書き直すことができます。
c=a+b;
実行時エラー
ランタイム エラーは、実行中およびコンパイル後に発生するエラーです。実行時エラーの例は、ゼロによる除算などです。コンパイラはこれらのエラーを指摘しないため、これらのエラーを検出するのは簡単ではありません。
典型的な C をいくつか見てみましょう 実行時エラーの種類、ケース 、およびその考えられる影響。
ゼロ除算:
ゼロ除算は 数学的に定義不可能 、整数を除算しようとしています ゼロ につながります ランタイムエラー 。この間違いにより、プログラムがクラッシュしたり、例外が発生したりすることがあります。以下に例を示します。
#include int main() { int a = 10; int b = 0; int result = a / b; // Division by zero printf('Result: %d ', result); return 0; }
出力:
Floating point exception (core dumped)
説明:
あ 「浮動小数点例外」 エラー メッセージは、ゼロによる除算が原因でプログラムで実行時の問題が発生した場合に生成されます。
範囲外の配列へのアクセス:
あ ランタイムエラー 配列要素が特定の制限を超えてアクセスされた場合に発生します。インデックスが配列のサイズより大きく、メモリ アクセス規則に違反している場合、エラーが発生します。以下に例を示します。
グルーヴィーな言語
#include int main() { int arr[5] = {1, 2, 3, 4, 5}; int index = 10; int value = arr[index]; // Accessing array out of bounds printf('Value: %d ', value); return 0; }
出力:
Segmentation fault (core dumped)
説明:
の要素 インデックス10 プログラムが配列にアクセスしようとしたときに、配列の境界を超えています。その結果、 セグメンテーションフォルトが発生する となり、プログラムはエラーで終了します。
Null ポインター逆参照:
あ ランタイムエラー にアクセスしようとすると起こります null ポインタのメモリ として知られるアドレス 逆参照 ヌルポインタ。 null ポインタにアクセスすると、null ポインタが指すものではないため、予期しない動作が発生します。 正当なメモリの場所 。以下に例を示します。
#include int main() { int* ptr = NULL; // Null pointer int value = *ptr; // Null pointer dereference printf('Value: %d ', value); return 0; }
出力:
Segmentation fault (core dumped)
説明:
という試み 逆参照 null ポインタの結果は、 セグメンテーション違反 、これによりプログラムがクラッシュし、エラー メッセージが表示されます。
スタックオーバーフロー:
あ スタックオーバーフロー 関数呼び出しに関する情報を含む呼び出しスタックが意図したよりも大きくなった場合に発生します。アン 無限再帰 通常、再帰関数に適切な終了基準がない場合に発生します。以下に例を示します。
#include void recursiveFunction() { recursiveFunction(); // Recursive call without termination condition } int main() { recursiveFunction(); return 0; }
出力:
アメリカは何都市ですか
Segmentation fault (core dumped)
説明:
プログラムが開始されます 無限の再帰 これによりスタックがオーバーフローし、セグメンテーション違反が発生します。
未使用の変数:
なぜなら 初期化されていない変数 持っている 未定義の値 、それらを使用すると、実行時エラーが発生する可能性があります。状況によっては、プログラムが予期しない結果をもたらしたり、クラッシュしたりする可能性があります。以下に例を示します。
#include int main() { int uninitializedVariable; printf('Value: %d ', uninitializedVariable); // Using uninitialized variable return 0; }
出力:
Some random value (varies each time)
説明:
コマンドをarpする
この例では、 初期化されていない変数 変数に指定されたメモリ領域からランダムに選択された任意のランダム値を指定できます。
コンパイル時と実行時の違いを見てみましょう。
コンパイル時 | ランタイム |
---|---|
コンパイル時エラーはコンパイル時に生成され、コンパイラによって検出されるエラーです。 | 実行時エラーは、コンパイラによって生成されず、実行時に予測できない結果を引き起こすエラーです。 |
この場合、コンパイラは、プログラム内でエラーを検出すると、コードの実行を阻止します。 | この場合、コンパイラはエラーを検出しないため、コードの実行を防ぐことができません。 |
これには、ステートメントの末尾にセミコロンがないなど、構文および意味上のエラーが含まれています。 | ゼロによる除算、負の数の平方根の決定などのエラーが含まれます。 |
コンパイル時エラーの例
#include int main() { int a=20; printf('The value of a is : %d',a): return 0; }
上記のコードでは、「a」の値を出力しようとしましたが、エラーがスローされます。ステートメントの最後にセミコロンの代わりにコロンを配置しているため、このコードはコンパイル時エラーを生成します。
出力
実行時エラーの例
#include int main() { int a=20; int b=a/0; // division by zero printf('The value of b is : %d',b): return 0; }
上記のコードでは、「b」の値をゼロで除算しようとしていますが、これにより実行時エラーがスローされます。
出力
結論:
結論から言えば、以下の期間は、 ソフトウェア開発 として知られている コンパイル時 そして 実行時エラー は別々であり、それぞれに固有のセットがあります。 故障 それが起こるかもしれない。 コンパイル時エラー コンパイル手順中にコードが実行可能形式に変換されるときに発生します。これらのエラーには次のものが含まれます セマンティックエラー を生み出す 非論理的な または 不条理なコード 、 そして 構文の誤り 、これはプログラミング言語の法則に反します。これらのエラーは、 コンパイラ そして報告した、 実行を阻止する 修正されるまでコードを修正してください。
一方で、 実行時エラー プログラムの実行中に発生しますが、コンパイラによって捕捉されません。これらは、次のようないくつかの条件によって発生する可能性があります。 ゼロ除算、誤ったメモリアクセス 、またはその他の予期せぬ出来事。 実行時エラー プログラムのクラッシュや予期しない動作が頻繁に発生するため、発見とデバッグがより困難になります。実行時エラーを適切に管理し、プログラムの安定性を保証するために、開発者は次のコマンドを使用します。 エラー処理テクニック のように 例外処理 。