知识卡片
插件式架构是"程序规模墨菲定律"与摩尔定律较量的历史产物
内容
早期程序员必须在代码开头显式声明程序要加载的内存地址(PDP-8的*200起源语句),库函数只能以源代码形式整体并入自己的程序一起编译,内存和存储都极其昂贵稀缺,编译一次大型程序常要几小时。为缩短编译时间,库函数被单独编译后固定加载到某个内存地址,但应用代码大小很快超出预留区间,只能不断切分地址段来避让——这个方案不可持续。真正的解法是可重定位二进制文件:编译器把函数名输出为外部引用/外部定义的元数据,加载器负责把它们链接起来(链接加载器由此诞生)。但60年代末到70年代程序规模暴增后,链接加载器动辄要读取几十上百个二进制库文件解析引用,加载耗时经常超过一小时,于是耗时的链接过程被拆分成独立的链接器程序,只生产一次、可以被快速反复加载。这个”想办法压缩编译链接时间”的努力,几十年来始终追不上程序规模的增长——这被总结为”程序规模上的墨菲定律”:程序规模会一直增长,直到把有限的编译和链接时间填满为止。真正扭转局面的是摩尔定律:随着磁盘变快变小、内存降价、时钟频率从1MHz飙升到100MHz,到90年代中期链接速度的提升终于反超了程序规模的增长速度,链接几个jar文件或共享库只需几秒钟——插件式架构(ActiveX、共享库、.jar文件等组件形式)正是在这个历史节点上才变得可行:如今给Minecraft装一个.jar模组、给Visual Studio装一个DLL插件已经司空见惯,但这份”司空见惯”是硬件性能追上软件规模这场长达三十年拉锯战的产物,而非架构思想上的突然顿悟。
参考来源
- 位置:《架构整洁之道》第12章《组件》"组件发展史""重定位技术""链接器""本章小结"(源文件:_epub-src/text/part0013_split_001.html)
- 结论依据:原文详述从固定内存地址到可重定位二进制、再到独立链接器的演进过程,提出"程序规模上的墨菲定律"(规模增长会填满有限编译链接时间),并说明摩尔定律带来的硬件性能提升最终让链接速度反超程序规模增长,插件式架构由此诞生,直接支撑本卡片结论。
- 原始内容:程序的规模会一直不断地增长下去,直到将有限的编译和链接时间填满为止……到了20世纪90年代中期,链接速度的提升速度已经远远超过了程序规模的增长速度……由此,插件化架构也就随之诞生了。