C语言高效得简直不合理

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

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

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

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

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

简单直观

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颠覆了我们对低级语言的认识。这真了不起。

简单的代码,精致的类型

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

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

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

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

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

速度之王

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

-强大的编译器

-k&p风格

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

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

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

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

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

乐观是程序员的职业病,返工是他们的唯一药方 -Kent Beck

因为“编写-运行-调试”周期更多的是一种开发工具的使用原则而并不是一个语言的核心,所以他经常被忽略。虽然如此,怎么宣扬这个循环对于开发速度的攻击都不为过。悲催的是,这一循环已经被很多变成语言遗忘了,他们反而去追求使用中的代码的可读性。所以,事实是,c仍然是最快的语言。

调试以及核心转储

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

Error, no keyboard -- press F1 to continue.

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

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

从任何地方调用

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

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

- J. Palme

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

是的!它有瑕疵

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

"When all else fails, read the instructions." 当其他办法都失效时,请查看说明! - L. Lasellio

它的瑕疵是非常非常有名的,这是一种优点。所有的语言和实现有陷阱和难题。C只是更坦率的告诉它。还有大量的静态和运行时工具来帮你处理最常见的和危险的错误。世界上很多使用最广泛和可靠的软件是用C打造,这就是缺陷被夸大了的证据,这些瑕疵容易检测和修复。

为了编写couchbase,我们团队大概花了2 + 人/月解决Erlang虚拟机的问题。我们在Erlang的编译器上花费了大量的时间和精力,却仍然不确定到底发生了什么,而结论是或许是我们的插件的c 语言代码出了什么问题。我们想找出问题,然而却找不到。最终我们确定这是Erlang的核心里面有一个条件矛盾错误。这是我们唯一的成果。而太多的语言抽象掉了太多的东西,这无疑增加了类似我们遇到的困难。

最初,出于性能原因,我们决定用c重写couchbase的代码,并且决定couchbase的几个新的特性也用c来写。令人惊异的是,显然事实证明,c 语言提供了对于程序的良好控制能力,而我们因此更容易快速找出程序的问题并进行调试。长远来看,c语言显然具有良好的生产效率。

我总是告诫自己,我需要一个更加高效的可以替代c语言的东西。它只要可以修正程序里面那写毛糙的细节然后解决问题就可以了。但是从事实来看,不论是从语法、从语义、从工具或者从“自顶至底”的开发方法来看,没有什么可以值得我们为止付出努力。到现在为止,c语言毫无疑问的是最高效的语言,我认为短期内这不会有任何改变。

你可以在twitter上“推”我一下,然后就可以了解我对编程的一些看法以及couchbase的开发进度了~

 

原文链接:http://www.oschina.net/translate/the_unreasonable_effectiveness_of_c

责任编辑:张伟 来源: oschina
相关推荐

2011-05-10 10:38:54

布线光纤

2011-04-06 16:40:27

C++构造函数

2011-04-06 12:29:42

2010-04-28 09:50:14

Oracle数据库

2011-08-17 12:25:11

2020-09-15 09:55:30

类比Python开发

2012-12-10 09:57:00

路由器交换机

2011-03-22 14:59:36

2017-01-12 14:26:30

2024-02-27 18:49:08

人工智能ChatGPT

2023-10-31 09:29:03

Java配置

2023-12-07 12:26:08

Java开发

2019-08-01 11:31:32

2024-01-08 08:30:30

接口线程模型

2022-01-28 14:54:21

staticC语言编译器

2017-10-10 15:45:51

OOP开发JavaScript

2017-10-09 14:16:35

数据中心运维管理绿色数据中心

2012-02-16 08:19:03

2015-11-18 16:56:15

2023-11-16 17:12:33

数据库oracle
点赞
收藏

51CTO技术栈公众号