有人说"c 语言是跨平台支持相当好的一门语言,配合对应的编译器,在 arm 架构上运行是完全没有问题的"

2020-11-30 19:41:21 +08:00
 Neojoke

同志们,你们怎么看? 尤其是有 Linux-C 开发背景的伙伴们谈谈,说这句话的人算是我的一个朋友吧,我竟然不知道怎么回复他了。

5784 次点击
所在节点    C
54 条回复
dynastysea
2020-12-01 10:10:24 +08:00
没毛病啊,我们代码同时兼容 arm 和 x86 两个平台,区别 arm 就是几个编译选项,代码层面是完全兼容的,当然如果用到汇编指令的话就另说,不过汇编大部分也是兼容的
hitmanx
2020-12-01 10:28:32 +08:00
从应用本身的角度上来说,肯定是越上层越好移植,越底层越难移植。软件本身无非就是一层一层的封装,层次越高,需要关心底下的操作系统和硬件的知识就越少。但是整个软件栈里总得有一层去支持这些不同的架构,有很多恶心的#if def,有很多的 system API,甚至有一些汇编(最简单的比如实现不同平台的 atomic)去封装这么一个 HAL layer 。

就 C/C++语言来说,也不能一概而论。如果一个简单程序只用了 C/C++标准库和比如 POSIX API 的话,那么只要依赖库和 API 都已经移植了,移植起来不会太难。如果确实用了很多 x86 的特性,但是 HAL 层封装的好的话,也会容易不少,大不了 arm 上的实现都先用最朴素的实现先顶着。如果没有封装好,平台相关的代码遍布整个软件各个层面的话,那就是另外一回事了。
Neojoke
2020-12-01 10:31:55 +08:00
@dynastysea x86 的 CPU 是 CISC,arm 是 RISC,能跑通应该不难,交叉编译很好做,但是如果底层代码在执行的时候,用到 CISC 的长 CPU 指令可能在 RISC 上就得数百条长指令了,而且 x86 架构的 CPU 的指令寄存器一般比 arm 的且复杂,如果大量可变长指令在 arm 上做指令对齐,那指令周期可能翻好几倍,那么交叉编译能跑通,但性能就会有差距,这种差距,就需要优化,才能追评 x86 上的表现,那牵扯到底层的优化了,所以支持是问题的,但移植性很差,所以我觉得在 arm 上性能也是有所担心的,如果没性能问题,华为的鲲鹏 arm 服务器不应该卖的很好吗,Linux 的 arm 支持不应该更快么
gamexg
2020-12-01 10:34:34 +08:00
c 自身没问题,标准库一般也没大问题。
但是其他库就,特别是图形界面等
LokiSharp
2020-12-01 13:36:31 +08:00
单纯语言上是没问题的,适配是编译器的活。但是第三方依赖就难说了
dynastysea
2020-12-01 13:47:27 +08:00
@Neojoke 性能差距没你想的那么大。。华为鲲鹏卖的不错啊,可以了解下“安可”
ysc3839
2020-12-01 13:54:54 +08:00
针对附言,我觉得写代码比较正常的写,同操作系统的情况下迁移到别的架构是没什么问题的。
比如说我自己用 C++ 写的 Windows 应用,直接编译为 ARM64 版本,在树莓派上跑是没有问题的。
mxT52CRuqR6o5
2020-12-01 13:55:15 +08:00
C 当然是能跨平台的,跨不了平台不是 C 的问题,而是调用了平台相关 API 、内联了汇编之类的,纯 C 的特性都是跨平台的
Neojoke
2020-12-01 15:47:26 +08:00
@dynastysea 可能我自己做的测试感觉差距比较大吧,尤其是 ES for arm64,Oracle for Linux arm 我都自己跑过,基本上都是凉半截。
其实这个不是讨论 C 语言的,是讨论,大部分程序员切换到 Arm based 的开发机上,现有的库、framework 以及开发环境支持的成本高不高。
Neojoke
2020-12-01 15:49:22 +08:00
@mxT52CRuqR6o5 我发现计算密集型的程序,在 arm 上跑跟 x86 差距很大,尤其是实时计算的框架,所以 arm based 芯片服务器,基本上不适合做密集计算的业务。
Neojoke
2020-12-01 15:56:14 +08:00
@jim9606 我同意你说的事实情况,但却还不够完全,从写出的代码上来看,的确是这样的,但这是对增量的世界来说的,举个例子,如果 arm 公版架构升级,那 Linux for armv8 虽然能跑,但是却利用不上最新的芯片性能,Linux 的内核程序就要重新适配一版新的 arm 公版架构,这个工作量不是只添加几个宏,修改几处汇编指令就完事的,牵扯到大量底层的适配和优化。所以,你看 Linux 社区适配 arm 花了多久,倒推一下,底层不适配新的 arm 架构,上层的应用虽然能跑在 arm 的机器上,但性能还是会差很多。
aguesuka
2020-12-01 17:21:45 +08:00
也就 hello world 可以。写个 socket 就要考虑用跨平台的库了,如果要做图像页面,那每个平台都要封一层
jim9606
2020-12-01 17:35:17 +08:00
@Neojoke
内核适配主要指外设驱动的支持,不过这些跟 ARM ISA 没有直接关联。还有一些是 ARM SoC 经常用到但实现是架构无关的功能(例如异构多核支持、调频的 cpufreq governor )。
至于高性能方面更多是 userland 还有跟驱动配套的 library 的事情,例如在计算库和编译器使用特定的 SIMD 指令优化等。

而消费用户接触到的大部分应用都不是计算密集的应用,这类程序只要能跑就行,如果开源的话基本就是修改一下 toolchain 就能跑起来,但想性能更好就无可避免地引入一些架构相关的改动。如果应用是把这部分外包给 library 去实现的那就可以通过升级依赖来获得性能改进了。
mxT52CRuqR6o5
2020-12-01 18:53:22 +08:00
@Neojoke
之前有 V 友发过贴,说是政府相关的项目要求部署到 ARM 的服务器上
核算下来算力成本算下来比不上 x86 的
现阶段确实是这样,不过以后有可能成本可以降下来

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

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

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

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

© 2021 V2EX