V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wheeler
V2EX  ›  问与答

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

  •  1
     
  •   wheeler · 2018-09-01 10:27:36 +08:00 · 5348 次点击
    这是一个创建于 2311 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    注意

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

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

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

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

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

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

    历史包袱见 《 C Traps and Pitfalls 》

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