同志们,你们怎么看? 尤其是有 Linux-C 开发背景的伙伴们谈谈,说这句话的人算是我的一个朋友吧,我竟然不知道怎么回复他了。
1
ipwx 2020-11-30 19:44:56 +08:00 1
他说的没错
|
2
zhuangzhuang1988 2020-11-30 19:44:59 +08:00
√
|
3
dawn009 2020-11-30 19:49:19 +08:00
他说的没错。目前的操作系统几乎都可以视为 C 的运行时环境
|
4
weiqk 2020-11-30 19:50:42 +08:00 via Android
他说的没错
|
5
love 2020-11-30 19:50:46 +08:00
arm 的 os 不能用 C 语言那用啥?
|
6
iloveayu 2020-11-30 19:51:43 +08:00 via Android
这话说的无懈可击
|
8
yeqizhang 2020-11-30 19:53:42 +08:00 via Android
配合相应的编译器,go 的跨平台支持也相当的好吧
|
9
cmostuor 2020-11-30 19:55:24 +08:00
毫不夸张的的说现在文明的科技产品都是建立在 C 语言之上的
|
10
shayuvpn0001 2020-11-30 19:57:21 +08:00
@yeqizhang 嘿嘿,路由器里跑在一众 MIPS 处理器上的 C 代码想问问什么叫相当的好?还有一堆跑在 C51 处理器,PowerPC 处理器上的 C 代码。。。
|
11
dreasky 2020-11-30 19:57:28 +08:00
其他高级语言的解释器也是配合 c 写的,如果重头到尾都是纯 c 代码基本上跨平台都没什么问题,问题是用了二进制 lib 就难搞了
|
12
cyyzero 2020-11-30 20:01:18 +08:00 via iPhone
没毛病,新的平台出来时首先要移植的几乎都是 c 的 runtime 和编译器
|
13
bruce0 2020-11-30 20:01:36 +08:00
@yeqizhang go 的跨平台也支持的相当好,但是 go 有个问题,就是自带运行时,导致在一些低配(内存低)机器上,可能无法运行
|
14
Cielsky 2020-11-30 20:02:50 +08:00 via Android
显然
|
15
Mohanson 2020-11-30 20:12:41 +08:00 via Android 3
世界上只有两种语言,大部分语言是基于某个处理器做编译器,只有 c 语言,是处理器要基于 c 语言做设计。这不是玩笑话,我至少在 webassembly 和 riscv 文档上都看到过 “该指令集设计和优化初期只考虑 c 语言” 类似的话
|
16
icexin 2020-11-30 20:14:44 +08:00 10
看你这个朋友说的语境,如果一个 c 程序用的库都是跨平台的当然没问题,简单如 hello world 这种只用 libc 的程序,甚至能在单片机上编译运行。然而任何复杂的程序不可避免要跟操作系统进行交互,形如创建进程这样常见的 api 在 windows 和 linux 上都有很大的不同,更别说文件系统结构等其他复杂问题,在 cpu 指令方面还有字长和大小端等问题。因此很多高级语言,如 python,java 是通过一个强大的标准库来屏蔽这些差异。当然,如果你说的跨平台是指程序在对应的平台上有编译器那就另说了。
|
17
Mohanson 2020-11-30 20:15:17 +08:00
不过我估计楼主的真实意思其实是 "把 c 拿来写安卓 app"..., 否则楼主这问题真的欠打
|
18
nightwitch 2020-11-30 20:53:25 +08:00
说的没毛病。编程的历史分为 C 语言之前,和 C 语言之后。C 语言发明之后,你几乎找不到一个不支持 C 语言的平台了。
|
19
irytu 2020-11-30 20:54:12 +08:00 via iPhone
没毛病
|
20
jingslunt 2020-11-30 20:54:25 +08:00 via Android
完全没毛病,但却是贼麻烦的一个事情。每个二进制文件都需要这个对应的 arm 版本,非常折腾人。不如只需要替换 vm 的语言方便
|
21
phpIsNumberOne 2020-11-30 21:04:09 +08:00
还有不支持 c 的?
|
22
Alan1994 2020-11-30 21:10:35 +08:00
数典不能忘祖
|
23
Kellerman 2020-11-30 21:15:24 +08:00
是这个意思吧
|
24
cmdOptionKana 2020-11-30 21:20:47 +08:00 2
C 语言是支持,标准库也很可能几乎一样,但事实上软件代码基本上要重写…… 简单来说就是,支持语言不等于可以简单移植。与 Java 的一次编写到处运行也不一样。
其实你是被偷换概念了,“跨平台” 有很多层含义,你想问的是 **一个软件 /项目** 不修改或少量修改就能跨平台,但回答的是一个语言 /标准库跨平台。 |
25
joydragon 2020-11-30 22:23:44 +08:00
没说错啊,你也可以说汇编是比 C 更跨平台的语言了~
|
26
wanguorui123 2020-11-30 22:24:09 +08:00 via iPhone
主要是编译器,语言不是重点
|
27
jim9606 2020-11-30 22:40:54 +08:00
因为任何的计算芯片,厂商至少都会做一个 C 编译器给用户用(连 AMD GCN 这种 GPU 都有),不然芯片没有人能用,别的语言可不保证这点。
虽然这并不能保证 C 的程序可以零成本移植(写 OS 绕不开少量平台特定的汇编,没有 C 标准库支持) |
28
chinvo 2020-11-30 23:00:30 +08:00 via iPhone
裸片开发 stm32 和 c51 都能用 C,但是谁说能无痛移植我打死谁
|
29
namelosw 2020-11-30 23:57:19 +08:00
你有 source code 编译当然啥系统都可以, 但是闭源发行商可以选择不发 arm 的 binary, 或者疏于维护一直不发...
|
30
no1xsyzy 2020-12-01 01:59:21 +08:00
|
31
xuanbg 2020-12-01 05:00:44 +08:00
话虽然没毛病,但跨平台哪有说的这么简单。不说跨平台,就是简单移植到另一个平台都很不容易呢。
|
32
MeteorCat 2020-12-01 07:37:13 +08:00 via Android
epoll,kqueue,iocp
|
33
x86 2020-12-01 08:07:53 +08:00
跟“钱不是万能的”一样,你觉得有问题,但实际没毛病
|
34
wizardoz 2020-12-01 08:26:56 +08:00
他说的没错。
前段时间引入了 C++,结果引入各种坑。主要是因为 GCC4 对 C++标准的支持不完整。 |
35
binux 2020-12-01 08:49:03 +08:00 via Android
这话说得,你可以套用任何编程语言,甚至能够套在汇编上。只要你不用特定指令集,不调 system call 。
|
36
wangyzj 2020-12-01 09:00:18 +08:00
没错
|
37
GM 2020-12-01 09:12:54 +08:00
对“跨平台”的理解不一样罢了。
你理解的“跨平台”:像 java 一样,write once, run anywhere. 他理解的“跨平台”:*只*要*做好操作系统适配,在哪个操作系统上都能编译运行。 |
38
pigzzz 2020-12-01 09:14:44 +08:00
现代的互联网都是架构在 c 语言上的,你说对不对
|
39
lijialong1313 2020-12-01 09:16:51 +08:00
这算是非常正确的废话吧……
|
40
zjsxwc 2020-12-01 09:20:49 +08:00
弱类型 + 最强跨平台特性
|
41
dynastysea 2020-12-01 10:10:24 +08:00
没毛病啊,我们代码同时兼容 arm 和 x86 两个平台,区别 arm 就是几个编译选项,代码层面是完全兼容的,当然如果用到汇编指令的话就另说,不过汇编大部分也是兼容的
|
42
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 上的实现都先用最朴素的实现先顶着。如果没有封装好,平台相关的代码遍布整个软件各个层面的话,那就是另外一回事了。 |
43
Neojoke OP @dynastysea x86 的 CPU 是 CISC,arm 是 RISC,能跑通应该不难,交叉编译很好做,但是如果底层代码在执行的时候,用到 CISC 的长 CPU 指令可能在 RISC 上就得数百条长指令了,而且 x86 架构的 CPU 的指令寄存器一般比 arm 的且复杂,如果大量可变长指令在 arm 上做指令对齐,那指令周期可能翻好几倍,那么交叉编译能跑通,但性能就会有差距,这种差距,就需要优化,才能追评 x86 上的表现,那牵扯到底层的优化了,所以支持是问题的,但移植性很差,所以我觉得在 arm 上性能也是有所担心的,如果没性能问题,华为的鲲鹏 arm 服务器不应该卖的很好吗,Linux 的 arm 支持不应该更快么
|
44
gamexg 2020-12-01 10:34:34 +08:00
c 自身没问题,标准库一般也没大问题。
但是其他库就,特别是图形界面等 |
45
LokiSharp 2020-12-01 13:36:31 +08:00
单纯语言上是没问题的,适配是编译器的活。但是第三方依赖就难说了
|
46
dynastysea 2020-12-01 13:47:27 +08:00
@Neojoke 性能差距没你想的那么大。。华为鲲鹏卖的不错啊,可以了解下“安可”
|
47
ysc3839 2020-12-01 13:54:54 +08:00 via Android
针对附言,我觉得写代码比较正常的写,同操作系统的情况下迁移到别的架构是没什么问题的。
比如说我自己用 C++ 写的 Windows 应用,直接编译为 ARM64 版本,在树莓派上跑是没有问题的。 |
48
mxT52CRuqR6o5 2020-12-01 13:55:15 +08:00
C 当然是能跨平台的,跨不了平台不是 C 的问题,而是调用了平台相关 API 、内联了汇编之类的,纯 C 的特性都是跨平台的
|
49
Neojoke OP @dynastysea 可能我自己做的测试感觉差距比较大吧,尤其是 ES for arm64,Oracle for Linux arm 我都自己跑过,基本上都是凉半截。
其实这个不是讨论 C 语言的,是讨论,大部分程序员切换到 Arm based 的开发机上,现有的库、framework 以及开发环境支持的成本高不高。 |
50
Neojoke OP @mxT52CRuqR6o5 我发现计算密集型的程序,在 arm 上跑跟 x86 差距很大,尤其是实时计算的框架,所以 arm based 芯片服务器,基本上不适合做密集计算的业务。
|
51
Neojoke OP @jim9606 我同意你说的事实情况,但却还不够完全,从写出的代码上来看,的确是这样的,但这是对增量的世界来说的,举个例子,如果 arm 公版架构升级,那 Linux for armv8 虽然能跑,但是却利用不上最新的芯片性能,Linux 的内核程序就要重新适配一版新的 arm 公版架构,这个工作量不是只添加几个宏,修改几处汇编指令就完事的,牵扯到大量底层的适配和优化。所以,你看 Linux 社区适配 arm 花了多久,倒推一下,底层不适配新的 arm 架构,上层的应用虽然能跑在 arm 的机器上,但性能还是会差很多。
|
52
aguesuka 2020-12-01 17:21:45 +08:00 via Android
也就 hello world 可以。写个 socket 就要考虑用跨平台的库了,如果要做图像页面,那每个平台都要封一层
|
53
jim9606 2020-12-01 17:35:17 +08:00
@Neojoke
内核适配主要指外设驱动的支持,不过这些跟 ARM ISA 没有直接关联。还有一些是 ARM SoC 经常用到但实现是架构无关的功能(例如异构多核支持、调频的 cpufreq governor )。 至于高性能方面更多是 userland 还有跟驱动配套的 library 的事情,例如在计算库和编译器使用特定的 SIMD 指令优化等。 而消费用户接触到的大部分应用都不是计算密集的应用,这类程序只要能跑就行,如果开源的话基本就是修改一下 toolchain 就能跑起来,但想性能更好就无可避免地引入一些架构相关的改动。如果应用是把这部分外包给 library 去实现的那就可以通过升级依赖来获得性能改进了。 |
54
mxT52CRuqR6o5 2020-12-01 18:53:22 +08:00
|