1. ホーム
  2. assembly

[解決済み] なぜx86は醜いのか?なぜ他と比較して劣っていると言われるのか?[クローズド]

2022-10-27 17:19:52

質問

SOのアーカイブをいくつか読んでいて、x86アーキテクチャに対する発言に遭遇しました。

などなど、たくさんのコメントがあります。

検索してみましたが、理由は見つかりませんでした。x86 が悪いとは思わないのは、おそらくこれが私がよく知る唯一のアーキテクチャだからでしょう。

どなたか、x86 が他と比べて醜い/悪い/劣っていると考える理由を教えていただけませんか。

どのように解決するのですか?

考えられる理由はいくつかあります。

  1. x86 は比較的古い ISA です (その前身は 8086 でした)。
  2. x86 は何度か大きく進化しましたが、古いバイナリとの後方互換性を維持するためにハードウェアが必要です。たとえば、最新の x86 ハードウェアは、16 ビット コードをネイティブに実行するためのサポートをまだ含んでいます。さらに、リアルモード、プロテクトモード、仮想 8086 モード、 (amd64) ロングモードなど、古いコードが同じプロセッサ上で相互運用できるように、 いくつかのメモリアドレシングモデルが存在します。このため、一部の人は混乱する可能性があります。
  3. x86 は CISC マシンです。長い間、これは MIPS や ARM のような RISC マシンよりも遅いことを意味しました。 データの相互依存性とフラグ を持つため、命令レベルの並列処理を行うことが困難でした。最近の実装では、x86 命令は " と呼ばれる RISC ライクな命令に変換されます。 マイクロ演算 と呼ばれる RISC ライクな命令に変換し、この種の最適化をハードウェアで実用的に実装できるようにします。
  4. ある点では、x86 は劣っているわけではなく、ただ違うだけです。たとえば、大半のアーキテクチャでは、入出力はメモリ マッピングとして処理されますが、x86 ではそうではありません。(注意: 最近の x86 マシンは通常、何らかの形で DMA をサポートし、メモリ マッピングを通じて他のハードウェアと通信します。 ISA のような I/O 命令はまだあります。 INOUT )
  5. x86 ISA は非常に少数のアーキテクチャレジスタしか持たないため、プログラムが必要以上に頻繁にメモリを往復することを余儀なくされることがあります。 このために必要な余分な命令は、有用な作業に使うことができる実行リソースを奪うことになります。 効率的なストアフォワーディング はレイテンシを低く抑えます。 x86-64 では整数およびベクトル レジスタが 8 本から 16 本に増加しましたが、これは 64 ビット コードが 32 ビットより高速になった最大の要因の 1 つです (より効率的なレジスタ コール ABI と共に)、各レジスタの幅が増加したわけではありません。 整数レジスタを16本から32本に増やせば、多少は効果がありますが、それほどでもないでしょう。 (AVX512ではベクタレジスタを32本にしていますが、これは浮動小数点コードはレイテンシが高く、より多くの定数が必要になることが多いためです)。 ( コメントを見る )
  6. x86 は多くの機能を持つ複雑なアーキテクチャであるため、x86 のアセンブリコードは複雑です。典型的な MIPS マシンの命令一覧は、レター サイズの紙 1 枚に収まります。x86 の同等のリストは数ページを占め、命令にはより多くの機能があるため、リストで提供できるよりも多くの説明が必要になることがよくあります。例えば MOVSB 命令 は、それが何をするのかを記述するために、比較的大きなCコードのブロックが必要です。

    if (DF==0) 
      *(byte*)DI++ = *(byte*)SI++; 
    else 
      *(byte*)DI-- = *(byte*)SI--;
    
    

    これは、ロード、ストア、2つの加算または減算(フラグ入力で制御)を行う1つの命令で、RISCマシンではそれぞれ別の命令となります。

    MIPS (および類似のアーキテクチャ) が単純だからといって必ずしも優れているわけではありませんが、アセンブラ入門のクラスで教えるには、より単純化された ISA . と呼ばれる x86 の超簡易化されたサブセットを教えるアセンブラのクラスもあります。 y86 と呼ばれる超簡略化された x86 のサブセットを教えるクラスもありますが、これは実際の使用には役に立たないほど単純化されています (たとえば、シフト命令がない)。

  7. x86 は可変長のオペコードを使用しており、命令の解析に関してハードウェアの複雑さが増しています。現代では、CPU が生の計算よりもメモリ帯域幅によってますます制限されるようになったため、このコストは非常に小さくなっていますが、多くの記事および姿勢は、このコストが比較的大きかった時代からきています。

    2016年の更新情報です。Anandtech が投稿した x64およびAArch64でのオペコードサイズに関する議論 .

EDIT: これは、本来は x86 を叩け! パーティーではありません。質問の文面からして、ある程度のバッシングはやむを得なかったのです。しかし、(1) を除いて、これらのことはすべて正当な理由があって行われたものです (コメント参照)。Intel の設計者は馬鹿ではありません。彼らは自分たちのアーキテクチャでいくつかのことを実現したかったのであり、これらはそれらを実現するために支払わなければならなかった税金の一部なのです。