V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Neojoke
V2EX  ›  C

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

  •  
  •   Neojoke · 2020-11-30 19:41:21 +08:00 · 5792 次点击
    这是一个创建于 1489 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    其实你是被偷换概念了,“跨平台” 有很多层含义,你想问的是 **一个软件 /项目** 不修改或少量修改就能跨平台,但回答的是一个语言 /标准库跨平台。
    joydragon
        25
    joydragon  
       2020-11-30 22:23:44 +08:00
    没说错啊,你也可以说汇编是比 C 更跨平台的语言了~
    wanguorui123
        26
    wanguorui123  
       2020-11-30 22:24:09 +08:00 via iPhone
    主要是编译器,语言不是重点
    jim9606
        27
    jim9606  
       2020-11-30 22:40:54 +08:00
    因为任何的计算芯片,厂商至少都会做一个 C 编译器给用户用(连 AMD GCN 这种 GPU 都有),不然芯片没有人能用,别的语言可不保证这点。
    虽然这并不能保证 C 的程序可以零成本移植(写 OS 绕不开少量平台特定的汇编,没有 C 标准库支持)
    chinvo
        28
    chinvo  
       2020-11-30 23:00:30 +08:00 via iPhone
    裸片开发 stm32 和 c51 都能用 C,但是谁说能无痛移植我打死谁
    namelosw
        29
    namelosw  
       2020-11-30 23:57:19 +08:00
    你有 source code 编译当然啥系统都可以, 但是闭源发行商可以选择不发 arm 的 binary, 或者疏于维护一直不发...
    no1xsyzy
        30
    no1xsyzy  
       2020-12-01 01:59:21 +08:00
    @shayuvpn0001 挑选版本 go<1.0 (未自举,输出成 C 源代码
    @joydragon 汇编不行,你得直接碰指令集,有些平台没有 movab,必须 movbw 再 movwb
    xuanbg
        31
    xuanbg  
       2020-12-01 05:00:44 +08:00
    话虽然没毛病,但跨平台哪有说的这么简单。不说跨平台,就是简单移植到另一个平台都很不容易呢。
    MeteorCat
        32
    MeteorCat  
       2020-12-01 07:37:13 +08:00 via Android
    epoll,kqueue,iocp
    x86
        33
    x86  
       2020-12-01 08:07:53 +08:00
    跟“钱不是万能的”一样,你觉得有问题,但实际没毛病
    wizardoz
        34
    wizardoz  
       2020-12-01 08:26:56 +08:00
    他说的没错。
    前段时间引入了 C++,结果引入各种坑。主要是因为 GCC4 对 C++标准的支持不完整。
    binux
        35
    binux  
       2020-12-01 08:49:03 +08:00 via Android
    这话说得,你可以套用任何编程语言,甚至能够套在汇编上。只要你不用特定指令集,不调 system call 。
    wangyzj
        36
    wangyzj  
       2020-12-01 09:00:18 +08:00
    没错
    GM
        37
    GM  
       2020-12-01 09:12:54 +08:00
    对“跨平台”的理解不一样罢了。
    你理解的“跨平台”:像 java 一样,write once, run anywhere.
    他理解的“跨平台”:*只*要*做好操作系统适配,在哪个操作系统上都能编译运行。
    pigzzz
        38
    pigzzz  
       2020-12-01 09:14:44 +08:00
    现代的互联网都是架构在 c 语言上的,你说对不对
    lijialong1313
        39
    lijialong1313  
       2020-12-01 09:16:51 +08:00
    这算是非常正确的废话吧……
    zjsxwc
        40
    zjsxwc  
       2020-12-01 09:20:49 +08:00
    弱类型 + 最强跨平台特性
    dynastysea
        41
    dynastysea  
       2020-12-01 10:10:24 +08:00
    没毛病啊,我们代码同时兼容 arm 和 x86 两个平台,区别 arm 就是几个编译选项,代码层面是完全兼容的,当然如果用到汇编指令的话就另说,不过汇编大部分也是兼容的
    hitmanx
        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 上的实现都先用最朴素的实现先顶着。如果没有封装好,平台相关的代码遍布整个软件各个层面的话,那就是另外一回事了。
    Neojoke
        43
    Neojoke  
    OP
       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
        44
    gamexg  
       2020-12-01 10:34:34 +08:00
    c 自身没问题,标准库一般也没大问题。
    但是其他库就,特别是图形界面等
    LokiSharp
        45
    LokiSharp  
       2020-12-01 13:36:31 +08:00
    单纯语言上是没问题的,适配是编译器的活。但是第三方依赖就难说了
    dynastysea
        46
    dynastysea  
       2020-12-01 13:47:27 +08:00
    @Neojoke 性能差距没你想的那么大。。华为鲲鹏卖的不错啊,可以了解下“安可”
    ysc3839
        47
    ysc3839  
       2020-12-01 13:54:54 +08:00 via Android
    针对附言,我觉得写代码比较正常的写,同操作系统的情况下迁移到别的架构是没什么问题的。
    比如说我自己用 C++ 写的 Windows 应用,直接编译为 ARM64 版本,在树莓派上跑是没有问题的。
    mxT52CRuqR6o5
        48
    mxT52CRuqR6o5  
       2020-12-01 13:55:15 +08:00
    C 当然是能跨平台的,跨不了平台不是 C 的问题,而是调用了平台相关 API 、内联了汇编之类的,纯 C 的特性都是跨平台的
    Neojoke
        49
    Neojoke  
    OP
       2020-12-01 15:47:26 +08:00
    @dynastysea 可能我自己做的测试感觉差距比较大吧,尤其是 ES for arm64,Oracle for Linux arm 我都自己跑过,基本上都是凉半截。
    其实这个不是讨论 C 语言的,是讨论,大部分程序员切换到 Arm based 的开发机上,现有的库、framework 以及开发环境支持的成本高不高。
    Neojoke
        50
    Neojoke  
    OP
       2020-12-01 15:49:22 +08:00
    @mxT52CRuqR6o5 我发现计算密集型的程序,在 arm 上跑跟 x86 差距很大,尤其是实时计算的框架,所以 arm based 芯片服务器,基本上不适合做密集计算的业务。
    Neojoke
        51
    Neojoke  
    OP
       2020-12-01 15:56:14 +08:00
    @jim9606 我同意你说的事实情况,但却还不够完全,从写出的代码上来看,的确是这样的,但这是对增量的世界来说的,举个例子,如果 arm 公版架构升级,那 Linux for armv8 虽然能跑,但是却利用不上最新的芯片性能,Linux 的内核程序就要重新适配一版新的 arm 公版架构,这个工作量不是只添加几个宏,修改几处汇编指令就完事的,牵扯到大量底层的适配和优化。所以,你看 Linux 社区适配 arm 花了多久,倒推一下,底层不适配新的 arm 架构,上层的应用虽然能跑在 arm 的机器上,但性能还是会差很多。
    aguesuka
        52
    aguesuka  
       2020-12-01 17:21:45 +08:00 via Android
    也就 hello world 可以。写个 socket 就要考虑用跨平台的库了,如果要做图像页面,那每个平台都要封一层
    jim9606
        53
    jim9606  
       2020-12-01 17:35:17 +08:00
    @Neojoke
    内核适配主要指外设驱动的支持,不过这些跟 ARM ISA 没有直接关联。还有一些是 ARM SoC 经常用到但实现是架构无关的功能(例如异构多核支持、调频的 cpufreq governor )。
    至于高性能方面更多是 userland 还有跟驱动配套的 library 的事情,例如在计算库和编译器使用特定的 SIMD 指令优化等。

    而消费用户接触到的大部分应用都不是计算密集的应用,这类程序只要能跑就行,如果开源的话基本就是修改一下 toolchain 就能跑起来,但想性能更好就无可避免地引入一些架构相关的改动。如果应用是把这部分外包给 library 去实现的那就可以通过升级依赖来获得性能改进了。
    mxT52CRuqR6o5
        54
    mxT52CRuqR6o5  
       2020-12-01 18:53:22 +08:00
    @Neojoke
    之前有 V 友发过贴,说是政府相关的项目要求部署到 ARM 的服务器上
    核算下来算力成本算下来比不上 x86 的
    现阶段确实是这样,不过以后有可能成本可以降下来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1938 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:27 · PVG 08:27 · LAX 16:27 · JFK 19:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.