wheeler
V2EX  ›  问与答

使用 C 语言一段时间之后的感受(C 语言的历史包袱,标准等)

  •  1
     
  •   wheeler · Sep 1, 2018 · 6555 views
    This topic created in 2986 days ago, the information mentioned may be changed or developed.

    最近在看SEI CERT C Coding Standard,每次都有新发现。

    简单的感受就是:C 语言的历史包袱重,坑多。要想写出可靠的代码得小心,同时也要求项目管理者严格的管理,比如 kernel 这种。

    C 标准相当晦涩,比如Undefined Behavior、Unspecified Behavior、Implementation-defined Behavior。各种语言律师才清楚的语言细节(language-lawyer)。

    常说“功夫在诗外”,这种语言的细节让我觉得不该把精力投注于此,不知 V2EX 的各位怎么看待这个问题的?

    注意:

    • 本帖不是争论语言的优劣性
    • C 和 C++是不同的语言
    33 replies  •  2018-09-03 20:50:02 +08:00
    qwertyssp
    qwertyssp
    Sep 1, 2018 via Android
    1
    何出此言
    zn
    zn
    Sep 1, 2018❤️1
    2
    没有历史包袱的语言大概只有上帝语了。

    C 语言的最大优势是可以直接操作底层,同时保持高级语言的语法,语言本身也很简单。

    这个优势决定了在很多地方,尤其是在资源紧张的地方,C 是最优语言,所以在可见的将来,C 语言不会没落。
    AngelCriss
    AngelCriss
    Sep 1, 2018 via Android❤️1
    3
    其实 lz 只是,不会用而已
    wzxlovesy
    wzxlovesy
    Sep 1, 2018 via Android❤️1
    4
    我觉得倒不是 c 包袱太重,我个人用 c 就把它当作高级汇编用,还是挺随心所欲的。

    包袱重的是各种组织或项目对于 c 编写的扩展代码的要求,甚至是库也有很多包袱。

    所以我觉得语言本身没啥问题,扩展太繁复而已。但如果像我这样不用任何库的话,也就没什么好怕的了。
    wzxlovesy
    wzxlovesy
    Sep 1, 2018 via Android
    5
    语言的细节不多,你说到的细节大概都是编译器的坑吧。
    SiqingYu
    SiqingYu
    Sep 1, 2018
    6
    这 Confluence 资源不错,收藏一波。
    lance6716
    lance6716
    Sep 1, 2018 via Android
    7
    面向 ISO 编程
    lychnis
    lychnis
    Sep 1, 2018 via Android
    8
    不知道你要写什么项目,需要看这些东西。我都没看过这些,写过驱动和嵌入式现在搞 Java 了。。。但没你说的这些东西,上面有哥们说你不会用。。哈哈 不是鄙视你,可能你真的是刚入门?我觉得没必要看这些东西,直接拿开始写就好了
    yangxin0
    yangxin0
    Sep 1, 2018 via iPhone
    9
    写了十几年 c 语言和其他语言,c 语言是最简洁的。
    wwqgtxx
    wwqgtxx
    Sep 1, 2018 via iPhone
    10
    你要是说 c 历史包袱重,c++学的得要命呀
    zhangjn
    zhangjn
    Sep 1, 2018
    11
    没有觉得 C 语言有什么历史包袱啊, 这是我玩的最溜的一种语言了, 其次是 bash shell
    arzterk
    arzterk
    Sep 1, 2018❤️1
    12
    c 的抽象层次太低了,写复杂点的逻辑代码很累,只适合做靠近硬件和 os 的东西
    zwyc
    zwyc
    Sep 1, 2018 via Android
    13
    @zn nvidia 的 gpu 指令就是没有历史包袱,每一代不一样。每一代都是可以搞翻天覆地的变化。只要前面编译器做好就行;)
    zn
    zn
    Sep 1, 2018
    14
    @zwyc 其实每一代都是一宗新语言吧,只不过起名部实在是想不出那么多名字了,就沿用老名字了 🐶
    zwyc
    zwyc
    Sep 1, 2018 via Android
    15
    @zn 哈哈,差不多了
    gamexg
    gamexg
    Sep 1, 2018
    16
    c 没封装隐藏底层细节,坑倒是不多
    但是累,写起来感觉麻烦。
    innoink
    innoink
    Sep 1, 2018 via Android❤️1
    17
    c 的问题是,大项目不好管理,文档难写,难阅读,本身还是很简洁的
    要说包袱和细节,c++要多得多
    tomfs
    tomfs
    Sep 1, 2018 via iPhone
    18
    第一次听说 c 还历史包袱重的,我个人觉得 c 已经是最简洁的语言了,楼主了解下 c++?
    kawaiidora
    kawaiidora
    Sep 1, 2018❤️1
    19
    同意,C 的流行主要是 Unix ABI,以及移植到新硬件最容易;在语言设计上也是考虑简化实现而不是简化使用。
    wheeler
    wheeler
    OP
    Sep 1, 2018
    20
    @tomfs
    @zhangjn
    可能我表述不够清楚,C 语言是很老的语言了,这就导致现在看来不太好的做法出于兼容性考虑仍得保持下去,比如宏;一些好的特性也很难加入进来,比如文件级别的 namespace。
    wheeler
    wheeler
    OP
    Sep 1, 2018
    21
    @wzxlovesy 上面提到的那些问题都是语言层面的。
    zhangjn
    zhangjn
    Sep 1, 2018
    22
    @wheeler 出于兼容性要保持的不好的做法有哪些呢,能举个例子否, 是否可以不用呢。
    文件级别的 namespace 是什么意思, 是要在一个文件里面放一些相同名称的函数或变量, 然后用 namespace 隔离开 从而当成两个文件用么? 现在的 gcc 支持函数里面嵌套函数了,可以近似得到 namespace 的效果了
    linthieda
    linthieda
    Sep 1, 2018 via Android
    23
    宏是 meta-peogrammung 神器啊
    wzxlovesy
    wzxlovesy
    Sep 1, 2018 via Android
    24
    @wheeler 都一个意思,编译器各家有各家的做法,如果各家做法一致,也就没有所谓的未定义了,就是约定俗成了
    wheeler
    wheeler
    OP
    Sep 1, 2018
    25
    @zhangjn 个人觉得头文件(这个没办法强求太多)、字符串以 0 结尾,数组传参时退化成指针这几个不太好。
    janxin
    janxin
    Sep 1, 2018 via iPad
    26
    LZ 要不要了解一下 c++
    techmale
    techmale
    Sep 1, 2018 via Android
    27
    有趣的是 多数评论和楼主说的并不是同一件事
    icylogic
    icylogic
    Sep 1, 2018❤️1
    28
    @zwyc = = 然后 9.0 能跑通的代码 9.1 就不行了,还得等 9.2 修复。

    c 写一些需要性能 && 结构比较简单(不需要考虑太多工程性)的东西挺好的。
    所以可以把最底层的那一层用 c 写,上层再换别的组织。

    历史包袱见 《 C Traps and Pitfalls 》

    我觉得纯 c 搞有一定规模的、偏应用向的项目很容易出现 nginx 那种四级指针一样的东西 …… 所以确实需要有刻意设计好的结构( lua.c )
    coderluan
    coderluan
    Sep 1, 2018❤️1
    29
    编程语言是反木桶效应,最长的板决定地位,C 语言的性能就最长的木板,只要你关心的是性能,那样别的问题都不是问题,如果你关心的不是性能,直接选别的语言就完了,毕竟语言只是工具,所以你工作不涉及编译跨平台啥的,这些都根本不用关心,有了问题再 google 一点问题也没有。
    neoblackcap
    neoblackcap
    Sep 2, 2018
    30
    @kawaiidora C 的 ABI 是依赖于操作系统的,主要是因为主流操作系统都是用 C 写的,而且 Intel 也参与进去 ABI 的标准制定,导致 C 语言的 ABI 天生注定要稳定。不说 Unix-like 的操作系统,你用 c89 写的程序,windows xp 能跑 windows 10 也能跑
    gnaggnoyil
    gnaggnoyil
    Sep 2, 2018
    31
    @zn 问题是 C 语言并不算是真正底层.C 语言中提供的抽象比如控制流,函数,结构体等等比起底层实现而言那可是封装了不知道多少层.很多人之所以会认为 C 语言能较好地反映底层纯粹是因为选择性忽略了底层实现中拥有但是 C 中不能或者难以抽象的设施.比如 C 语言中能轻易地控制寄存器分配吗?别忘了 register 关键字现在都被 deprecated 了.还有 x86 的 FAR 和 NEAR 指针,不借助 implementation 的扩展你怎么表示出来?
    一个事实是在不考虑已有 legacy 代码库的情况下——在一个语言刚被发明出来的时候显然如此—— C 语言就是在几乎各种特性上全面地不如比它更早诞生的 Pascal,包括平台无关性,编译效率和运行效率.
    @yangxin0 举个例子,C 中指针被同时拿去用在"间接访问的引用","一段连续的内存空间","迭代的下标"和"类型擦除"这几个不相干也不正交的场合里,就这设计也能算简洁?首先连 UNIX 所推崇的 KISS 原则都不遵守好吧……
    zn
    zn
    Sep 3, 2018
    32
    @gnaggnoyil 我可没说 C 是最底层的语言,毕竟,能有什么语言比汇编还底层的?不过话说回来,又有哪门高级语言比 C 更接近底层的?如果你觉得有,那我愿闻其详。
    gnaggnoyil
    gnaggnoyil
    Sep 3, 2018
    33
    @zn 有啊,high level assembly,C--和 LLVM 都是比 C 能更好地描述当前大部分机器的共同特征的语言.即使你想排除出"长的和 C 比较像"这个要求,ALGOL,Pascal/Ada 甚至是 Rust 其"接近底层"的程度也和 C 不相上下.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1384 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 75ms · UTC 20:18 · PVG 04:18 · LAX 12:18 · JFK 15:18
    ♥ Do have faith in what you're doing.