最近在看SEI CERT C Coding Standard,每次都有新发现。
简单的感受就是:C 语言的历史包袱重,坑多。要想写出可靠的代码得小心,同时也要求项目管理者严格的管理,比如 kernel 这种。
C 标准相当晦涩,比如Undefined Behavior、Unspecified Behavior、Implementation-defined Behavior。各种语言律师才清楚的语言细节(language-lawyer)。
常说“功夫在诗外”,这种语言的细节让我觉得不该把精力投注于此,不知 V2EX 的各位怎么看待这个问题的?
注意:
![]() | 1 qwertyssp 2018-09-01 10:38:36 +08:00 via Android 何出此言 |
2 zn 2018-09-01 10:39:15 +08:00 ![]() 没有历史包袱的语言大概只有上帝语了。 C 语言的最大优势是可以直接操作底层,同时保持高级语言的语法,语言本身也很简单。 这个优势决定了在很多地方,尤其是在资源紧张的地方,C 是最优语言,所以在可见的将来,C 语言不会没落。 |
3 AngelCriss 2018-09-01 10:48:52 +08:00 via Android ![]() 其实 lz 只是,不会用而已 |
![]() | 4 wzxlovesy 2018-09-01 10:52:29 +08:00 via Android ![]() 我觉得倒不是 c 包袱太重,我个人用 c 就把它当作高级汇编用,还是挺随心所欲的。 包袱重的是各种组织或项目对于 c 编写的扩展代码的要求,甚至是库也有很多包袱。 所以我觉得语言本身没啥问题,扩展太繁复而已。但如果像我这样不用任何库的话,也就没什么好怕的了。 |
![]() | 5 wzxlovesy 2018-09-01 10:53:20 +08:00 via Android 语言的细节不多,你说到的细节大概都是编译器的坑吧。 |
![]() | 6 SiqingYu 2018-09-01 10:54:17 +08:00 这 Confluence 资源不错,收藏一波。 |
![]() | 7 lance6716 2018-09-01 11:03:07 +08:00 via Android 面向 ISO 编程 |
8 lychnis 2018-09-01 11:11:16 +08:00 via Android 不知道你要写什么项目,需要看这些东西。我都没看过这些,写过驱动和嵌入式现在搞 Java 了。。。但没你说的这些东西,上面有哥们说你不会用。。哈哈 不是鄙视你,可能你真的是刚入门?我觉得没必要看这些东西,直接拿开始写就好了 |
![]() | 9 yangxin0 2018-09-01 11:14:02 +08:00 via iPhone 写了十几年 c 语言和其他语言,c 语言是最简洁的。 |
![]() | 10 wwqgtxx 2018-09-01 11:26:26 +08:00 via iPhone 你要是说 c 历史包袱重,c++学的得要命呀 |
11 zhangjn 2018-09-01 11:43:08 +08:00 没有觉得 C 语言有什么历史包袱啊, 这是我玩的最溜的一种语言了, 其次是 bash shell |
![]() | 12 arzterk 2018-09-01 12:23:51 +08:00 ![]() c 的抽象层次太低了,写复杂点的逻辑代码很累,只适合做靠近硬件和 os 的东西 |
13 zwyc 2018-09-01 12:28:29 +08:00 via Android @zn nvidia 的 gpu 指令就是没有历史包袱,每一代不一样。每一代都是可以搞翻天覆地的变化。只要前面编译器做好就行;) |
![]() | 16 gamexg 2018-09-01 13:45:47 +08:00 c 没封装隐藏底层细节,坑倒是不多 但是累,写起来感觉麻烦。 |
![]() | 17 innoink 2018-09-01 14:26:47 +08:00 via Android ![]() c 的问题是,大项目不好管理,文档难写,难阅读,本身还是很简洁的 要说包袱和细节,c++要多得多 |
![]() | 18 tomfs 2018-09-01 14:44:39 +08:00 via iPhone 第一次听说 c 还历史包袱重的,我个人觉得 c 已经是最简洁的语言了,楼主了解下 c++? |
![]() | 19 kawaiidora 2018-09-01 15:23:52 +08:00 ![]() 同意,C 的流行主要是 Unix ABI,以及移植到新硬件最容易;在语言设计上也是考虑简化实现而不是简化使用。 |
![]() | 20 wheeler OP |
22 zhangjn 2018-09-01 16:37:51 +08:00 @wheeler 出于兼容性要保持的不好的做法有哪些呢,能举个例子否, 是否可以不用呢。 文件级别的 namespace 是什么意思, 是要在一个文件里面放一些相同名称的函数或变量, 然后用 namespace 隔离开 从而当成两个文件用么? 现在的 gcc 支持函数里面嵌套函数了,可以近似得到 namespace 的效果了 |
23 linthieda 2018-09-01 16:44:47 +08:00 via Android 宏是 meta-peogrammung 神器啊 |
![]() | 24 wzxlovesy 2018-09-01 17:15:12 +08:00 via Android @wheeler 都一个意思,编译器各家有各家的做法,如果各家做法一致,也就没有所谓的未定义了,就是约定俗成了 |
![]() | 26 janxin 2018-09-01 18:29:27 +08:00 via iPad LZ 要不要了解一下 c++ |
![]() | 27 techmale 2018-09-01 19:18:42 +08:00 via Android 有趣的是 多数评论和楼主说的并不是同一件事 |
![]() | 28 icylogic 2018-09-01 19:59:23 +08:00 ![]() @zwyc = = 然后 9.0 能跑通的代码 9.1 就不行了,还得等 9.2 修复。 c 写一些需要性能 && 结构比较简单(不需要考虑太多工程性)的东西挺好的。 所以可以把最底层的那一层用 c 写,上层再换别的组织。 历史包袱见 《 C Traps and Pitfalls 》 我觉得纯 c 搞有一定规模的、偏应用向的项目很容易出现 nginx 那种四级指针一样的东西 …… 所以确实需要有刻意设计好的结构( lua.c ) |
![]() | 29 coderluan 2018-09-01 21:06:07 +08:00 ![]() 编程语言是反木桶效应,最长的板决定地位,C 语言的性能就最长的木板,只要你关心的是性能,那样别的问题都不是问题,如果你关心的不是性能,直接选别的语言就完了,毕竟语言只是工具,所以你工作不涉及编译跨平台啥的,这些都根本不用关心,有了问题再 google 一点问题也没有。 |
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 也能跑 |
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 原则都不遵守好吧…… |
32 zn 2018-09-03 02:04:54 +08:00 @gnaggnoyil 我可没说 C 是最底层的语言,毕竟,能有什么语言比汇编还底层的?不过话说回来,又有哪门高级语言比 C 更接近底层的?如果你觉得有,那我愿闻其详。 |
33 gnaggnoyil 2018-09-03 20:50:02 +08:00 @zn 有啊,high level assembly,C--和 LLVM 都是比 C 能更好地描述当前大部分机器的共同特征的语言.即使你想排除出"长的和 C 比较像"这个要求,ALGOL,Pascal/Ada 甚至是 Rust 其"接近底层"的程度也和 C 不相上下. |