有人说"c 语言是跨平台支持相当好的一门语言,配合对应的编译器,在 arm 架构上运行是完全没有问题的" - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Neojoke
V2EX    C

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

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

    同志们,你们怎么看? 尤其是有 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
      &nbp; 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     Solana     5431 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 07:43 PVG 15:43 LAX 00:43 JFK 03:43
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86