[翻译]每个程序员都要学习C的十个理由
(做人要厚道,转载请指明出处!)
原文见:http://www.jubuu.com/ten-reasons-why-every-programmer-should-learn-c.html
每个程序员都应该在他的职业生涯中去学习C。好处很多,不能忽视。它不仅能带来更多的工作机会,而且还能教你更多关于计算机的东西。
1. 相对于其它编程语言(C++,Java),C是较为底层的。在更底层进行编程工作能让你进一步理解计算机,作为一个整体。
2. 设备驱动程序和操作系统都是专门用C写的。可能你从来没写过一个设备驱动程序,但是如果你需要去修改一个,该怎么办呢?
3. 如果你想找一个对单片机进行编程的工作,又怎么办呢?它们也是用C编程的。你还打算因为不想学一门新的编程语言而限制你的工作范围吗?
4. C语言程序比用其它编程语言写的程序更小更快。有时,你的程序需要速度的提升,而这通常只有C才做得到。
5. 如果你学过C,你可以学习任何现代的编程语言。背后的原因是大多数现代的编程语言都是基于C的(Java,C++,C#)。
6. 因为C已经存在很多年了,它拥有庞大的社区和集体的代码库。这就使得你可以快速有效地去实现新的算法或者函数——它们以前都被编写过。
7. C是开放源代码社区的语言。开源的宠儿Linux就是用C编写的。如果你懂得C,你就可以参与和奉献很多开源社区,比如Source Forge。
8. C是唯一一门教授你指针到底是什么东西的语言。C#和Java完全跳过了这一部分。而正是指针,才给予了C威力。
9. C仍然是编程工作所需的最通用的语言。值得你花时间去掌握它。
10. 任何带有微芯片的东西都支持C。从你的微波炉到手机,C驱动着这些技术。
推荐两首歌
最近发现若干首很好听的歌曲,在这里推荐两首,估计听过的人不多。
一首是Charlene Burris的《I HAVE NEVER BEEN TO ME》,歌曲中饱含幽怨,描述了一个女人的沧桑经历,是在劝告别人,但又似乎是在劝告自己。她说自己虽然到过所谓的快乐“天堂”,却从来没未找到过自我,希望别人不要再重蹈她的覆辙。里面独白的那段尤其好,摘录如下:
Hey
You know what paradise is
It’s a lie
A fantasy we create about people
And places as we’d like them to be
But you know what truth is
It’s that little baby you’re holding
And it’s that man you fought with this morning
The same one you’re going to make love with tonight
That’s truth
That’s love
另一首是三位帅妞唱的,叫《Nothing in the world》,不多说了,自己听听看就知道。
[翻译]C的影响力
(译者注:这是非常好的一篇短文,是我见过的论述C语言影响力最好的文章,特此翻译过来,和大家一起分享。同时也作为我写的书中第一章的一部分。 原文见:http://ripplingbrainwaves.blogspot.com/2007/07/c-reflections.html)
[做人要厚道,转载请指明出处!]
C在我的记忆中占据着重要的地位,因为它是我学过的真正通用而且具有专业扩展性的语言之一。我被一些人的想法吓到了,他们说希望学习计算机编程的诫条和技巧,但除了C的名气外却对它一无所知。
让那种想法变得吓人的原因是C持续增长的至关重要性。就像人类历史是当前文明和文化成型的看不见但又普遍的因素一样,C(尤其是用C/C++写的软件)是当前软件开发生态系统中看不见但又普遍的内在因素。给我一个操作系统,编译器,集成开发环境,Java虚拟机,设备驱动程序,我会给你指出C的影响力。
C的集中性和有效性直接来自于它的这种能力——不仅能那么紧密地映射到执行它的机器,而且能让程序员从极痛苦的实际硬件(寄存器,内存分段,字节序,操作码)的细节中抽象出来。实际上,C/C++编译器在弥补这个缺口上已经变得非常成熟了,一个不专业的程序员尝试自己去做这些甚至会降低优化的水平。我知道C的替代品已经出来了(通常和C差别并不大),但C自身的成功看起来已经把它固定为其生境中默认的选择了。
然而,用C/C++做实际的工作经常要当心机器结构和问题领域结构之间的平衡。考虑到“我需要密切地贴近机器工作”,因此选择C/C++;或者,考虑到“啊,把全部这些步骤都写出来太气人了”,因此逃离标准库或者众多其它的库中的一个,这都不需要花多长时间。我很惊讶,完善的内置字符串支持究竟缺乏到何种程度才导致某种用途的C的替代语言崛起。还有,缺乏成熟的内置数据结构,比如链表和映射,它们应该太广泛了,以至于不该提起。我陷入丢失堆栈跟踪,因为一些未捕捉的异常,甚至一些异常抛出。一些库或工具包为程序员提供了如此全面的函数和宏的封装,以至于感觉结果好像是一种方言(智能指针?向量?),这并不让人惊讶。
自然而然,折衷就是任何给定的程序中都不要使用这些外部的库或者语言特性,开销和复杂度也不是强制性的。而且,使用把程序员和机器联系起来的一种语言在某些方面是令人满意的。这种语言有大量的根据证明程序是为计算机,不是“理论的图灵机”,而写的:指针——只不过是有组织的一组变量单元的结构体,引用内存地址而不是对象的变量,以多种方式解释内存内容的能力,作弄内存的void*函数。它当然可能诡异,而且有时甚至很容易导致错误,但是“无用信息输入,无用信息输出”的原则始终适用。很多人在这方面比我更有经验,更熟练。
对我来说,C是象征性的编程语言,因为它巧妙地连接了人类思想和机器计算。那些能编写高效C代码的人也是能跨越两个领域的人。过分尝试让C代码更像人类思维,程序就可能会运行很糟糕。过分尝试为机器而裁减C代码,程序就可能变成难以扩展的,魔鬼般地神秘的一团。去学C/C++吧!人们喜欢说Lisp是如何激发灵感的。思想和机器在C代码中的混合可能会产生相似的灵感。至少,你可能会更加感激编译器/解释器实际上在为你做的工作。如果没有别的,只有读通C/C++的能力也是务实的,因为它仍然存活在企业和遗留的代码中。C/C++在开源世界中碰巧也是非常重要的,多亏了gcc这个东西,你可能听说过它(在我使用Gentoo的时候,gcc可能是CPU周期的最大消耗者)。
为什么void main是愚蠢的?
a) 最直接的回答:因为标准就是这么规定的。C99第5.1.2.2.1节“Program startup”
中明确规定好了的,不服不行。当然了,您要写不可移植的C就得另说了。
b) main函数的返回值用于说明程序的退出状态。如果返回 0,则代表程序正常退出;
返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。在Win下
你可能觉得这并不重要,但请想想Unix/Linux下面那些依靠程序“返回值”工作的
脚本和Makefile!
c) main函数被认为要返回int(main is supposed to return an int.)。调用main的
程序假设它会返回一个int,并且把它压栈。如果它没有返回,就有可能导致
程序崩溃!
d) 在Win上可行并不代表都可行,在所有i386上可行也不代表都可行。世界是丰富多彩
的,除了Window$和i386,还有很多系统和构架。这里有一个void main导致程序崩溃
的例子,是在ARM上的RISC OS中,见下:
http://users.aber.ac.uk/auj/voidmain.shtml
e) C++之父在其主页上这样评价void main:“这种定义从来没有在C++中出现过,也没在C中出现。” “一致的实现可能提供多种main的版本,但他们必须都是int返回类型。” “即使你的编译器接受void main,你也要避免它。”
所以,你不应该,更不能教别人,使用void main。如果你的老师上课时教给你写void main,你应该毫不犹豫地站起来告诉他/她:这样是不对的! 同理,任何讲C语言的书中带有void main的例子都是不严谨的!
为了忘却的河蟹
惊悉刘洋同学的博客被GFW掉了。我实在无话可说,我只觉得所住的并非河蟹社会。要说不河蟹吧,怎么也论不到刘洋兄啊?!他可是入D积极分子,博客除了记录个人生活就是一些计算机技术,怎么说也不能算是不河蟹吧。我已经出离愤怒了。
真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血。这是怎样的哀痛者和幸福者?然而造化又常常为ZF设计,以河蟹做掩盖,妄图GFW掉一切,wikipedia没了,blogspot没了,flickr没了……我不知道这样的河蟹何时是一个尽头!
爱翁说过这么一句话:
“国家是为人而设立的,而人不是为国家而生存。”
似乎是对河蟹最好的定义。哎,“要写下去,在中国的现在,还是没有写处的。年青时读向子期《思旧赋》,很怪他为什么只有寥寥的几行,刚开头却又煞了尾。然而,现在我懂得了。”
不是年青的为年老的写记念,而在这几年中,却使我目睹许多被GFW掉的网站,个个堆积起来,将我埋得不能呼吸,我只能用这样的笔墨,写几句文章,算是从GFW中挖一个小孔,自己延口残喘,这是怎样的世界呢。夜正长,路也正长,我不如忘却,不说的好罢。但我知道,即使不是我,将来总会有记起它们,再说它们的时候的。
——八月一日
华山之行(五)
上次说到开始下山。
下山的过程可用两个字来总结描述——崩溃。一开始虽然有点儿疲惫,但还信心十足,可是越下就越乏味,数不完的台阶啊,走得我见到台阶都想吐。下到百尺峡的时候,一看也不过如此嘛,比起云梯来这是小菜,相当轻松地就走下去了。后来就一直盼啊,使劲琢磨什么时候才能到头啊。于是就开始数旁边的休息点,上面都标明了是从下面数是第几家,我们从第19家一直盼到第8家。往后的就不看了,看了也是崩溃。
下面还有更崩溃的,就是那平路。下山走平路真是受罪,得使劲克制着自己的步伐,一不小心自己就得失控摔下去了。走到某处,貌似写着还有四分之一的平路就到头了,心想这下可有盼头了,可谁知后面那路那长啊,哪还有四分之一啊,明明就才走完四分之一啊。再度崩溃!
下山过程中遇到N个挑山工,其中一位老大爷还给我们搭话,说让我们也体会一下他的担子。我和傻乐轮流抗了一下,谁知那担子那个重啊,压得我直咬牙,起码不下100斤啊。他接着给我们说,他们一天也就能上一个来回,早上不到六点就上,到晚上才下得去,这么辛苦一次才21¥!天啊,挑那东西别说爬山了,更别提是华山,走几步对我来说都很困难,一次给我2100¥我都不干!严重深刻地体会到了挣钱是那么不容易!哎,相比之下我等这些一心只读圣贤书的人是何等幸福啊!
快走到山底时,我跟傻乐说,我们走这一路可把坐索道的70¥给省下来了!这70¥挣得可真不容易啊。不过再想想那些挑山工,我们还有什么可说的呢!
下来之后感觉腿像断了似的,鞋子也全湿透了,只想找个地方躺下休息。回到宿舍睡了12个 小时才缓过来。(这次拍的全部照片可以在这里看到:http://picasaweb.google.com/xiyou.wangcong/DHtDk)
(完)
华山之行(四)
上次说到我们要到长空栈道去。
其实在金锁关休整时,我们做了两个调整:一是把一开始买的一块钱的雨衣换成三块五的那种好点儿的(上山卖七块),二是决定去长空栈道,下山照样走下去,因为傻乐同学有点儿打退堂鼓,想坐索道直接下去。
从金锁关到长空栈道不算远,也比较好走,很快就到了。来到长空栈道才发现这里还有另外收钱,说是一定要加30¥的安全带。还以为是乱收费,后来发现,这地方要是没有安全带怎么可能过得去?!服务员给系好安全带,讲好安全带的正确使用,然后我们就开始下,又是我打头。
一开始下那段近乎垂直向下的地方时,我的腿都有些发抖,虽然还硬摆pose照了两三张照片。走到横向的悬崖边上的路时,心情稳定下来,小心翼翼地往前摸索,还时不时地望下面看一下,真是万丈深渊啊,然后就开始严重怀疑那几块木板的安全性,惊呼怎么还有这种路啊,而后赞扬这趟可真没白来,就是爬华山光来这里也值了!太刺激了!
后来也没咋的,就把长空栈道给走过去了。过去后就没啥东西了,就一个破思过崖,连传说中的那悬崖上的那三个字都看不清。准备原路返回时,又来一些过来的人,给他们让道,我们也好在后面拍照。回去就没那么害怕了,还摆了几个大胆的pose,顺便还怕了一下四周的美景:云雾在山间环绕,真像是到了仙境一般。
从长空栈道出来本来还想去鹞子翻身,但听说因为下雨它被封闭了,只好作罢。这也是此行遗憾之一。于是去了南峰顶——华山最高处。说实话,那里真没什么意思,也就是为了真正意义上到达山顶才去。因为时间原因,西峰去不成了,也就是说看不到沉香同学救母了。这样,我们就直接下山了。
(欲知后事如何,且看下回分解。)
(下面是本人第一次在博客露脸,没各位想象中帅,对不住了。;-) )
华山之行(三)
上次说到上山遇到下雨。
其实过了那个休息点之后雨还没小,只不过是断断续续,时大时小罢了。上山过程中最值得说的还是在百尺峡和千尺幢(<==这个字读chuang)那里,那坡度肯定接近80度了,头一次爬这么陡的山路。泰山上没有一处能何此处相比 ,不过,这里和后面的云梯比起来也算是小菜。
爬这些台阶时那可真是叫“爬” !我是双手拽着铁链爬,而后面的女同学干脆学爬行动物,手脚并用了。可能说到这里,您才体会到那双手套是多么有用了。总之,我们都是慎之又慎,一步一个脚印,好不容易爬上去了。到了北峰后,我们开始分散了,那位大哥他们直接住山上的旅店去了,那三位女同学在犹豫是不是要住一会儿再走,我和傻乐带的钱也不多,住不起那最便宜的还50多/人*时的房间,直接往前走了。又走到一个休息点,我们发现时间还很多,虽然我们知道就这天气我们早上肯定是看不到日出了,但我们还是决定长时间休息一会儿,到日出那个点再到东峰顶。找到一个可以坐的地方,开始大吃东西,然后趴桌子上小睡了一会儿,这个过程中最大的感觉是冷,时不时地还有阵阵凉风吹过,我穿上了带的毛衣还是有点儿冷。后来睡不着了干脆坐那里听iPod。
忍了好长时间又开始出发,这次走得快,基本是一口气走上去的。一直到云梯那里才停了停。云梯那里其实有两条道,一条是人工的铁梯,坡度也不弱,和百尺峡差不多,另一个条是在峭壁上开出来的真正的云梯,丝毫不夸张的说,近乎90度!而且台阶非常窄,仅容得下横放的半只脚!我自然是选择有挑战性的第二条路,爬上去再往下一看,非常有成就感!上去之后就是东峰顶,虽然都知道看不了日出了,但还是聚集了很多人。我们也拍了若干张相片,可惜光线很差,照出的效果也很不理想,实在拿不出来见人。从东峰下来时天基本上已经亮了,没看到日出心里也有点点不爽,下云梯时因为雨很大也选择了那条比较稳当的路。
我们下到金锁关,开始转向南峰前进,因为那里有我向往已久的长空栈道。
(欲知后事如何,且看下回分解。)