Stack Overflowには、C標準について常に語る経験豊富な人々がいます。たとえ私のために働いていても、人々は非ポータブルなソリューションを好まないようです。わかりました、標準に従う必要があることを理解していますが、プログラマーの創造性に束縛をかけませんか?
標準に従うことから得られる具体的な利点は何ですか?特に、コンパイラは標準をわずかに異なる方法で実装する場合があるためです。
Stack Overflowには、C標準について常に語る経験豊富な人々がいます。たとえ私のために働いていても、人々は非ポータブルなソリューションを好まないようです。わかりました、標準に従う必要があることを理解していますが、プログラマーの創造性に束縛をかけませんか?
標準に従うことから得られる具体的な利点は何ですか?特に、コンパイラは標準をわずかに異なる方法で実装する場合があるためです。
回答:
標準に準拠することが良いことである理由はいくつかあります。
コンパイラーにロックされているのは大変なことです。あなたは完全に彼ら自身のアジェンダを持つ開発者のグループに翻弄されています。彼らは明らかにあなたや何かを手に入れようとはしていませんが、コンパイラが最適化、新機能、セキュリティ修正などに遅れを取り始めた場合、あまりにも悪いです。あなたが立ち往生しています。極端な場合、一部の企業は、依存しているツールにパッチを適用する必要があります。他の作業ツールが存在する場合、これは莫大なお金と時間の無駄です。
プラットフォームにロックされていると、さらに難しくなります。Linuxでソフトウェアをプッシュしていて、市場が本当にあることに気付いてWindowsに切り替えたい場合は、コード内にあるすべての非ポータブルハックを変更して、うまくプレイできるようになります。 GCCとMSVCの両方で。そのようなものに基づいたコアデザインのいくつかの部分がある場合は、幸運を祈ります!
後方互換性のない変更が最も困難です。標準はコードを壊しません(Pythonを無視します)。ただし、一部のランダムなコンパイラ作成者は、実際にこの実装固有のアドオンはトラブルに見合う価値がないと判断し、削除する可能性があります。たまたまそれを頼りにしているのなら、あなたはそれが最後に残っていた古い古いバージョンに固執しています。
したがって、ここで最も重要なメッセージは、標準に準拠することで、より柔軟になります。あなたはより限られた言語を確かに持っていますが、あなたはもっと持っています
それは微妙なバランスですが、標準を完全に無視することは間違いです。移植性のない方法で実装される可能性のある抽象化に依存するようにCコードを整理する傾向がありますが、抽象化に依存するすべてを変更せずに透過的に移植できます。
標準は、プログラムの意味を定義する、ユーザーとコンパイラ間の一種の「契約」です。プログラマーとして、私たちはしばしば言語がどのように機能するかの特定のメンタルモデルを持ち、このメンタルモデルはしばしば標準と対立しています。(たとえば、Cプログラマーは、ポインターを大まかに「メモリアドレスを示す整数」と考えるため、メモリーを示す整数で実行する可能性のあるポインターで算術/変換/操作を実行しても安全であると想定します。アドレス。この仮定は標準と一致していません。実際には、ポインタでできることに対して非常に厳しい制限を課しています。
それで、あなた自身のメンタルモデルではなく、標準に従うことの利点は何ですか?
簡単に言えば、それは標準が正しいことであり、あなた自身のメンタルモデルが間違っているということです。通常、メンタルモデルは、すべてのコンパイラの最適化が無効になっている、一般的なケースで、システムでの動作の単純化されたビューです。コンパイラベンダーは通常、特に最適化に関しては、準拠する努力をしません。(契約の終了を延期しない場合、ガベージイン、ガベージアウトなど、コンパイラに特定の動作を期待することはできません。)
たとえ私のために働いていても、人々は非ポータブルなソリューションを好まないようです。
「たとえ彼らが私のために働いているように見えても」と言う方が良いかもしれません。コンパイラーが特定の動作が機能することを明確に文書化しない限り(つまり、適切な標準とコンパイラー文書で構成される充実した標準を使用している場合を除き)、それが本当に機能するか、本当に信頼できるかはわかりません。たとえば、符号付き整数のオーバーフローは通常、多くのシステムでラッピングされます(したがって、INT_MAX+1
通常はINT_MIN
)。ただし、コンパイラは符号付き整数演算が(正しい)Cプログラムでオーバーフローしないことを「知って」おり、知識"。
-fwrapv
を使用してコンパイルでき、その後、符号付き整数演算が常にラップする、わずかに異なる非標準言語を使用しています。
標準に従う必要があることは理解していますが、プログラマーの創造性に束縛をかけませんか?異なるコンパイラが標準に従う方法にはまだいくつかの違いがあります。たとえば、非常に優れたパフォーマンスと速度で機能するコードを書くことができます。それは重要なことですが、それでも必ずしも標準に厳密に従うとは限りません。
いいえ。標準は何が許可されているかを示しています。指定されていない場合、未定義の行動領域にあり、すべての賭けはオフです-プログラムは何でも自由に行えます。
void main()
vsの特定の例を挙げたのでint main()
、答えを改善できます。
void main()
メイン関数の標準宣言ではありません。拡張機能を介して一部のコンパイラで動作する場合がありますが、実装に依存しています。それが機能する場合でも、あなたが望むことをするかどうかを確認する必要があります。問題は、コンパイラ開発者がvoid main()
次のコンパイラリリースで削除することを決定し、アプリケーションが破損する可能性があることです。
一方、標準ではmainの署名が明確に定義されてint main()
おり、何をすべきかが示されています。
一方、標準では定義されていないものがあります。次に、別の標準が適用される場合があります(POSIXなど)。c ++ 03標準プログラムは1スレッドであるため、最良の例はc ++ 03でのスレッド実装です。その場合、プラットフォーム依存ライブラリ、またはboostのようなものを使用する必要があります。
プロジェクトが政府プロジェクトや軍隊プロジェクトなどの特別なプロジェクトに関するものである場合はルールを守らないでください。ただし、オープンソースや分散チームとの大規模なプロジェクトについて話す場合はルールに従う必要があります。