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

2018-09-01 10:27:36 +08:00
 wheeler

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

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

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

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

注意

5096 次点击
所在节点    问与答
33 条回复
wheeler
2018-09-01 15:46:32 +08:00
@wzxlovesy 上面提到的那些问题都是语言层面的。
zhangjn
2018-09-01 16:37:51 +08:00
@wheeler 出于兼容性要保持的不好的做法有哪些呢,能举个例子否, 是否可以不用呢。
文件级别的 namespace 是什么意思, 是要在一个文件里面放一些相同名称的函数或变量, 然后用 namespace 隔离开 从而当成两个文件用么? 现在的 gcc 支持函数里面嵌套函数了,可以近似得到 namespace 的效果了
linthieda
2018-09-01 16:44:47 +08:00
宏是 meta-peogrammung 神器啊
wzxlovesy
2018-09-01 17:15:12 +08:00
@wheeler 都一个意思,编译器各家有各家的做法,如果各家做法一致,也就没有所谓的未定义了,就是约定俗成了
wheeler
2018-09-01 17:49:42 +08:00
@zhangjn 个人觉得头文件(这个没办法强求太多)、字符串以 0 结尾,数组传参时退化成指针这几个不太好。
janxin
2018-09-01 18:29:27 +08:00
LZ 要不要了解一下 c++
techmale
2018-09-01 19:18:42 +08:00
有趣的是 多数评论和楼主说的并不是同一件事
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 )
coderluan
2018-09-01 21:06:07 +08:00
编程语言是反木桶效应,最长的板决定地位,C 语言的性能就最长的木板,只要你关心的是性能,那样别的问题都不是问题,如果你关心的不是性能,直接选别的语言就完了,毕竟语言只是工具,所以你工作不涉及编译跨平台啥的,这些都根本不用关心,有了问题再 google 一点问题也没有。
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
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
2018-09-03 02:04:54 +08:00
@gnaggnoyil 我可没说 C 是最底层的语言,毕竟,能有什么语言比汇编还底层的?不过话说回来,又有哪门高级语言比 C 更接近底层的?如果你觉得有,那我愿闻其详。
gnaggnoyil
2018-09-03 20:50:02 +08:00
@zn 有啊,high level assembly,C--和 LLVM 都是比 C 能更好地描述当前大部分机器的共同特征的语言.即使你想排除出"长的和 C 比较像"这个要求,ALGOL,Pascal/Ada 甚至是 Rust 其"接近底层"的程度也和 C 不相上下.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/485120

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX