DK202502170
为什么苹果的二进制翻译那么强?
本文不适合给新手阅读,特此声明~
先来一段个人感悟:从 Intel 芯片换到 M 架构芯片的 Macbook 后,发现大部分游戏甚至 3A大作都有人移植了,并且可以流畅运行。而他们原本只适配 X86 架构。打开 app store,发现有些游戏标注上了针对 M 芯片优化,这足以证明苹果的技术与实力。
可以先用五个特点来概括:
- 软硬件一体化设计:苹果掌控从芯片到操作系统的==完整生态==,可以在多个层面优化翻译性能。
- 高效的动态翻译技术:通过Rosetta 2 达到了卓越的性能(==不开源!==)。
- 针对 x86 的深度优化:对 SIMD、库函数替换和特定指令模式的优化,使得翻译效率大幅提高。
- 开发工具链的协作:Xcode 和 LLVM 等工具为二进制生成提供了翻译友好的支持。
- 用户体验至上:通过无缝的自动化翻译和高度优化的执行,用户在运行 x86 应用时几乎察觉不到性能差异。
动态二进制翻译介绍
BT可以分为静态二进制翻译和动态二进制翻译(DBT)。
静态二进制翻译:顾名思义,就是在编译阶段就完成对ISA的翻译,优点很明显,没有动态执行的开销,一次性的成本,编译优化可以做的更多。但是同时它也有2个问题很难解决,所以应用范围一直很窄,那就是Code Discover和Code Location。目前静态二进制翻译,在一些古老设备上游戏的移植使用的比较多。
动态二进制翻译是目前采用的最多的BT技术,它采用边运行边翻译的方式。优点是可以得到很多运行时信息,解决之前静态翻译很难解决的问题,同时可以利用 runtime的信息来做一些激进的优化。但是,事物的两面性决定了,DBT也有自己缺陷,作为动态翻译,运行的开销不小,可以采用的编译优化就受限,技术上的原因,启动速度也不如静态翻译和原生应用,虚拟机的设计比较复杂,维护成本等等。DBT不仅仅是一种纯软件技术,很多时候它还需要硬件团队的配合来达到更好的翻译和优化,以让最终的效果达到预期。本文也会着重介绍DBT技术。
其他细节原理可以参考文献[1],详细列举了二进制翻译的全栈方案与策略。Rosetta 历史
2006 年,Apple 宣布从 PowerPC 过渡到 x86 架构。由于绝大多数应用程序是为 PowerPC 架构编译的,Apple 开发了 Rosetta,用于在 x86 上运行这些应用程序。但是由于不支持某些高级指令集(如 AltiVec),性能在某些计算密集型场景下会下降。
Rosetta 1 随着 macOS 10.7(Lion)停止支持,因为 Apple 生态已经完全转移到 x86。随着 Apple 决定自研 M 系列芯片开始,Rosetta 2 又来了。
2020 年,Apple 宣布转向自研的 Apple Silicon(基于 Arm 架构),取代了 x86 架构(Intel 处理器)。其目的是使用动态二进制翻译将 x86-64 指令集翻译为 Arm64 指令集,然后执行。Rosetta 2 原理
其原理可以直接参考二进制翻译的原理。
Rosetta 2 是内置在 macOS 系统里的,在幕后工作,只有当你第一次下载一款 x86 应用,第一次打开时,才会提示你安装 Rosetta 2。换句话说,Rosetta 2 的存在完全不会对你过去一直以来使用 Mac 的习惯造成影响,它几乎是无感的,悄悄做着翻译工作。因此,新的 Mac 也是可以流畅运行 X86 软件的。
之所以能保持实时的高性能翻译,得益于“在应用安装时就会对应用进行翻译”,只有无法提前预知的才会使用 JIT 翻译。
参考资料
评论