Python や Java などの言語は、正確で理解しやすいエラー メッセージを表示できるのに、なぜ、どのように機能するのでしょうか?
3 に答える
それは言語ではありません。それはコンパイラの時代です。Unix が大学に普及し始めた 1970 年代後半以降、C は事実上の標準となっています。Microsoft Windows の市場への浸透は、この基準を強化するだけでした。C が標準だったので、人々に C を使ってもらうために優れたコンパイラを書く必要はありませんでした。1970 年代と 1980 年代のマシンでは、適切なエラー メッセージを生成するには、貴重なリソースと見なされる時間とスペースが必要でした。エラーメッセージがひどいものだったとしても、人々は無料の C コンパイラを手に入れて喜んでいました。
古い C コンパイラのエラー メッセージは非常にひどいので、ジョークが飛び交っています。これは、Unix Haters' Handbookの第 2 章からのものです。
ケン・トンプソンは、彼が設計を手伝った自動車を持っています。ほとんどの自動車とは異なり、スピードメーターもガスゲージも、現代のドライバーを悩ませている他の多くの馬鹿げたライトもありません。むしろ、ドライバーがミスをすると、巨大な「?」ダッシュボード中央に点灯。「経験豊富なドライバーは通常、何が問題なのかを知っています」と Thompson 氏は言います。</p>
新しい言語が普及した 1990 年代までに、マシンはより高速になり、より多くのメモリが搭載され、適切なエラー メッセージを提供することがマインドシェアを改善する 1 つの方法になりました。
clangのような比較的新しい C コンパイラを試してみると、優れたエラー メッセージが生成されることがわかります。時には、強調表示や色も含まれます。(Visual Studio からのエラー メッセージもかなり良いに違いありませんが、確かなことはわかりません。)
コンパイル時エラー
コンパイル時のエラーは、通常、条件付きコンパイル (プリプロセッサ、マクロ) と非常に強力なテンプレート (C# や Java よりもはるかに一般的) のおかげでわかりにくいものです。
ただし、それはすべてコンパイラに依存します。たとえば、新しい CLang ははるかに読みやすいエラー メッセージを要求します。
私の意見では、開発はシーケンシャルであり、通常はエラーの行番号で十分です (エラー メッセージを実際に読む必要はありません)。
実行時エラー
パフォーマンス: C/C++ には「ゼロ オーバーヘッド」という目標があるため、たとえば関数名が削除され、関数がインライン化されます。また、多くのエラーは、実装を高速化するための「未定義の動作」です。また、危険な操作であっても、事実上すべてをチェックせずに行うことができます。
そうではありません。多くの C++ コンパイラは、例外時にスタック トレースを生成できます。
これは、プログラミングスタイル/可能性/構文などに追加の制約を適用することで可能になると思います(下位互換性が必要なため、C / C ++などの古い言語ではこれを行うのは非常に困難です)。たとえば、より厳しい制約により、潜在的なエラータイプの数が最小限に抑えられるため、正確なエラー検出が簡素化されます。