1.4 编码风格变迁小史:从打孔带到开放指令集


1.4 编码风格变迁小史:从打孔带到开放指令集

本节摘要:今天的编码格式是历史包袱与历史智慧的总和。本节按时间轴走一遍指令集的演化:存储程序思想的确立、IBM System/360 的家族兼容革命、CISC 的黄金年代、RISC 的反叛、x86 的微码翻译自赎,直到 RISC-V 的开放实验。读完你应当能解释"为什么今天的指令集长这样",并为第 2 章的流派对比备好时间坐标。

从打孔带到指令集

最早的计算机根本没有"指令集"这个词。ENIAC 那一代机器靠插线板和开关排程序,换个任务要重新接线几天。真正把程序变成"数据"的是存储程序思想:指令和数值一样,都放进内存、都用二进制表示,机器按地址逐条取出执行。冯·诺依曼结构的这个决定,让"指令编码"第一次成为需要认真设计的对象——从此,指令放在内存里占几个位、每个位是什么意思,成了工程问题。

早期的编码极其朴素。机器要几个操作,就编几个号码,指令里连操作数都可能省略。真正的分水岭出现在商业化的年代:1950 年代末,IBM 面对一堆互不兼容的产品线,做了一个豪赌——用一个统一的架构 IBM System/360 覆盖从商用小型机到科学大型机的全部档位,低档机与高档机执行同一套指令编码。今天司空见惯的"同一套程序跑在不同档次的机器上",在 1964 年是革命性的承诺。System/360 还顺手固化了 8 位字节、32 位字这些沿用至今的基本盘。兼容性从此成为指令集的第一美德,也成为最沉重的枷锁。

CISC 黄金年代与它的代价

1970 年代存储器贵得惊人,主存以千字节计。工程界顺理成章地想:指令越长越强,程序就越短,内存就越省。于是指令集越长越大:一条指令能整段搬运字符串、能直接调用的复杂寻址、能一气呵成的十进制运算。VAX 的设计者甚至以"一条指令对应一行高级语言"为目标。这种风格后来被称为 CISC——复杂指令集计算机。1978 年 Intel 推出 8086,正是这一哲学的作品:变长编码、丰富的寻址模式、段式内存,为的就是用尽可能少的字节装下尽可能多的语义。

代价随后显形。编译器研究者发现,程序员和编译器实际只频繁使用指令集的一小部分,复杂指令反而难用、难译、难验证;指令越复杂,解码电路越庞大,时钟越难提上去。内存价格暴跌又釜底抽薪——"省内存"的原始动机消失了。1980 年前后,伯克利的 David Patterson 与斯坦福的 John Hennessy 各自带团队提出精简指令集(RISC):指令定长、格式齐整、只在寄存器间运算、访存只用加载和存储,把腾出来的晶体管预算砸向寄存器堆和流水线。MIPS、SPARC、ARM 相继落地,性能碾压同期 CISC 小型机。"RISC 更快"一时成为信条——尽管后来的故事要复杂得多,第 2 章会还它一个公道。

x86 的自赎与 RISC 的落地分化

按剧本,CISC 应当就此退场,但生态阻止了剧本。x86 背着庞大的软件存量,谁也不敢抛弃。Intel 的解法充满工坊智慧:表面上继续说 x86 方言,内部却请一位"翻译"——1995 年的 Pentium Pro 开始,前端把复杂的 x86 指令拆解成类 RISC 的微操作(μop),后端按 RISC 的方式流水执行。外壳是 CISC,内瓤是 RISC,两边的好处各拿一份。这次"曲线救国"如此成功,以至于"x86 内部早已 RISC 化"成了今天体系结构的常识,第 5 章解码车间会原样再现这套翻译流程。

与此同时,RISC 阵营沿着应用裂解:MIPS 在工作站与嵌入式之间辗转,SPARC 守着 UNIX 服务器渐次退场,而 ARM 找到了自己的金矿——1990 年代移动设备的能效需求正好匹配它简单解码、低功耗的特性,随后的智能手机浪潮把 ARM 送上了装机量之巅。另一个教训也值得记下:2001 年 Intel 与 HP 合作的 Itanium 试图用超前的显式并行架构(VLIW 一脉,2.3 节详述)取代 x86,结果因兼容性与编译器难度双重受挫,成为"生态压倒技术"的教科书案例。

开放指令集与当代格局

2010 年,伯克利的 Krste Asanovic 与 David Patterson 团队受够了每次科研项目都要为授权费和封闭格式发愁,索性设计一套人人可用的开放指令集:RISC-V。它的立意不在"更快",而在"可自由实现、可按需裁剪"——基础指令集小到教学芯片都装得下,扩展像货架上的标准件随意拼装。2015 年 RISC-V 国际基金会成立,规范由社区共治,任何机构都能免授权费实现。指令集第一次从商业私产变成了公共设施。

把这条时间轴压缩成一张表:

1950s 存储程序思想确立,指令编码成为设计对象 1964 IBM System/360:家族兼容 + 8 位字节成为工业标准 1970s CISC 黄金年代:内存昂贵,追求单指令强语义 1978 Intel 8086 诞生:变长编码的 x86 基因定型 1980s RISC 反叛:定长格式 + Load/Store 哲学(伯克利/斯坦福) 1985 ARM 落地,日后押中移动浪潮 1995 Pentium Pro:x86 内部转向微操作翻译,CISC 外壳 RISC 瓤 2001 Itanium 受挫:生态威力压倒架构理想 2010s RISC-V 开放模式:指令集成为可自由实现的公共规范

同一套原理,不同的买卖方式

技术之外,指令集还有一层商业属性——授权模式,它同样在历史中演化出了三个流派。ARM 代表"授权架构"模式:芯片厂商付授权费与版税,获得指令集与参考实现的许可,可以自由设计自家微架构(苹果的移动芯片、各家手机 SoC 都这么来的),但指令集本身的解释权在 ARM 手里。早年 MIPS 一度开放授权门槛,任何人可以免费实现 MIPS 兼容核,代价是规范演进缺乏强力协调,后来渐失声势——国产龙芯早期的芯片就兼容 MIPS,直到自研出 LoongArch,才把指令集的修改权真正握在自己手里。RISC-V 代表第三种:基金会共治的开放规范,实现零授权费,任何机构可以自由实现、自由扩展,规范演进由社区技术委员会投票决定。

对工程师而言,这三条路没有绝对优劣,只有约束不同。买 ARM 授权省心、生态成熟,适合要快速出货的产品;自研指令集(如 LoongArch、苹果对 ARM 的深度定制)换来的是完全的掌控力,付出的是软件生态的重建成本;RISC-V 则把选择权交给了所有想下场的人。理解这层"指令集经济学",你在 8.3 节看 RISC-V 扩展治理、看各家企业押注时,才不会把商业决策误读成技术优劣。

历史留给编码者的三件遗产

回望这段历史,有三条遗产直接塑造了后面七章的内容。其一,兼容性是第一美德:System/360 开创的家族兼容让"旧程序必须能跑"成为铁律,x86 的变长编码、ARM 的模式保留、都是这条铁律的化石层——3.2 节讲遗留包袱时会见到具体的位。其二,ISA 不是性能的本质:RISC 与 CISC 的表象之争,最终收敛为"实现质量"之争,微架构的自由发挥(1.3 节的契约外区域)才是性能主战场。其三,格式即生态:指令编码的每个细节都会被几百万行编译器代码、几十年的二进制存量反复固化,改变格式的成本随时间指数上涨——理解了这一点,你才能体会 8.3 节 RISC-V"从零开始把格式做对"的珍贵与艰难。

下一章我们把镜头拉近:同样的历史压力下,不同工坊给出了哪些不同答案——CISC 与 RISC 只是流派图谱的起点。

要点盘点

  • 存储程序思想让指令成为"内存里的数据",编码格式从此是工程问题。
  • System/360 定下家族兼容与 8 位字节,兼容从此是指令集第一美德。
  • CISC 源于内存昂贵的年代,RISC 反叛靠的是定长格式与编译器友好,x86 用微码翻译完成自救。
  • 生态的力量压倒架构的优雅:Itanium 的失败与 ARM 的成功是同一枚硬币的两面。
  • RISC-V 把指令集变成开放规范,"最小契约 + 模块扩展"是当代编码设计的新范式。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U