C 语言高效得简直不合理 已翻译 100%

ChenQi 投递于 2013/01/11 23:35 (共 11 段, 翻译完成于 01-12)
阅读 15920
收藏 78
6
加载中

【译者序:我翻译此文并非推崇C而贬低其他语言。我翻译此文,只是因为作者的多处精到的见解让人深思。作者的出发点,很明显,是纯技术的;各位读者且谨记这一点。】

多年来,我一直试图摆脱C语言。太简单,太多细节需要处理,太古老,太低级。我一直钟爱Java,C++,Erlang。我用它们创建了很多项目,并且自己为这些项目感到骄傲;然而,这些语言,最终,都伤了我的心。他们做出承诺,却无法兑现;他们专注于错误的东西,并且所做的“折衷”最终让你倍感煎熬。于是,我不得不求助于C。

C就是一个万能背包。它高效且高产,有强大的工具和广泛的社区支持,并且它对它所做的“折衷”非常诚实。

对于其他语言,他们能让你更快的工作,但从长远来看,当性能和可靠性变得重要时,C将会为你省去不少麻烦事儿。我个人再次非常痛苦的学到了这一刻。


ChenQi
翻译于 2013/01/12 14:36
7

简单直观

C语言是非常棒的高级语言。我重复一遍,C语言是非常棒的高级语言。当然,它没有Java、C#等高级,自然也没有Erlang、Python或者Javascript高级。但是,他和C++在语言的高级程度上,是一样的;而然它比C++更加简单。当然C++提供了更多的抽象,然而它并没有给出比C更高级的抽象。在使用C++时,你考虑的细节并不比你使用C时的少,除此之外,你还要考虑一堆可笑的无意义东西。

"When someone says: 'I want a programming language in which I need only say what I wish done', give him a lollipop." - Alan J. Perlis
当有人说:“我想要一种编程语言,我仅需要对它说我想干啥就行了。”那么给那个小屁孩儿一个棒棒糖吧。 Alan J. Perlis

我们想要找一种低级语言来代替C,然而找不到;这并非是因为C语言是低级语言,相反,恰恰是因为C语言作为底层机器上的高层抽象太成功了。它如此成功,以至于让大多数的低级语言显得毫无意义。C就是这么擅长它所做的。

C语言的语法和语义强大而直观。它可以用以编写高级算法,同时也可以用以处理底层硬件逻辑。正因为其强大、简单和直观的语法和语义,C语言并不会给我们一些额外的认知上的负担,从而让编程者专注于真正重要的事情。

C颠覆了我们对低级语言的认识。这真了不起。

ChenQi
翻译于 2013/01/12 14:54
4

简单的代码,精致的类型

c语言是一种弱类型语言,其类型系统非常简单。和C++还有java明显的一个区别是,c里面你不能定义“类”(class),你不可以把所有的运行时需要的东西都放到“类”里面。你的所有工作都严格基于结构(struct)和联合(union)。所有的函数调用者必须明确被调用函数的参数类型和返回值类型。所以调用者的自由相对有限。

你只是想要个香蕉,结果来了只自称森林之王的大猩猩——Joe Armstrong

你刚刚听起来像是c语言缺点的东西某种程度上确实一种优点:c语言的API面对用户都力图精简。这避免了庞杂的框架,而力图在简单的类型基础上创造一个小巧的函数库。

而面向对象的语言往往在复杂的类型基础上又构造了庞杂的基础类库,这些库提供了大量的相互依赖的接口,他们的参数和返回值的“类”型也因此更加复杂。每一种“类”又定义了大量的复杂的方法和属性……好吧,更加复杂了。

这并不是说吐面向对象就希望变复杂,但是他们貌似鼓励你把事情变复杂。他们的复杂性使你很容易犯错误。相对来说,c就很少导致错误。c语言尽力构建一个简洁、通俗的类型系统,使用它你会发现你不需要顾及那么多的依赖关系。这使你的开发变得更加简单。

王政
翻译于 2013/01/12 16:12
5

速度之王

c语言不论在处理器中还是在内存堆栈里,都是速度最快的。而且其高效不仅仅体现在速度上,即使是内存的管理以及启动时间上,也无人望其项背。当你需要平衡空间和时间的消费时,c语言从来不会对你隐藏任何细节,原因如下:

-强大的编译器
-k&p风格
每次那些更高层次的编程语言(比如java或者haskell),声称自己能产生接近c语言的表现从程序的时候,这在我听来简直就是笑话。通常,他们为了实现这一点,不得不在语法上做出一些稀奇古怪的事情,比如专门搞一些“聪明的”编译器或者虚拟机……这种古怪的优化行为使语言失去了原本简单的性质,更何况这种优化往往只是针对处理器
王政
翻译于 2013/01/12 15:38
3

当你想要用c语言写一些对运行速度要求严格的东西时,你可以很清楚的知道为什么他很快,这一点不因为你使用的编译器或者虚拟机不同而改变。应用程序中,GC(垃圾回收)的设置将会影响运行。而人机交互将会影响垃圾回收对于数据的处理。

c语言的代码优化直接而有效。即使你不这样认为,在实际工作中也有大量的工具帮助你了解其中的缘故。相对来说,你根本没有必要为此壮起胆子去尝试学习什么虚拟机,什么“智能优化编译器”。当你在使用cpu,内存和IO分析器的时候,c语言绝对不会让你对底层到底发生了什么感到困惑。以上所言,不论是从处理器的角度还是从内存堆栈角度,都证明了c语言是速度之王。

王政
翻译于 2013/01/12 16:48
3

更快的“编写-运行-调试”周期

“编写-运行-调试”这个开发周期对于程序员是十分重要的。如果这个周期足够快,开发中的人机互动足够多,那么你的任务就进行的足够迅速。c具有主流静态类型语言中最快速的人机交互性能。

乐观是程序员的职业病,返工是他们的唯一药方 -Kent Beck
因为“编写-运行-调试”周期更多的是一种开发工具的使用原则而并不是一个语言的核心,所以他经常被忽略。虽然如此,怎么宣扬这个循环对于开发速度的攻击都不为过。悲催的是,这一循环已经被很多变成语言遗忘了,他们反而去追求使用中的代码的可读性。所以,事实是,c仍然是最快的语言。
王政
翻译于 2013/01/12 18:07
3

调试以及核心转储

对于任何你想将你的代码移植过去的系统,你几乎都可以发现一些c语言调试工具和核心转储工具。他们对于你能够快速找到源代码中的问题所在是非常重要的。当然,他们也可能出现问题。

Error, no keyboard -- press F1 to continue.
对于其他的编程语言来说,就没有这么多的工具了。不论如何你都得承认,这些工具对于你c语言的变成起了十分重要的作用。假如要你写一个c语言与其他语言的接口,或许你费了九牛二虎之力,却做出了一个结构十分复杂,运行十分脆弱,使用根本白瞎的废物。

如果是纯粹用c写的程序,你可以察看调用堆栈,变量,参数,当前线程……一切的内存当中最基础的东西都毫发毕见。这真的很有效,尤其是当你面对一个已经宕机几天的服务器进程而无计可施。而当你面对一个用其他高级语言写就的程序是……准备受死吧……

王政
翻译于 2013/01/12 18:39
3

从任何地方调用

C有一个标准化的应用程序二进制接口(ABI)支持每个操作系统,语言和平台的存在。它不需要运行或其他固有的开销。这意味着你编写的代码在C不仅是有价值的,从C代码的调用方,但对于每一个可以想象的包,在语言和环境中还是存在。

"Portability is a result of few concepts and complete definition"

- J. Palme

您可以使用独立的可执行文件,脚本语言,内核代码中,嵌入代码的C代码,作为一个DLL,甚至从SQL调用。这是用得上系统编程和可插拔库。如果你想要写的东西一旦有可用的最可能的环境和使用情况,C是唯一明智的选择。

baba007
翻译于 2013/01/12 17:42
4

是的!它有瑕疵

在C语言中有许多”瑕疵“ 。它没有边界检查,很容易发生内存冲突,有悬空指针和内存/资源泄漏,螺栓支持并发性,没有模块,没有命名空间。错误处理可能相当繁琐和冗长。当调用堆栈崩溃,或者攻击性输入操纵你的进程,很容易就产生一堆错误。

"When all else fails, read the instructions." 当其他办法都失效时,请查看说明! - L. Lasellio
它的瑕疵是非常非常有名的,这是一种优点。所有的语言和实现有陷阱和难题。C只是更坦率的告诉它。还有大量的静态和运行时工具来帮你处理最常见的和危险的错误。世界上很多使用最广泛和可靠的软件是用C打造,这就是缺陷被夸大了的证据,这些瑕疵容易检测和修复。
忠实诚信
翻译于 2013/01/12 18:26
4
为了编写couchbase,我们团队大概花了2 + 人/月解决Erlang虚拟机的问题。我们在Erlang的编译器上花费了大量的时间和精力,却仍然不确定到底发生了什么,而结论是或许是我们的插件的c语言代码出了什么问题。我们想找出问题,然而却找不到。最终我们确定这是Erlang的核心里面有一个条件矛盾错误。这是我们唯一的成果。而太多的语言抽象掉了太多的东西,这无疑增加了类似我们遇到的困难。
王政
翻译于 2013/01/12 19:05
3
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(90)

W_Lu
W_Lu

引用来自“赵开锦”的评论

引用来自“红尘一人”的评论

引用来自“赵开锦”的评论

引用来自“宏哥”的评论

引用来自“灵剑子”的评论

引用来自“艾米”的评论

作者的意思是。C很高效,不仅是运行速度,而且是开发速度。 突然意识到,高级语言的抽象为编码提供了便利,却为调试和测试埋下了障碍… 这文章的确很有道理

Java显然比C更容易调试。调试C语言时,我基本靠悟。调试Java只需要看看出错的调用栈就行了。
在Java中估计有99.99999%的错误都是显然比C语言好找的,剩下的比C语言更难找的错误,基本出现在虚拟机身上。
所谓语言、架构不是用来解决所有问题的,而是将问题空间进行变换,让大部分最常出现的问题解决得很轻松,同时不得不让小部分问题很难解决。道理类似于哈夫曼编码。这就是软件工程,不懂计算机科学、软件工程的人,仅仅能当个语言喷子,比如@宏哥

用C的场景, 根本没有java的事.

就是,比如wps从2005开始就使用C重写的,整个工程从原来的的400多万行源码,几百兆的安装包,缩减到16M,而且无论性能还是可用性与开发周期都取得了明显的改进

啊 这么强

好像有点不对,昨天又查了下资料,原版的wps2003是500多万行源码,然后金山的珠海团队用C重写,花了3年时间重新打造了WPS2005个人版,安装大小15.4M

长见识了!!话说,wps以前用啥语言写的?C++??
赵开锦
赵开锦

引用来自“红尘一人”的评论

引用来自“赵开锦”的评论

引用来自“宏哥”的评论

引用来自“灵剑子”的评论

引用来自“艾米”的评论

作者的意思是。C很高效,不仅是运行速度,而且是开发速度。 突然意识到,高级语言的抽象为编码提供了便利,却为调试和测试埋下了障碍… 这文章的确很有道理

Java显然比C更容易调试。调试C语言时,我基本靠悟。调试Java只需要看看出错的调用栈就行了。
在Java中估计有99.99999%的错误都是显然比C语言好找的,剩下的比C语言更难找的错误,基本出现在虚拟机身上。
所谓语言、架构不是用来解决所有问题的,而是将问题空间进行变换,让大部分最常出现的问题解决得很轻松,同时不得不让小部分问题很难解决。道理类似于哈夫曼编码。这就是软件工程,不懂计算机科学、软件工程的人,仅仅能当个语言喷子,比如@宏哥

用C的场景, 根本没有java的事.

就是,比如wps从2005开始就使用C重写的,整个工程从原来的的400多万行源码,几百兆的安装包,缩减到16M,而且无论性能还是可用性与开发周期都取得了明显的改进

啊 这么强

好像有点不对,昨天又查了下资料,原版的wps2003是500多万行源码,然后金山的珠海团队用C重写,花了3年时间重新打造了WPS2005个人版,安装大小15.4M
红尘一人
红尘一人

引用来自“赵开锦”的评论

引用来自“宏哥”的评论

引用来自“灵剑子”的评论

引用来自“艾米”的评论

作者的意思是。C很高效,不仅是运行速度,而且是开发速度。 突然意识到,高级语言的抽象为编码提供了便利,却为调试和测试埋下了障碍… 这文章的确很有道理

Java显然比C更容易调试。调试C语言时,我基本靠悟。调试Java只需要看看出错的调用栈就行了。
在Java中估计有99.99999%的错误都是显然比C语言好找的,剩下的比C语言更难找的错误,基本出现在虚拟机身上。
所谓语言、架构不是用来解决所有问题的,而是将问题空间进行变换,让大部分最常出现的问题解决得很轻松,同时不得不让小部分问题很难解决。道理类似于哈夫曼编码。这就是软件工程,不懂计算机科学、软件工程的人,仅仅能当个语言喷子,比如@宏哥

用C的场景, 根本没有java的事.

就是,比如wps从2005开始就使用C重写的,整个工程从原来的的400多万行源码,几百兆的安装包,缩减到16M,而且无论性能还是可用性与开发周期都取得了明显的改进

啊 这么强
赵开锦
赵开锦

引用来自“宏哥”的评论

引用来自“灵剑子”的评论

引用来自“艾米”的评论

作者的意思是。C很高效,不仅是运行速度,而且是开发速度。 突然意识到,高级语言的抽象为编码提供了便利,却为调试和测试埋下了障碍… 这文章的确很有道理

Java显然比C更容易调试。调试C语言时,我基本靠悟。调试Java只需要看看出错的调用栈就行了。
在Java中估计有99.99999%的错误都是显然比C语言好找的,剩下的比C语言更难找的错误,基本出现在虚拟机身上。
所谓语言、架构不是用来解决所有问题的,而是将问题空间进行变换,让大部分最常出现的问题解决得很轻松,同时不得不让小部分问题很难解决。道理类似于哈夫曼编码。这就是软件工程,不懂计算机科学、软件工程的人,仅仅能当个语言喷子,比如@宏哥

用C的场景, 根本没有java的事.

就是,比如wps从2005开始就使用C重写的,整个工程从原来的的400多万行源码,几百兆的安装包,缩减到16M,而且无论性能还是可用性与开发周期都取得了明显的改进
赵开锦
赵开锦

引用来自“红尘一人”的评论

看需求啊,很难想象用c去写个大型网站

据说QQ的主站到现在还是用C写的
呢喃的猫咪
呢喃的猫咪
好吧,我是自备板凳过来看戏的。嘿嘿。
李小石
一看就是没有做过大系统的人
Windoze
Windoze

引用来自“daleshen128”的评论

引用来自“Windoze”的评论

引用来自“daleshen128”的评论

引用来自“jdwx”的评论

C能做的C++也能做。
不能因为C++有两个+号,就总受打击。

哦,那干脆用C++写操作系统算啦。

表说没有用C++写的操作系统,参见Haiku-OS和它的前身BeOS

是啊是啊 Haiku-OS搞了n年了,一直还处在alpha阶段

Windows内核里面也有一坨一坨的C++啊,你没看过当年泄漏的Windows2000源代码么?
Haiku的确进度慢,但是当年的BeOS可是一个完整的OS,早就production了。
禁衛軍
看了一些评论,不想继续看了。没必要争执。完全是不同类型的东西,专注的东西不一样,特长不一样。而本文的作者,也仅仅只是说到软件,底层的。但,并不一定我们需要的都是底层的。就这么简单。都是相对的。有得必有失,经过封装就变得 便捷 好用,同时也有可能会忽略了没考虑到的底层。不然,大多数人仍然是需要经过封装的东西,因为进步不站在前人的肩膀上,人类怎么进步。c适合做底层的,j适合做封装的“业务”逻辑复制的。
daleshen128
daleshen128

引用来自“Windoze”的评论

引用来自“daleshen128”的评论

引用来自“jdwx”的评论

C能做的C++也能做。
不能因为C++有两个+号,就总受打击。

哦,那干脆用C++写操作系统算啦。

表说没有用C++写的操作系统,参见Haiku-OS和它的前身BeOS

是啊是啊 Haiku-OS搞了n年了,一直还处在alpha阶段
返回顶部
顶部