为什么x86很丑?为什么与其他人相比,它被认为是劣等的? [关闭]

2023-12-29

我一直在阅读一些 SO 档案并遇到针对 x86 架构的陈述。

  • 为什么服务器和小型/大型机以及混合核心需要不同的 CPU 架构? https://stackoverflow.com/questions/2667256 says
    "PC 架构一团糟,任何操作系统开发人员都会告诉你这一点。"

  • 学习汇编语言值得付出努力吗? https://stackoverflow.com/questions/82432 (archived https://web.archive.org/web/20130801000534/https://stackoverflow.com/questions/82432/is-learning-assembly-language-worth-the-effort) says
    "认识到 x86 架构充其量也很糟糕"

  • 有什么简单的方法可以学习 x86 汇编程序吗? https://forums.anandtech.com/threads/any-easy-way-to-learn-x86-assembler.976577/ says
    "大多数大学都在 MIPS 之类的东西上教授汇编,因为它更容易理解,x86 汇编真的很难看"

还有更多评论,例如

  • “与大多数架构相比,X86 非常糟糕。” https://news.ycombinator.com/item?id=276418

  • "X86 不如 MIPS、SPARC 和 PowerPC,这绝对是传统观点" https://news.ycombinator.com/item?id=276459

  • "x86 太丑了" https://news.ycombinator.com/item?id=276471

我尝试搜索但没有找到任何原因。我不认为 x86 不好,可能是因为这是我唯一熟悉的架构。

有人可以告诉我 x86 与其他相比丑陋/糟糕/劣等的理由吗?


有几个可能的原因:

  1. x86是比较老的ISA https://en.wikipedia.org/wiki/Instruction_set(毕竟它的前身是 8086)
  2. x86 已经发生了多次显着的发展,但需要硬件来保持与旧二进制文件的向后兼容性。例如,现代 x86 硬件仍然包含对本地运行 16 位代码的支持。此外,还存在多种内存寻址模型,允许旧代码在同一处理器上互操作,例如实模式、保护模式、虚拟 8086 模式和 (amd64) 长模式。这可能会让一些人感到困惑。
  3. x86 是 CISC 机器。长期以来,这意味着它比 MIPS 或 ARM 等 RISC 机器慢,因为指令具有数据相互依赖性和标志 https://stackoverflow.com/a/2680041/82320使得大多数形式的指令级并行性难以实现。现代实现将 x86 指令转换为类似于 RISC 的指令,称为“微操作 https://en.wikipedia.org/wiki/Micro-operation“在幕后使这些优化能够在硬件中实现。
  4. 在某些方面,x86 并不逊色,只是有所不同。例如,输入/输出在绝大多数体系结构上被处理为内存映射,但在 x86 上则不然。 (注意:现代 x86 机器通常具有某种形式的DMA https://en.wikipedia.org/wiki/Direct_memory_access通过内存映射支持并与其他硬件进行通信;但是ISA https://en.wikipedia.org/wiki/Instruction_set仍然有 I/O 指令,例如IN and OUT)
  5. The x86 ISA https://en.wikipedia.org/wiki/Instruction_set具有很少的体系结构寄存器,这可能会迫使程序比其他必要的情况更频繁地往返内存。执行此操作所需的额外指令会占用本可以用于有用工作的执行资源,尽管高效的存储转发 https://en.wikipedia.org/wiki/Memory_disambiguation#Store_to_load_forwarding保持低延迟。将寄存器重命名到大型物理寄存器文件的现代实现可以使许多指令保持运行,但缺乏架构寄存器仍然是 32 位 x86 的一个重大弱点。 x86-64 从 8 个整数和向量寄存器增加到 16 个,是 64 位代码比 32 位代码更快的最大因素之一(以及更高效的寄存器调用 ABI),而不是每个寄存器宽度的增加。将整数寄存器从 16 个进一步增加到 32 个会有所帮助,但效果不大。 (不过,AVX512 确实增加到了 32 个向量寄存器,因为浮点代码具有更高的延迟,并且通常需要更多常量。)(看评论 https://stackoverflow.com/questions/2679882/why-is-x86-ugly-aka-why-is-x86-considered-inferior-when-compared-to-others/2679922?noredirect=1#comment56088321_2679922)
  6. x86 汇编代码很复杂,因为 x86 是一个具有许多功能的复杂架构。典型 MIPS 机器的指令列表适合一张信纸大小的纸。 x86 的等效列表占据了好几页,并且说明的作用更多,因此您通常需要比列表所能提供的更详细的解释来说明它们的功能。例如,MOVSB操作说明 https://en.wikipedia.org/wiki/X86_instruction_listings#Original_8086.2F8088_instructions需要一段相对较大的 C 代码块来描述它的作用:

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

    这是一条执行加载、存储和两个加法或减法(由标志输入控制)的指令,其中每条指令在 RISC 机器上都是单独的指令。

    虽然 MIPS(和类似的体系结构)的简单性并不一定使它们优越,但对于汇编程序类的介绍来说,从更简单的开始是有意义的ISA https://en.wikipedia.org/wiki/Instruction_set。一些汇编课程教授 x86 的一个超简化子集,称为y86 https://esolangs.org/wiki/Y86,它被简化到对实际使用没有用处(例如没有移位指令),或者有些只教授基本的 x86 指令。

  7. x86 使用可变长度操作码,这增加了指令解析的硬件复杂性。在现代,随着 CPU 越来越受到内存带宽的限制(而不是原始计算的限制),这一成本变得微乎其微,但许多“抨击 x86”的文章和态度都来自这一成本相对要大得多的时代。
    2016 年更新:Anandtech 发布了关于 x64 和 AArch64 下操作码大小的讨论 http://www.anandtech.com/show/9766/the-apple-ipad-pro-review/3.

编辑:这不应该是重击 x86!派对。考虑到问题的措辞方式,我别无选择,只能进行一些抨击。但除了(1)之外,所有这些事情都是有充分理由的(见评论)。英特尔设计师并不愚蠢——他们希望通过自己的架构实现一些目标,而这些是他们为使这些目标成为现实而必须缴纳的一些税费。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么x86很丑?为什么与其他人相比,它被认为是劣等的? [关闭] 的相关文章

随机推荐

  • 在哪里可以找到特定于应用程序的 context.xml 文件?

    我读到了context xml file 在雄猫中 是特定于应用程序的 我已经从我的 netbeans IDE 创建了两个 Web 项目 并使用 Tomcat 作为服务器 但是我无法找到特定于应用程序的项目context xml文件 我只找
  • 在 for 循环中更改 SVG 线的 strokeDashoffset

    我正在尝试制作一条线扩展的动画 我已经在 css 中拥有它 但我需要在 javaScript 中完成它 因为这是我可以获得我需要的路径长度的唯一方法 我想我已经非常接近了 但它不起作用 有任何想法吗 以下是我的代码 正如你所看到的 我得到了
  • Python 中增加版本号

    我正在尝试对 CVS 中的文件进行版本号更新 我最初的逻辑是更新一个浮点数 1 1 gt 1 2 gt 1 3 它工作得很好 直到我到达 1 9 然后它更新到 2 0 我正在尝试使用此逻辑更新到 1 10 但是当我尝试增加 1 x 中的 x
  • 重命名类型后,我无法访问其某些方法

    为了防止项目的不同文件存在多个依赖关系 并且由于我可能会更改数据的呈现方式 我决定为绘制2D包 https github com llgcode draw2d 由于我不需要其他任何东西 我只是重命名了其中一种类型 type CanvasCo
  • 为什么我收到 apple-touch-icon-precomposed.png 错误

    我创建了一个新的 Rails3 项目 但我在服务器日志中多次看到以下日志 为什么我会收到这些请求以及如何避免这些请求 开始获取 192 168 6 2 的 apple touch icon precomposed png 2012 09 1
  • 设置数字格式以分隔千位值(例如 12000000 将变为 12 000 000)

    在lua中 我想格式化一个整数 或浮点数 以用空格 或逗号 如美国 分隔每三个小数位 因此例如数字120000010将显示为 120 000 010 或者 120 000 010 我已经发现this http lua users org w
  • RethinkDB - 更新嵌套数组

    我有一个调查表 如下所示 id Id date Date clients client id Id contacts contact id Id score Number feedback String email String 我需要更新
  • 表达式 std::string {} = "..." 是什么意思?

    在此代码中 include
  • 网格模板区域和网格模板列之间的关系

    我是编码新手 似乎没有正确理解 CSS 网格模型 在下面的代码中 网格分为 3 个网格模板列 每列 300 像素 但网格模板区域中每行有 8 个单元 例如 hd hd hd hd hd hd hd hd 而不是 3 个单元这对我来说没有意义
  • 跨域请求被阻止:同源策略不允许读取远程资源 - React js

    我在 Mac OS 设备上运行我的项目 并且想从另一台笔记本电脑进行访问 第一个设备也从服务器获取所有响应 http 192 168 1 101 3000 http 192 168 1 101 3000 但另一台笔记本电脑我收到此错误消息
  • 如何将llvm IR转换为c代码?

    有什么方法可以将 llvm IR 转换为 c 代码并保留其语义吗 例如 我们可以先将c代码编译到llvm IR 然后再将其编译回另一段c代码吗 我不希望这两个文件是相同的 但它们需要具有相同的功能 谢谢 您可以使用 C 后端 llc mar
  • 使用 MIDP 通过 http 从服务器读取 UTF8 字符串

    我想使用 java MIDP 从我控制的服务器读取 UTF 8 字符串 我的服务器正在发送 UTF 8 数据 下面的代码很接近 c StreamConnection Connector open myServer Connector REA
  • 使用样式或 Javascript 使图像变亮

    我想使用 css 或 javascript 在鼠标悬停时使网页上的图像变亮 我见过一些在样式中使用不透明度和滤镜的示例 但它们似乎对我不起作用 提前致谢 CP UPDATE 一个纯 CSS 解决方案是使用CSS 过滤器 https deve
  • 在 R 中读取二进制文件

    在以下代码中 可以导入具有这些属性的部分 LAS 文件版本 1 1 列表 项目格式 尺寸要求 X长4字节 Y长4字节 Z长4字节 强度无符号短 2 字节 返回编号 3 位 位 0 1 2 3 位 返回数 给定脉冲 3 位 位 3 4 5 3
  • 将页面映射到不同进程的地址空间

    可以使用以下命令读取和修改另一个进程地址空间中的内存ptrace 2 or process vm readv 2 process vm writev 2 但是我找不到系统调用来在另一个进程的地址空间中分配新内存 我目前能想到的唯一方法是向进
  • undefined 不是对象(评估 '_react.PropTypes.object')

    刚刚使用react native init创建了一个新项目 使用 react 16 0 0 react native 0 51 0 从 xcode 运行项目我收到以下错误 未处理的 JS 异常 模块 AppRegistry 不是已注册的可调
  • Antlr4:如何在语法中隐藏和使用令牌

    我正在解析一种定义两种类型的语句的脚本语言 控制语句和非控制语句 非控制语句总是以 而控制语句可能以以下结尾 or EOL n 语法的一部分如下所示 script statement EOF statement control statem
  • 在 PowerShell 中选择数组的所有对象的一个​​属性的值

    假设我们有一个对象数组 objects 假设这些对象有一个 Name 属性 这就是我想做的 results objects results Name 这可行 但是可以用更好的方式来完成吗 如果我做类似的事情 results objects
  • 无法绑定Margin属性?

    我正在尝试制作一种动画电影片段 其中在给定时刻只有一个字段可见 就像相机中的胶片一样 当前只有一个胶片场放置在镜头下方并准备被照亮 我尝试将其实现为一个带有另一个网格的网格 Film strip 在下面的代码中称为 pageContaine
  • 为什么x86很丑?为什么与其他人相比,它被认为是劣等的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi