问题

为什么有些软件不能用 Rosetta2 转义运行?

回答
有些软件确实无法通过 Rosetta 2 顺畅地运行,这背后涉及一系列技术原因,可以从硬件架构、软件设计以及 Rosetta 2 本身的局限性来深入理解。

首先,我们要明白 Rosetta 2 的核心工作原理。它的本质是一个翻译器,将原本为 Intel x86 架构编写的应用程序指令,在 Apple Silicon(ARM 架构)的 Mac 上即时编译(JIT)成 ARM 架构能够理解的机器码。它不是一个模拟器,而是动态地将代码“翻译”过来。这个过程是相当智能和高效的,但并非万能。

硬件层面的不兼容:

直接硬件访问和低级指令: 某些软件,尤其是那些需要与硬件进行非常底层、直接交互的程序,比如一些驱动程序、虚拟化软件(虽然 Apple Silicon 也有自己的虚拟化框架,但基于 Intel 架构设计的底层虚拟化工具就无法直接兼容)、音频/视频处理的专业硬件接口软件,甚至是某些游戏的反作弊系统,它们依赖于 Intel 处理器特定的指令集、特定的寄存器访问方式、或者特定硬件的功能。Rosetta 2 只能翻译通用的应用程序指令,对于那些“越界”到硬件指令集层面,并且使用了 Intel 独有特性的代码,就难以进行有效的翻译。就像你让一个只会说中文的人去理解一段只有日语才能表达的“粗俗”脏话,即使意思差不多,但语境和表达方式完全不同。
SIMD指令集的差异: SIMD(Single Instruction, Multiple Data)指令集允许处理器一次执行多个相同的数据操作,这对于图形渲染、科学计算、音视频编码等任务至关重要。Intel 和 ARM 都有自己的 SIMD 指令集,比如 Intel 的 SSE、AVX 系列,以及 ARM 的 NEON。虽然 Rosetta 2 能够将大部分 SSE/AVX 指令翻译成 ARM 的 NEON 指令,但对于一些非常新、非常复杂、或者针对特定 Intel AVX 指令集版本优化的代码,翻译的精确性和效率可能会打折扣,甚至出现兼容性问题。极端情况下,如果软件直接硬编码了对某个特定 Intel SIMD 扩展的支持,而 Rosetta 2 无法将其完美映射到 ARM 端,就会导致程序崩溃或功能异常。

软件设计和依赖性问题:

依赖于特定 Intel 库或框架: 很多软件并非独立存在,它们会依赖于系统提供的库、框架,或者第三方 SDK。如果这些依赖项本身是为 Intel 架构设计的,并且包含了直接的 Intel 指令,那么即使应用程序的主体可以通过 Rosetta 2 翻译,但当执行到依赖项中那部分 Intel 特有代码时,问题就会暴露出来。例如,一些旧的科学计算库、图形渲染库(特别是使用了 Metal 以外的底层图形 API 且没有跨平台移植的),它们可能就深度绑定了 Intel 的底层实现。
插件和扩展的兼容性: 很多应用程序(如 Adobe 系列、Final Cut Pro、Logic Pro 等)都支持插件或第三方扩展。如果这些插件是为 Intel Mac 编写的,并且开发者没有为 Apple Silicon 重新编译或适配,那么即使主应用程序已经支持 Apple Silicon,加载这些 Intel 架构的插件时,Rosetta 2 仍然需要负责翻译插件的代码。当插件与主程序之间存在复杂的交互,或者插件本身又依赖于其他 Intel 特有的库时,兼容性问题就会急剧增加。
内核扩展(Kexts)和系统级服务: 某些软件,尤其是系统优化工具、杀毒软件、虚拟机软件、硬件监控工具等,它们会安装内核扩展(Kexts)来获得更高级别的系统访问权限。Apple Silicon 上的 macOS 对内核扩展的管理更加严格,并且要求它们必须是为 ARM 架构原生编译的。Rosetta 2 的作用范围是用户空间的应用程序,它无法处理内核层面的代码。因此,任何需要安装 Intel 架构内核扩展的软件,都无法通过 Rosetta 2 运行。
JIT 编译器的限制: 某些软件,例如一些编程语言的运行时环境(比如特定版本的 Java、Python 解释器),它们可能使用了自己的即时编译器(JIT)来进一步优化代码执行。如果这些 JIT 编译器本身是基于 Intel 架构设计的,并且其编译逻辑与 Rosetta 2 的翻译过程产生冲突,或者它试图生成 Intel 特有的机器码,那么就可能出现问题。尽管 Rosetta 2 也在不断改进,但对于这种“代码生成代码”的复杂场景,兼容性挑战会更大。

Rosetta 2 本身的局限性:

翻译开销和性能损耗: 虽然 Rosetta 2 非常强大,但它毕竟是一个翻译过程。对于那些高度依赖性能、并且代码经过极致优化的软件,即使翻译成功,也可能存在一定的性能损失。开发者通常会选择为 Apple Silicon 原生编译,以获得最佳性能。
不被支持的指令或特性: 尽管 Rosetta 2 支持了绝大多数 x86_64 指令,但总会有一些非常罕见、非常底层、或者非常新的指令集扩展,可能不在 Rosetta 2 的支持范围内。当软件恰好调用了这些未被支持的指令时,就会导致运行失败。
开发者未测试或适配: 即使技术上存在兼容的可能性,但如果软件开发者没有对其进行充分的测试,或者没有主动提供 Apple Silicon 的原生版本,那么在使用 Rosetta 2 运行过程中出现的任何问题,都可能被归结为“不兼容”。

总结来说, 那些无法用 Rosetta 2 顺畅运行的软件,往往是因为它们:

1. 依赖了 Intel 架构独有的硬件特性或低级指令。
2. 深度绑定了为 Intel 设计的系统库、框架或第三方 SDK。
3. 包含了 Intel 架构的内核扩展。
4. 其自身的 JIT 编译机制与 Rosetta 2 存在冲突。
5. 对性能有极致要求,即便勉强运行也无法接受性能损失。
6. 其开发者并未对 Apple Silicon 进行适配或测试。

随着 Apple Silicon 市场的不断扩大,越来越多的开发者正在积极地为 ARM 架构重新编译和优化他们的软件,提供原生支持。对于那些仍然依赖 Intel 架构的旧软件,Rosetta 2 就像一座重要的桥梁,但这座桥梁并非无所不能,总有一些“险滩”是它难以逾越的。

网友意见

user avatar

大部份是两类,使用AVX指令和虚拟机应用。


Rosetta2的基本原理是把x86指令翻译成对应的ARM指令或者指令组合来运行。


AVX是256bit,M1支持的NEON指令是128bit,虽然一条AVX指令理论上也可以翻译成多条ARM指令的组合,但实际上涉及的方面很多,即使翻译了实际执行效率也很低。


虚拟机应用则是因为多了一层客户机操作系统的隔离,Rosetta2无法生效。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有