プログラムは、データに関する質問に答える結果の計算を表現することを目的としたテキストです。たとえば、並べ替えプログラムは値のリスト(データ)を取得し、同じ値の別のリストである結果を計算しますが、いくつかの比較関数に従って並べ替えられます。
このテキストは、正当なプログラムテキストの構成要素と、このテキストに計算上の意味を関連付ける方法の両方について、正確に定義された(または定義する必要がある)ある種の言語で正式に表現されます。このような正確な定義は、多くの場合抽象的(おそらく数学的)であり、コンピューターの制限などの具体的な問題を無視することがあります。
しかし、その後、プログラムを実行できるように言語が実装されます。元のプログラムテキストのインタプリタを使用するか、いくつかの中間コード(たとえば、バイトコード)にコンパイルしてから、この中間コードを解釈するか、それをさらにマシンコードにコンパイルする可能性があります。そして、他のバリエーションがあるかもしれません。そしてもちろん、コンパイラやインタプリタを書く方法はたくさんあり、それらを実行するマシンもたくさんあります。
さらに、いくつかの正式な定義と、うまくいけば一貫性のあるいくつかの実装があるかもしれません。
エラーは、正式な定義または実装の一方または両方の構造に関連して分類できます。ただし、使用されなくなった古い参照実装に従ってエラーが分類されるという奇妙な状況が発生する可能性があります。
これは基本的に、エラーの分類があまり安定したトピックではないことを意味します。さらに、一部の言語では、何かが間違いなく間違っている(プログラムが実行されない)か、推奨されていないことを行っているかによって、いくつかのレベルのエラーが区別される場合がありますが、それでもある程度の計算が行われます。これは、例外などのプログラミング言語の機能にも反映されており、リカバリーできる場合とできない場合があります。
標準的な違いは次のとおりです。
構文エラー:与えられたテキストは、それが何を意味するかに関係なく、プログラムテキストの構造に適合していません。これは、通常はコンテキストフリーの正式な言語構文のみを指す場合があります。場合によっては、さらに進んで、変数宣言(存在する場合)や型の整合性などのいくつかの基本機能のチェックが含まれることもありますが、これらはセマンティックエラーと見なされることもあります。
意味的または論理的なエラー:これらは、プログラムを実際に実行するときに検出できるエラーです。これは、プログラムがゼロで除算したり、配列にインデックスを付けたりしないなど、意味論上意味のない計算が実行されるためです。境界。間違った数の引数、または間違った型の引数で関数を呼び出すことも、意味上のエラーと見なされる場合があります。一部の言語では、エラーは実際には例外によってユーザー定義である場合があります。エラーは、プログラムの一部でユーザー定義のより高いレベルのセマンティクスに対応している場合です(例外の他の用途もあります)。これらのエラーのいくつかは、実行時に検出されるため、ランタイムエラーとも呼ばれますが、ハードウェア制限エラーと混同しないでください。
ハードウェア制限エラー:これらは、実装が制限のある実際のマシン上にあるという事実によるエラーです。たとえば、これはメモリワードに収まりきらないほどの整数、またはデータ構造を作成するための十分なメモリがない可能性があります。これらは通常、実行時にも検出されます。
セマンティックエラーとハードウェア制限エラーに関して、静的セマンティック分析と呼ばれるものを使用して、プログラムを実行する前にそれらを検出できる場合があります。。これは、宣言や初期化されていない変数、タイプエラー、ゼロによる除算や配列の境界チェックの場合によく見られますが、さらに進んでいる場合があります。静的セマンティック分析は、多くの最適化手法のコンパイラーでも重要です。多くの場合、静的セマンティクスと動的セマンティクスは分離されています。私が想像できる最高の定義は、静的セマンティクスが、実際のデータがなくてもコンパイル時に決定可能なプロパティに関係していることです。したがって、ゼロによる除算は、静的セマンティクスの一部ではありません。これは、いくつかの動的セマンティックエラーがコンパイル時にまだ検出される場合があることを意味しています。ハードウェア制限エラーについても同様です。
しかし、すべての言語設計者または実装者は、契約またはライセンスに拘束されない限り、エラーを分類する権利があります。これは、PHPの例にも当てはまるでしょう。そして、誰もが意味的エラーと論理的エラーを区別するかもしれませんが、これらのエラーについて詳細に知らされない限り、違いを定義する方法はわかりません。1つはインテントのエラー(論理エラー)を示すために使用でき、システムでは検出できません。
プログラムには他の種類のエラーがある可能性があることに注意してください。通常、システムでは検出されません。これには特に、プログラムとその仕様の不整合(または私が意図してエラーと呼んだもの:ユーザーが意図したとおりに動作していない)、または仕様自体のエラーが含まれる可能性があります。また、実数を処理するときの丸めエラーなどのハードウェア制限によるエラーが発生する場合もあります。