this および this のスタックオーバーフローの質問では、コンパイラバックエンドとしてのCは悪い考えであると回答が述べています。
しかし、なぜ?
Cには、大幅に最適化できるコンパイラが多数あります。すべてのプラットフォームには、それをサポートするコンパイラがあり、存在するすべてのアーキテクチャにコンパイルできます。さらに、Nimや [〜#〜] v [〜#〜] などの言語は、Cコードの生成をサポートしています。
だから、なぜCが悪い考えなのか、私にはまったくわかりません。私の見解では、それはかなり良い選択のようです。
どのような基準に従って、それが良いソリューションか悪いソリューションかを評価しますか?知らないうちに、私たちは客観的な助言よりも主観的な信念を持っています。
つまり、普遍的な善悪はありません。
すべてのプラットフォームには、それをサポートするコンパイラがあり、存在するすべてのアーキテクチャにコンパイルできます。
しかし、それらすべてが同じように動作するわけではありません。コンパイラー作成者として、私のint
sが実際に4バイトであるかどうかを判断するために、configureスクリプトに依存する(または作成する)必要はありません。私は、いくつかの未定義の動作のCコンパイラーの実装に依存していたため、いくつかの難解なプラットフォームで奇妙なバグを追いかけたくありません。そして、私は本当にGod-knows-whatによって最適化されたいくつかのCコードのダンプを検査したくありません。
LLVMやその他の一般的なバックエンドターゲットは、コードを書くときに操作するのが少し難しいですが、コードが記述された後はveryそれらがどのように動作するかについて明確であり、(一般的に)コンパイラの開発者が作成することのできる破局の種類をデバッグするための専用ツールがあります。
Cがコンパイラにとって適切なバックエンドではない理由は簡単です。
すべての翻訳は不完全です。
したがって、ソース言語をターゲット言語に完全にマッピングできず、したがってCに非常に類似している場合を除き、翻訳はすべてではないにせよ、偽の制約を追加したり、複雑にしたり、間違ったりします。
コンパイラライターのターゲット言語は、通常、ソース言語のかなりクリーンで効率的なマッピングを可能にするように設計されています。
Cには独自のセマンティクスがあり、それを直接書き込むために作成されたものであり、それ以外の目的のために作成されたわけではありません。