タイトルはすべてを言います。特にC/C ++について話しているのは、どちらもこれを「実装の問題」と見なしているためです。標準のインターフェースを定義することで、その上にモジュールシステムを構築するのが簡単になると思います。
標準のABIを定義した場合、C / C ++は何を「失う」可能性がありますか?
8 に答える
各プロセッサに最も自然な方法で物事を実装する自由。
特にcは、他のどの言語よりも多くの異なるアーキテクチャーに準拠した実装を持っていると思います。現在一般的なハイエンドの汎用CPU用に最適化されたABIを順守するには、いくつかの奇妙なマシンで不自然なゆがみが必要になります。
ABIが選択されたプラットフォームを除くすべてのプラットフォームでの下位互換性。
基本的に、C++14の提案の1つが実際に標準のABIを定義していることを誰もが見逃していました。これは、C++のサブセットを使用するライブラリ専用の標準ABIでした。「ABI」コードの特定のセクション(名前空間など)を定義し、サブセットに準拠する必要があります。
それだけでなく、C++の専門家であり「ExceptionalC++」シリーズの著者であるTHEHerbStutterによって書かれました。
この提案は、ポータブルABIが難しい多くの理由と、斬新なソリューションに当てはまります。
https://isocpp.org/blog/2014/05/n4028
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4028.pdf
彼は「ターゲットプラットフォーム」をCPUアーキテクチャ(x64、x86、ARMなど)、OS、およびビットネス(32/64)の組み合わせとして定義していることに注意してください。
したがって、ここでの目標は、実際にはC ++コード(Visual Studio)が同じプラットフォーム上の他のC ++コード(GCC、古いVisual Studioなど)と通信できるようにすることです。携帯電話のライブラリをWindowsマシンで実行できるようにするのはユニバーサルABIの目標ではありません。
この提案はC++14で承認されませんでしたが、さらなる議論/反復のためにC++17の「進化」段階に移されました。
そのため、2017年1月の時点で、私の指は交差したままです。
すべてのプラットフォームに対応する汎用ABIではなく(1つのプラットフォームにのみ最適であるため、悲惨な結果になります)。規格の委員会は、各プラットフォームが特定のABIに準拠すると言うことができます。
しかし:誰がそれを定義しますか(ドアを通り抜ける最初のコンパイラ?)。その場合、彼らは過度の競争優位を獲得します。または、5年間のコンパイラーの後の委員会(これは別の恐ろしい考えです)。
また、コンパイラーが新しい最適化戦略をさらに調査する余地を与えることはありません。標準が定義された時点で利用可能なトリックにとらわれることになります。
C(またはC ++)言語仕様は、ソース言語を定義します。彼らはそれを実行しているプロセッサを気にしません(ACプログラムは人間の奴隷によってさえ解釈される可能性がありますが、それは非倫理的で費用効果が高くありません)。
ABIは、定義上、ターゲットシステムに関するものです。これは、プロセッサとシステム(およびABIに続く既存のライブラリ)に関連しています。
過去には、一部のプロセッサには独自の(つまり非公開の)仕様があり(マシンの命令セットが公開されていなくても)、非公開のABIがあり、その後にコンパイラが続きました(多かれ少なかれ言語標準を尊重しています)。 )。
プログラミング言語の定義には、ABIの定義と同じスキルセットは必要ありません。
既存のプロセッサ用に新しいABIを定義することもできますが、それは多くの作業(コンパイラのパッチ適用、CおよびC ++標準ライブラリと必要なすべてのユーティリティおよびライブラリを含むすべてのものの再コンパイル)を必要とするため、通常は役に立ちません。
ほとんどのプラットフォームでは、実行速度が大幅に低下します。多くの組み込みプラットフォームにC言語を使用することはもはや合理的ではない可能性が高いほどです。標準化団体は、ABIと互換性のないさまざまなチップのメーカーによって提起された反トラスト訴訟の責任を負う可能性があります。
標準のABIは1つではなく、約1000です。OSとプロセッサアーキテクチャの組み合わせごとに1つ必要になります。
最初は、何も失われません。しかし、最終的には、誰かが恐ろしいバグを見つけて、それを修正してABIを壊すか、そのままにしておくと問題が発生します。
今の状況はいいと思います。どのOSも、それ自体のABIを自由に定義できます(そして、そうします)。これは理にかなっています。C / C ++標準ではなく、ABIを定義するのはOSの仕事です。
Cには常に標準のABIがあり、これは最も標準的なABIに使用されるものでもあります(つまり、異なる言語またはシステムが相互にバインドする必要がある場合、C ABIが選択されるABIです)。C ABIは、他のABIに共通するABIの一種です。C ++は拡張されているものの、より複雑であり、したがってCに基づいています。実際、C ++の標準ABIはより困難であり、C++コンパイラがターゲットマシンコードを独自に実装する自由に問題をもたらす可能性があります。ただし、実際には標準のABIがあるようです。Itanium C++ABIを参照してください。
ですから、問題は「何を失うのか」ではなく、「何を失うのか」ということかもしれません。(もし彼らが本当に何かを失ったとしても)。
補足: ABIは常にアーキテクチャとOSに依存することを覚えておく必要があります。したがって、「標準ABI」が意味するのが「アーキテクチャとプラットフォーム全体の標準」である場合、そのようなものは存在しなかったか、存在しなかった可能性がありますが、通信プロトコルです。