Neojoke
V2EX  ›  C

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

  •  
  •   Neojoke · Nov 30, 2020 · 7431 views
    This topic created in 2168 days ago, the information mentioned may be changed or developed.

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

    Supplement 1  ·  Dec 1, 2020
    其实他想说的是跨平台,因为最近出了 arm 版的 Mac,这里讨论了一下,很多现有的开发环境,尤其是只支持 x86 的迁移到 arm 上的难度和必要。
    这位朋友就说,就算是 C 语言相关的底层,也是很容易迁移到 arm 上的,因为”c 语言是跨平台支持相当好的一门语言,配合对应的编译器,在 arm 架构上运行是完全没有问题的“
    大家怎么看呢?
    Supplement 2  ·  Dec 1, 2020
    其实这个不是讨论 C 语言的,是讨论,大部分程序员切换到 Arm based 的开发机上,现有的库、framework 以及开发环境支持的成本高不高。
    54 replies  •  2020-12-01 18:53:22 +08:00
    ipwx
    ipwx
    Nov 30, 2020❤️1
    1
    他说的没错
    zhuangzhuang1988
    zhuangzhuang1988
    Nov 30, 2020
    2
    √
    dawn009
    dawn009
    Nov 30, 2020
    3
    他说的没错。目前的操作系统几乎都可以视为 C 的运行时环境
    UFc8704I4Bv63gy2
    UFc8704I4Bv63gy2
    Nov 30, 2020 via Android
    4
    他说的没错
    love
    love
    Nov 30, 2020
    5
    arm 的 os 不能用 C 语言那用啥?
    iloveayu
    iloveayu
    Nov 30, 2020 via Android
    6
    这话说的无懈可击
    cmostuor
    cmostuor
    Nov 30, 2020
    7
    @ipwx +1, 除了汇编和机器语言没见过不跨平台的语言, 高级语言基本上都是跨平台的.
    yungo8
    yungo8
    Nov 30, 2020 via Android
    8
    配合相应的编译器,go 的跨平台支持也相当的好吧
    cmostuor
    cmostuor
    Nov 30, 2020
    9
    毫不夸张的的说现在文明的科技产品都是建立在 C 语言之上的
    shayuvpn0001
    shayuvpn0001
    Nov 30, 2020
    10
    @yeqizhang 嘿嘿,路由器里跑在一众 MIPS 处理器上的 C 代码想问问什么叫相当的好?还有一堆跑在 C51 处理器,PowerPC 处理器上的 C 代码。。。
    dreasky
    dreasky
    Nov 30, 2020
    11
    其他高级语言的解释器也是配合 c 写的,如果重头到尾都是纯 c 代码基本上跨平台都没什么问题,问题是用了二进制 lib 就难搞了
    cyyzero
    cyyzero
    Nov 30, 2020 via iPhone
    12
    没毛病,新的平台出来时首先要移植的几乎都是 c 的 runtime 和编译器
    bruce0
    bruce0
    Nov 30, 2020
    13
    @yeqizhang go 的跨平台也支持的相当好,但是 go 有个问题,就是自带运行时,导致在一些低配(内存低)机器上,可能无法运行
    Cielsky
    Cielsky
    Nov 30, 2020 via Android
    14
    显然
    Mohanson
    Mohanson
    Nov 30, 2020 via Android❤️3
    15
    世界上只有两种语言,大部分语言是基于某个处理器做编译器,只有 c 语言,是处理器要基于 c 语言做设计。这不是玩笑话,我至少在 webassembly 和 riscv 文档上都看到过 “该指令集设计和优化初期只考虑 c 语言” 类似的话
    icexin
    icexin
    Nov 30, 2020❤️10
    16
    看你这个朋友说的语境,如果一个 c 程序用的库都是跨平台的当然没问题,简单如 hello world 这种只用 libc 的程序,甚至能在单片机上编译运行。然而任何复杂的程序不可避免要跟操作系统进行交互,形如创建进程这样常见的 api 在 windows 和 linux 上都有很大的不同,更别说文件系统结构等其他复杂问题,在 cpu 指令方面还有字长和大小端等问题。因此很多高级语言,如 python,java 是通过一个强大的标准库来屏蔽这些差异。当然,如果你说的跨平台是指程序在对应的平台上有编译器那就另说了。
    Mohanson
    Mohanson
    Nov 30, 2020
    17
    不过我估计楼主的真实意思其实是 "把 c 拿来写安卓 app"..., 否则楼主这问题真的欠打
    nightwitch
    nightwitch
    Nov 30, 2020
    18
    说的没毛病。编程的历史分为 C 语言之前,和 C 语言之后。C 语言发明之后,你几乎找不到一个不支持 C 语言的平台了。
    irytu
    irytu
    Nov 30, 2020 via iPhone
    19
    没毛病
    jingslunt
    jingslunt
    Nov 30, 2020 via Android
    20
    完全没毛病,但却是贼麻烦的一个事情。每个二进制文件都需要这个对应的 arm 版本,非常折腾人。不如只需要替换 vm 的语言方便
    phpIsNumberOne
    phpIsNumberOne
    Nov 30, 2020
    21
    还有不支持 c 的?
    Alan1994
    Alan1994
    Nov 30, 2020
    22
    数典不能忘祖
    Kellerman
    Kellerman
    Nov 30, 2020
    23
    是这个意思吧
    QingXuJiaZhi
    QingXuJiaZhi
    Nov 30, 2020❤️2
    24
    C 语言是支持,标准库也很可能几乎一样,但事实上软件代码基本上要重写…… 简单来说就是,支持语言不等于可以简单移植。与 Java 的一次编写到处运行也不一样。

    其实你是被偷换概念了,“跨平台” 有很多层含义,你想问的是 **一个软件 /项目** 不修改或少量修改就能跨平台,但回答的是一个语言 /标准库跨平台。
    joydragon
    joydragon
    Nov 30, 2020
    25
    没说错啊,你也可以说汇编是比 C 更跨平台的语言了~
    wanguorui123
    wanguorui123
    Nov 30, 2020 via iPhone
    26
    主要是编译器,语言不是重点
    jim9606
    jim9606
    Nov 30, 2020
    27
    因为任何的计算芯片,厂商至少都会做一个 C 编译器给用户用(连 AMD GCN 这种 GPU 都有),不然芯片没有人能用,别的语言可不保证这点。
    虽然这并不能保证 C 的程序可以零成本移植(写 OS 绕不开少量平台特定的汇编,没有 C 标准库支持)
    chinvo
    chinvo
    Nov 30, 2020 via iPhone
    28
    裸片开发 stm32 和 c51 都能用 C,但是谁说能无痛移植我打死谁
    namelosw
    namelosw
    Nov 30, 2020
    29
    你有 source code 编译当然啥系统都可以, 但是闭源发行商可以选择不发 arm 的 binary, 或者疏于维护一直不发...
    no1xsyzy
    no1xsyzy
    Dec 1, 2020
    30
    @shayuvpn0001 挑选版本 go<1.0 (未自举,输出成 C 源代码
    @joydragon 汇编不行,你得直接碰指令集,有些平台没有 movab,必须 movbw 再 movwb
    xuanbg
    xuanbg
    Dec 1, 2020
    31
    话虽然没毛病,但跨平台哪有说的这么简单。不说跨平台,就是简单移植到另一个平台都很不容易呢。
    MeteorCat
    MeteorCat
    Dec 1, 2020 via Android
    32
    epoll,kqueue,iocp
    x86
    x86
    Dec 1, 2020
    33
    跟“钱不是万能的”一样,你觉得有问题,但实际没毛病
    wizardoz
    wizardoz
    Dec 1, 2020
    34
    他说的没错。
    前段时间引入了 C++,结果引入各种坑。主要是因为 GCC4 对 C++标准的支持不完整。
    binux
    binux
    Dec 1, 2020 via Android
    35
    这话说得,你可以套用任何编程语言,甚至能够套在汇编上。只要你不用特定指令集,不调 system call 。
    wangyzj
    wangyzj
    Dec 1, 2020
    36
    没错
    GM
    GM
    Dec 1, 2020
    37
    对“跨平台”的理解不一样罢了。
    你理解的“跨平台”:像 java 一样,write once, run anywhere.
    他理解的“跨平台”:*只*要*做好操作系统适配,在哪个操作系统上都能编译运行。
    pigzzz
    pigzzz
    Dec 1, 2020
    38
    现代的互联网都是架构在 c 语言上的,你说对不对
    lijialong1313
    lijialong1313
    Dec 1, 2020
    39
    这算是非常正确的废话吧……
    zjsxwc
    zjsxwc
    Dec 1, 2020
    40
    弱类型 + 最强跨平台特性
    digitv
    digitv
    Dec 1, 2020
    41
    没毛病啊,我们代码同时兼容 arm 和 x86 两个平台,区别 arm 就是几个编译选项,代码层面是完全兼容的,当然如果用到汇编指令的话就另说,不过汇编大部分也是兼容的
    hitmanx
    hitmanx
    Dec 1, 2020
    42
    从应用本身的角度上来说,肯定是越上层越好移植,越底层越难移植。软件本身无非就是一层一层的封装,层次越高,需要关心底下的操作系统和硬件的知识就越少。但是整个软件栈里总得有一层去支持这些不同的架构,有很多恶心的#if def,有很多的 system API,甚至有一些汇编(最简单的比如实现不同平台的 atomic)去封装这么一个 HAL layer 。

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

    而消费用户接触到的大部分应用都不是计算密集的应用,这类程序只要能跑就行,如果开源的话基本就是修改一下 toolchain 就能跑起来,但想性能更好就无可避免地引入一些架构相关的改动。如果应用是把这部分外包给 library 去实现的那就可以通过升级依赖来获得性能改进了。
    mxT52CRuqR6o5
    mxT52CRuqR6o5
    Dec 1, 2020
    54
    @Neojoke
    之前有 V 友发过贴,说是政府相关的项目要求部署到 ARM 的服务器上
    核算下来算力成本算下来比不上 x86 的
    现阶段确实是这样,不过以后有可能成本可以降下来
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   674 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 103ms · UTC 21:20 · PVG 05:20 · LAX 13:20 · JFK 16:20
    ♥ Do have faith in what you're doing.