不懂就问:软件适配 ARM 是开发者意愿问题还是能力问题?

2020-06-23 09:07:32 +08:00
 hourann

迁移架构真的有这么难吗?我知道微软做了几次失败的尝试,推出了跑在 ARM 上的电脑用户体验和市场反响都很差,究其原因是很多软件用不了。绝大部分开发者的软件开发过程不会涉及汇编、SIMD 等依赖具体指令集的内容,所以在我理解里大部分情况下适配 ARM 只是换一下编译目标这么简单。微软 surface 的失败可以解释为它只是 Windows 下的一个极为小众的异构电脑,无法吸引开发者适配的兴趣。而苹果拥有对 macOS 设备的绝对管辖权(黑苹果除外),所以我觉得苹果推 ARM 会比微软顺利的多?

4899 次点击
所在节点    编程
33 条回复
lxml
2020-06-24 03:01:12 +08:00
成也苹果,败也苹果,有时候能不能成还是取决于腿粗不粗的问题。

CUDA on mac 黄了,两条都是大腿聊不来,用户群达不到割肉的水平,那就互相伤害啊。

Adobe on mac 苹果就还是知会下,大家老老实实配合开发有 bug 苹果也配合第一时间修,毕竟是互相成就的关系。

微软的号召力嘛…… 从丢了移动端以后真的就别提这个词了,Vscode 就是极限了
shutongxinq
2020-06-24 03:10:06 +08:00
然而底层只支持汇编写的的 x86 的软件已经上不了 Catalina 了。

Yosemite 支持的软件,Catalina 有多少能运行,大家心里都有数。
huangzhe8263
2020-06-24 04:08:43 +08:00
反正已经准备从 Catalina 降级回 Yosemite 了。
singerll
2020-06-24 08:27:25 +08:00
我们原来有个软件移植到 arm 平台有问题,最后是研发改了几天代码才搞定的,当然我们是个非常小的软件
xingheng
2020-06-24 09:05:23 +08:00
@shutongxinq Catalina 只是放弃了 i386 吧,x86 还是主要的架构。

至于迁移问题,想想 Windows 为什么一直有那么多老旧软件大都是基于 xp 开发的,常年没有更新,微软直接放弃了 x86 必然会挨骂。

关于苹果只支持在 ARM 版 mac 上运行 iOS app,我觉得一定程度上是苹果偷了个懒,现在的 iOS 设备都是 arm 系列架构,因为 iOS 的成功所以才敢这么大胆的放弃 x86 。至于放弃了 x86,大概率是兼容目前现有的 ARM app 到 x86 的难度和工作量太大了,所以放弃了。
msg7086
2020-06-24 09:50:25 +08:00
底层有太多太多涉及到汇编和 SIMD 的代码了。
换平台也不是软件重新编译一遍就解决的。。
像上面提到的,底层库怎么办?任何一个稍微大一点的项目都会涉及到很多 CPU 密集型的类库。视频,音频,UI,计算,等等,哪一个是不需要跑汇编的。那么重编译的时候你完全放弃掉汇编优化吗?不可能的,性能差多少倍啊。

别说 x86 到 ARM 的适配,就是 32 位 x86 到 64 位的 x86_64 适配有时候都要花很长很长的时间。你碰过那种代码里有 MMX 和 3D Now 指令集汇编的情况吗?试试看重写成 SSE 和 AVX 要花多久的时间吧……
shutongxinq
2020-06-24 11:21:43 +08:00
@xingheng 你知道 x86 里面那个 x 是什么意思吗?😂😂😂
shutongxinq
2020-06-24 11:24:12 +08:00
@msg7086 能举一个具体的例子,给一个汇编优化的来源吗?我想去亲眼看看你说的汇编优化。
msg7086
2020-06-24 16:22:23 +08:00
msg7086
2020-06-24 16:32:14 +08:00
这个项目之前一直在 Windows 下跑,纯 32 位环境。前几年终于移植到了 64 位,最近开始往 Linux 和 ARM 移植,Linux 已经能跑起来了,ARM 好像还在挣扎。
SIMD intrinsics 出现之前,里面大量的 __asm 裸代码,MMX 和 3Dnow 是主流,SSE/SSE2 都是后来才加进去的。MMX 因为和 64 位指令集共用寄存器,所以在 64 位下编译就得把 MMX 全关了。像上面的例子就是相关函数只有 MMX 版,关了就只剩纯 C 了。
还有像裸 __asm 只有 MSVC 才认,所以 Linux 下把这些用宏关掉以后也只剩纯 C 了。
要往 ARM 移植的话,同一套函数得写三套代码,一套 C,一套 Intel SIMD,一套 Neon,可谓是蛋碎。

像这个例子还算好的,有纯 C 代码,重写的时候只是重新翻译一下而已。最蛋碎的是遇上只有汇编代码的,你得先把汇编翻译回 C,然后从 C 再翻译去 Intrinsics 。这搞一个项目,有时候一不小心就一个月陪进去了。
xingheng
2020-06-27 14:43:11 +08:00
@shutongxinq 还真不知道是什么含义,只知道一直都这么描述,包括 x86_64 。请教?
shutongxinq
2020-06-28 00:50:24 +08:00
@xingheng x86 的 x 就是以前 286,386,486 里面 2,3,4 的统称。
@msg7086 你这个例子很好。掷地有声。
msg7086
2020-06-28 04:37:38 +08:00
@xingheng @shutongxinq
顺便一提,x86 最开始源自 8086,是 80x86 系列的架构名,80186 和 80286 等已经是后续产品了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/683965

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX