无意中在网上看到了06年的一些关于C语言还是否值得大部分的程序员去学习的争论。中间涉及到了大量的C语言与C++、C#的一些对比,
现整理出来, 方便大家查看。也是自己做个笔记。
为什么每个程序员都应该学习C语言?
每个程序员在他们的编程生涯中都应该学习C语言,因为它有太多难以忽视的好处了。除了它会给你提供更多的工作机会之外,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语言技术来推动的。
好了,说了这么多,大家应该感到我们应该学习C语言的必要性和迫切性了吧!那就赶快学吧!让它成为我们取得更大成功的阶梯!
相关文章:
[url=http://bbs.51cto.com/thread-145702-1-1.html][color=blue]每个程序员都应该学习C语言?我可不这么认为[/color][/url]
[url=http://bbs.51cto.com/thread-145586-1-1.html][color=blue]C语言已经死了,5个需要忘却它的理由[/color][/url]
作者简介
Jubling对于C语言和Linux操作系统都有很深的研究,在他的网站上发表了数篇关于C语言和Linux操作系统的文章,让我们受益匪浅。
每个程序员都应该学习C语言?我可不这么认为
每个程序员都应该学习C语言?我可不这么认为
7 a7 [2 ?; w6 }/ ]
今天,连微控制器这种东西都嵌入到了JAVA虚拟机中了。 2 y* ^% {3 B/ h# L! @ U
3 N6 Q5 Q8 n' m& i一个计算器参数,比如说JAVA虚拟机,数据库,操作系统是用C语言写的。这是事实,但是实际上有多少人在写这些东西?在所有程序员里面恐怕只占5-10%。
/ a5 W2 y5 H) T' s' y
/ ~% Y; \; a) U/ }噢,等等。忘了游戏。但游戏也大部分是由C++写的。尽管比较C和C++就像比较C#和C,有一些人还是会争论说那是用C写的。确实,“看”上去他们可能一样,但事实上他们的区别就像是大宇和法拉利的区别。
4 q! \- c" g- r ; K% [8 y! U" \
下面,我对那篇文章逐条列出我的反驳意见: 2 ?) Y" ~5 n7 N4 ~8 i( J
) F9 i! c1 R3 t8 N2 s4 x
1)相比较其他的编程语言(像C++,JAVA),C语言是个低级语言。从总体上来说,低级的编程语言可以让你更好的了解计算机。
' j! x3 q6 r$ ~' W: ]
% w& ~% f5 W4 z% [; M, {; L5 F确实在C语言中你不得不进行分配/释放内存的工作,但除了C语言有指针(C++也有指针)和C语言的字符串处理有点难看之外,C语言真的和其他高级语言没什么不同。
$ E: [9 p3 E' N i! M; T6 q& z9 Z
* s4 V0 K# o7 O- i3 _3 t' C% `2)设备驱动程序和操作系统只能用C语言来编写。现在,你可能还从来没有编写过一个设备驱动程序或者一个操作系统,但是如果你需要去修改他们的时候,怎么办? 3 I% ^, v: p) h! ~+ l' {: r
. B! Y" c ?# a& w9 D E1 x这完全是错误的。设备驱动程序现在已经用C++写了(C++离C比C++离C#还要远)。而操作系统(单一的)的内核,操作系统和设备驱动程序都是用C#写的。但我还是不得不承认确实有一部分是用C语言写的。
: R G- f# x; P' O 7 a+ J C# Y+ r, J6 c# I9 s5 Y1 q
3)如果你想要得到一份编写微控制器程序的工作的时候,该怎么办?他们都是用C语言编写的。就因为不想学习一门新的语言,你就准备限制你能得到工作的机会吗?
. A. {1 e5 @% A. f ; S. p+ R( j6 @7 D" }3 a" V
再说一次,很多很多微控制器是基于JAVA的,所以这个观点是站不住脚的。这个观点的另一部分更是毫无意义的。因为你懂C语言,并不代表你懂微处理器的每个方面。就像,我不知道怎么开飞机,那就限制了我可能得到工作的机会了吗?
$ S. f- f" i j' u % _# L7 L: C) k
4)C的程序比其他用别的语言写的程序,实现相同的功能,它用的代码行数更少,而它带来的运行效率却更快。有时候,你的程序所需要的速度,只有C语言能做到。 . v) e1 o; F" M }: k" |
0 v/ B' C3 X# f2 Y. L) H
这完全是谬论。一个程序的速度大部分情况下取决于那个写代码的人,而不是取决于算法。这个观点就像是说印地赛车能跑400千米/小时而一级方程式仅仅能跑360千米/小时一样。尽管那个印地赛车的速度比较快,如果那个开车人不能很好的驾驶它的话… , V E9 _4 H- o8 o4 T7 E
- _ a: Q* A a: {2 |5 p" \, Z5)如果你学习过C语言,你就能学习现在任何的高级编程语言。因为所有的高级语言都是以C语言为基础的(像JAVA,C++,C#等等)。
& K( l: j% L7 B7 W V u$ a ( M. V1 m- ]8 `; b' w
大部分的现代计算机语言的学习,早已不仅仅是语法了。.NET和Java都有大量的支持框架,你需要学习的绝不仅仅是那些看起来JAVA,C++,C#都有的的FOR循环。 + B \7 H+ t, p7 r' T2 b
- ]2 z4 M2 C' c/ A) z) T
6)因为C语言已经存在很多年了,它有广泛的使用团体并且有大量的现成代码可以利用。这就使你能在过去程序的基础上,快速和高效的编写新的算法和函数。
+ ^- x; s/ ^& \+ q7 j+ y( _ % h6 g, e, e6 v1 n, |
嗯…你听说过GOOGLE吗?我用C#,DELPHI和C++编程,已经不记得上一次我找不到一个具体编程问题的解决方法是什么时候了。
+ G+ o" L7 h6 C% @; V 1 |' N* B. Y' @, v4 B; [ C
7)C语言是一个开源组织的语言。一个开源组织的产物--LINUX,就是用C语言写的。如果你会C语言,你就能参加这个组织并且还能向众多的开源组织投稿,比如参加Source Forge并且给他们投稿。
3 ~& L2 @2 H% R9 S
# u, k( w# B3 e0 {6 F我简直不想谈论这个问题。有一个无可争辩的事实是,有同样多的Java、C#或Delphi的开源组织。 4 b9 `4 H8 n' q- u8 \
- B( m4 Y! N& T
8)C语言是唯一一个向你阐述指针的本质的语言。而C#和Java干脆跳过了指针这个题目。可是指针确实使C语言变得更加强大。
g* _# g5 n! h/ r; X( ^% j & J0 {; p+ d4 M1 D X
指针同样是C语言最大的麻烦。我宁愿让Gurus为我写一个编译器或者框架,那样我就不用担心那些最基本的细节了,好让我能够继续编写应用程序。
/ b3 l K& k) ^9 G0 j3 k" C ( L8 J X2 E6 s4 b3 k% F, i
9)找编程开发方面的工作时,C语言仍然是最普遍需要的语言。所以它值得你花时间去学会它。
3 w7 B1 a6 o* M$ d X5 J
C1 q# m* B# o: s这也是值得怀疑的。我估计在这个世界上写COBOL代码的人要更多一些。难道这就意味着我们都应该再去学习下COBOL语言? , d* x& a3 I* ?- R% k
; r- W6 W/ R, ? b- S' S4 B3 F
10)任何里面有微处理器的设备都支持C语言。从微波炉到手机, 都是由C语言技术来推动的。
# [7 B# v' H4 C- `: N. O3 V% n' W 6 y6 r+ B9 p$ q5 W; }1 B
是的,C语言可以用来写微波炉和手机的程序,但是经常是有其他选择的。如果我想写手机程序的话,我就能用VB来编。
/ E; G% Z" ]& { B ! a1 M: J5 B4 E V5 h" [ G- {+ o8 W
别误会我的意思。在适当的环境下使用C语言是非常合适的,我就有可能在80岁以后开始从头学习C语言。但是恕我直言,要是说“每个”程序员都应该学习C语言,那就有点夸张了。 + l& B# n/ [- n' z# [1 F1 H2 F
& U/ C8 O: A- h! v* @2 Q+ V7 E相关文章:
# E B/ a: U6 s' S! r. n" W 为什么每个程序员都应该学习C语言?
4 [( F+ n: H4 u, X C语言已经死了,5个需要忘却它的理由 + b! v' v/ \$ k9 _& y1 h' x
+ J" C1 N: P8 `8 V; c+ P % Z% D# }1 h9 i- c0 L7 M' I2 ?
作者简介
l/ D, ~# g: \: X$ B来自新西兰的James,涉猎非常广泛,对网站程序、C语言和微软的Visual Studio都有很深的研究。
C语言已经死了,5个需要忘却它的理由
5 M$ g: j% X3 \3 V当我读到一篇博客,题目是“为什么每个程序员都应该学习C语言?”( http://developer.51cto.com/art/200612/36504.htm)时,我真是鸡皮疙瘩满地。如果你真的是个专业的程序员的话,你肯定觉得这是个天大的笑话,尽管作者的本意也许不是这样的。这篇反驳的文章:“每个程序员都应该学习C语言?我可不这么认为”( http://developer.51cto.com/art/200612/36505.htm)有点意思,但是还是没有抓住本质。所以我展开了说一下。有以下5个原因来说明,为什么那些会C语言,并且使用C语言的程序员,现在不但应该去用别的语言,而且应该忘记他们学习C语言过程中的那些烦人的东西。
% _: K& s5 x3 `0 d9 t
' R3 @( a# i' l! ?8 |1 G. p* ?1、内存分配
2 k; \& G5 B, o* h
# ?) g, s( u4 g* r( a6 K+ \仅仅关于这一点我就能写整整一篇文章了,也许能写一本书,甚至还有可能写出能够塞满图书馆技术书籍那块,那么多的内容。内存分配和存储单元分配的存在确确实实是个大麻烦。你要不就是分配太少的内存不够用,要不就是分配了太多内存浪费掉。这里的问题就是:怎么把它初始化为零呢?还是干脆就不初始化它。但最挠头的步骤还是释放内存。所有已有的工具包都会帮助你确认,你是否已经释放了之前分配的每一位的内存,在释放完之后是否永远不使用它,并且会阻止你,永远不要释放它第两次。更严重的是,分配内存和释放内存在C语言中都是很慢的,非常慢。使用内存分配时,要考虑的各种特殊情况,我真是连想都不愿意去想,只要问题(对象)的大小合适,我更愿意使用栈空间或者事先分配的结构空间。如果这么做的话,我就有更值得烦恼的事了。话说回来,发明垃圾处理器那人真应该得诺贝尔奖。 + }, V3 _+ N* m& c
6 E7 Z$ P6 @& U5 j( d5 d
2、多线程
3 y Y8 Q- w7 f1 A( ^3 `8 R$ S
, |/ ^5 h/ o: L我过去是喜欢C语言的,真的。直到我开始用C开发并维护多线程的服务器。在为连接相冲突的线程保护数据方面,C语言没有为程序员提供那怕一点点的帮助。你在使用单线程的日子里获得的每一个直觉、经验,用在多线程的时候都是错误的。至少JAVA有表示同步的关键字和备有证明文件(但是是个很奇怪的文件)的记忆体,但即使是这样,除非你使用新的javax.concurrent,否则也只能在那些巨大的平行摆放的机器们面前崩溃。回到C语言上:在模拟生产的环境下,坚持一个星期在数据中心调试一个死锁(这事真的发生过)。而JAVA却只需要Ctrl+Break!天哪!!! : w" @& K# A1 I3 [* t+ i5 k! j/ L
7 ^) p+ p: a0 H7 h
3、指针
% ?4 f' F& Y" U 9 s# ?" x* n# g) ~2 v7 K. Z3 g) ?6 O
指针太难以控制了,太阴险了;我甚至没有委婉一点的方式去形容它。我生命中每年都有几个月被用来调试那些奇怪的指针问题。我过去常常努力获取所有的诀窍,比方说难以理解的构成符、联合体和偏移量,以及重用最后两位做标记,还有所有其他的诀窍。但我发现这么做根本不值得。其他语言的静态引用就可以解决了。 0 v- l8 N8 Z8 C" w! ] L1 Z# F
+ R6 A( S6 E h) x, Q* i6 K
4、过早的优化
5 N. q2 n# j+ i z0 t' o 2 f' [5 ?/ n7 }. ]# f
说到诀窍,你是否曾经浪费脑细胞去研究究竟*p++是不是比p[ i ]快?你是否曾经花时间去试着做点变化来代替乘法,或者去尝试使循环中的倒置运行更快的方法?还在为传递一个参数的速度和反对添加结构,并且传递它的速度一样而苦恼不已?停吧!算法是速度的关键,程序员的水平决定了他会使用那些算法。知道这一点能让你的程序更好,更快一点并且让你的脑袋少扭几个筋。好吧,有一些例子也许可以这样做的……不,你就别那么做就行了! $ g+ s2 O$ _9 O
- Y4 g5 T/ E# ~
5、测试
# c% {) `! }7 v9 ?! M + i, c! n% h9 \$ a$ U
你最喜欢的C的单元测试的工具是哪个?嗯…一个也想不到?单元测试一定是一点也不重要,是吧?或者是太麻烦了,很难跟上进度,浪费时间。你可以把这个时间用到更加有用的事情上,让它只占用工作时间的1%,那还比较合适。或者在数据中心,通过优化的没有标记的图形来调试这个仅仅由100个同时在线使用者引起的问题。
8 L( \6 i4 C) |7 u. ^. W
) A2 q6 l1 o, Q0 g" G我本来应该继续再说一些原因的,但是5个现在就足够了;说完这些,现在感觉好点了。C以前是非常棒的…那是在1984年的时候。直到今天,那些用C写的新代码都让我感到惊喜…如果你让我比较的话,我觉得C++只是比C稍微好点。如果你想要学些老一点的语言,不妨尝试Forth,Lis,或者APL。这些老式的语言起码能教会你,用不同的而且优雅的方式去思考你的程序。
0 I) z" @% m. e8 [2 |; c! }+ N7 S# ?
; T- l! I1 x/ E作者简介
5 h+ t i; d8 M. ]0 z) X& e0 R " ^( [& Q: Z+ d3 g- Z" ?7 P: b
Ed Burnette是一位有着丰富编程经验的程序员。他现在致力于使用JAVA和C来开发OLAP客户端和服务器。他业余时间喜欢研究Java、Eclipse和开源软件。他写了很多关于Eclipse的文章和书籍,另外他还是EclipseZone.com的主编。
TOP |
* m+ j7 e; k9 h+ L6 c但不是必修课
5 h, r5 i, `* c, g7 s不过,谁也不能否认C功能的强大
2 D8 k" O- C* X- x3 K# R) T) OC是难学,但是学了JAVA和VB能对内存操作吗??能开发现系统底层的东东吗??
2 `$ ]' _" B$ g/ E( _4 k- N8 G8 P
0 b" K! c+ X5 F5 [* ~4 ]3 x* P! | G! V6 Q我还是那句话,编程是以算法为基础的,不必拘束于某种语言工具 . J3 j/ T. U; P! @
8 @3 z9 E6 Q& I( m* J
如果学习网络编程,那么C和C++是很好的选择 : a, @ M) B+ l/ C, M4 E
如果学习数据库开发,那么PB和VB也是很好的选择
6 M( P F, }; a1 |4 ^如果学B/S开发那就选择C#或JAVA - \! @0 }5 R0 n+ A) i
; t. {9 w! H( L( Z& I+ q( F7 Z
LZ的讨论没意义
4 m+ a3 B/ Z8 j; g) o( h无非是打口水仗而已
计算机编程思想基本来说是一致的,不过是各有不同表达并各自附加了一些高级的功能。通一门语言,再学其他语言不过是翻翻手册,再掌握一下新特性而已。没必要搞得忽悠忽悠的。
# o# ~) a8 C$ ?9 @# q) |' U但是做为一个好的程序员不可以不学C语言, 6 d; o( k; ~* C/ a U
现在的开发工具其编译器或者解释器,80%以上的代码是用C语言写的, 0 A- _# S" y0 J# a
学习C语言可以帮助我们更好的了解所使用开发工具的工作方式,
- U7 w" p7 K% _' ~0 l" S从而编写出高效的程序来. ! R6 D; W) j( R, O" C$ i
说的高效的程序必须要做的事情就是程序的优化,
, B' g( L* I( Z! B' m+ \而程序的优化除了在数据结构上实现外, 5 q. a4 t- w8 w
另一个不可忽视就是指令优化,
# m; Q9 |$ U: K) z9 S要做到指令优化如果不了解C语言甚至于汇编语言,那将是不可能的事情.
C语言,落日下的挽歌
- 1665 年,胡克出版了《显微术》,影响了地质科学至少 30 年,尤其是在化石观测方面;
- 1887 年,赫兹证实了电磁波的存在;1894 年,Guglielmo Marconi 有幸读到了赫兹的论文,并开始做无线电实验,1901 年,无线电波穿越了大西洋,掀起了无线通信技术的革命;
- 1905 年 9 月 27 日,爱因斯坦发表了质能方程;1945 年 7 月 16 日,第一颗原子弹爆炸;
- ……
- 如果没有发现细胞、没有化石观测,显微术能否这么著名,还不一定;
- 如果没有 Guglielmo Marconi,赫兹“看到”电磁波的意义,也许仅仅是个被记载在物理教科书中的经典实验;
- 如果没有原子弹的爆炸,质能方程能否象今天这样家喻户晓还是个问题……
如果没有C语言,世界将会怎样?有感于“C语言已死”2007-01-23 10:19 Terony Csdn博客 我要评论(0) 字号:T | T
C语言到底有没有“死掉”呢?语言之争何时可以真正的“寿终正寝”呢?本文作者假设了如果没有C语言将会发生那些情况,提出自己的观点:不要过分去追求语言的不到之处,或动辄就将其“消亡”,努力改正我们自己的错误视角,不断进步,提高自己才是硬道理。
AD:
昨天看到一篇以“ C语言已经死了,5个需要忘却它的理由(点击查看原文)”为标题的文章。作者列举了五大理由具体说明了C 语言已经“死掉”的现状。
C 语言到底有没有“死掉”呢?语言之争何时可以真正的“寿终正寝”呢?
一种计算机语言的诞生必有其单纯的目的。作为一个程序员应该明白最好的不一定是最适合自己的,最适合自己的才是最好的。如果你做桌面应用开发,Basic 语言可以帮你很大的忙,除此之外你有很多的选择。如果你在开发嵌入式软件,那么就没有这么幸运了,除了 C 和汇编语言,你几乎没有什么选择的余地。
C 语言和汇编语言一起构筑了许多 PC 操作系统、嵌入式系统、应用平台的“地基”。由于它们的底层性,大多数用户包括部分程序员都不可能经常接触到它们。在 Windows 平台上书写程序就会与 Windows API 打交道,其对外的所有接口都是 C 、C++ 形式;在所有你能够知道的操作系统上,也许没有一款 Java 虚拟机,但一定有一款 C、C++ 编译器;在国际上,C、C++ 语言是描述 ISO 众多协议的标准语言。那么如果 C 语言真的“死亡”,会有什么影响呢?
如果没有C语言:
我们将等待下一种可以用来与汇编语言匹配书写操作系统底层的语言,而在此之前,我们是不可能使用 PC 了;
我们的电冰箱和洗衣机不能使用了,没想到吧!但这是事实,因为 C 语言在嵌入式开发中担当着非常重要的角色;
微软、Sun、IBM 的多数软件系统可能不会再升级了,因为构筑它们的底层协议和标准消失了;
C 语言诞生在一个特定的环境和年代,有着强大的功能,在可以预见的未来,它的角色是无可替代的。C++ 语言曾一直以替代 C 语言为自己的重要历史使命之一,但历经多年之后,C++ 之父公开承认这一点已不能完成了。仅在嵌入式设备领域内,由于使用 C++ 语言的某些功能需要较大的运行时开销,所以迄今为止 C++ 语言依然不能占据到嵌入式程序开发中 50% 以上的份额。
过分的追捧亦或贬低某种语言都是不对的,它们各自有着存在着的理由,有着各自适应的领域。只有 C 、C++ 语言的开发世界是不完美的,在它们不适合的领域,其它语言已经成功的介入。而且,一种语言是否适合存在、何时“死亡”是由很多因素决定的,并不可能因一个人、一个公司来决定“废立”的。也有某些语言虽然有着自己的国际标准,但实际的标准确掌握在某个公司的手里,亦同样为大众所接受。
不要过分去追求语言的不到之处,或动辄就将其“消亡”,努力改正我们自己的错误视角,不断进步,提高自己才是硬道理。
来源链接:http://tb.blog.csdn.net/TrackBack.aspx?PostId=1477125
相
您所在的位置:开发 > 语言&工具 > Java替代C语言的可能性
Java替代C语言的可能性
不少人在讨论Java做为C语言替代者而成为最主流的基础软件编程语言的可能性。从大部分人发表的观点来看,对于Java替代C的趋势还是支持的。Java是否真的能够在基础软件领域强有力地替代C语言呢?作者认为至少短期内还做不到,接着列出了他的原因。
AD:
前不久看到一篇《C语言已经死了,5个需要忘却它的理由(点击查看原文)》的文章,引起了一些争论。其实那篇文章是从Ed Burnette的博客上转载来的,原文题目是“Die, C, die!”,直译过来应该是《去死吧,C!》,表达的是一种诅咒,而不是判断。翻译称《C语言已经死了》,显然是一种煽风点火的误读。CSDN网友对于其观点已经进行了批判,不过坦率地说,由于这些批判基于一个扭曲的翻译文本,所以不但没有什么新鲜的地方,而且也没有抓住原作者的重点。
实际情况是这样的,最近一段时间,在国外的技术社群里刮起了一股风,不少人在讨论Java做为C语言替代者而成为最主流的基础软件编程语言的可能性。从大部分人发表的观点来看,对于Java替代C的趋势还是支持的。
基础软件是指这样一类软件,其主要任务是把计算机的潜能充分发挥出来,面向上层应用软件提供一个高效、可靠的功能集。这些软件会被密集地调用,性能上的一点点滞后都会在实践中被成百上千倍的放大。所以对于基础软件来说,性能至少与可靠性一样重要。我们在一些基础软件的源代码里,常常看到一些丑陋的设计,看到一些变态的黑客技巧,在其他的领域里,这是不被鼓励的,但是在基础软件中,这就是合理的,可以接受的。
C语言目前仍在一些领域里坚挺,在操作系统、虚拟机和设备驱动程序开发方面,它可能是永远的王者。但是在其他的基础软件领域,比如数据库、网络服务器、图形图像处理等,C语言继续占据霸主地位的原因其实只有两个,一是快,二是熟悉的人多,而且经验丰富。
但是这两点现在都遭到了挑战。
首先是速度。Java的执行速度在JDK1.4的时候达到了这样一个水平,就是对于一个一般水平的开发者来说,他写的C++程序已经不再比对等的Java程序跑得更快了。随后的JDK 5.0和6.0进一步提高了执行性能,由不同的组织举行的多项评测结果表明,Java与C语言的整体执行效率差距在一倍以内,也就是说,素以速度著称、并且为了速度放弃了很多东西的C语言,现在比装备齐全的Java只快不到一倍了。这还不算,如果考虑到新的计算环境,C语言的速度优势有可能仅仅是一个错觉。因为,世界上只有很少的人有能力在多CPU计算平台上用C语言写出又快又正确的大程序,在这些人中间,又只有很少很少的人有能力用C语言写出一个在大型的、异构的网络环境下能够充分发挥各节点计算能力的大规模并行程序。也就是说,你也许有能力把程序效能提高一倍,从而充分发挥一台价值6000元人民币的PC的计算潜力,为客户节省1000元钱。但如果是在一个由1000台机器组成的大型异构网络并行计算的环境下,你写的C程序恐怕性能还会远远低于对应的Java程序,更不要说巨大的后期维护成本,而由此带来的损失可能是1000万或者更多。
其次是经验。很多人都宣称自己的C功力如何如何了得,但是实际上,即使是真正的C高手也不得不花相当可观的时间来寻找并且调试错误,尤其是内存方面的错误。大部分用C写的上规模的软件都存在一些内存方面的错误,需要花费大量的精力和时间把产品稳定下来。这还没有把安全方面的缺陷考虑在内,现在大部分的开发者在代码安全方面的知识都很薄弱,安全漏洞在代码中相当普遍,而在C语言中,这一不足暴露得格外明显。最大的挑战或许得说是并发问题了,并发是一个很复杂的问题,需要在相当高的抽象层面上解决,而C语言的抽象机制过于简单,提供不了高层的抽象,因此在开发者只能从一些“并发原语”出发去构造并发程序,这跟用铅笔刀锯大树没什么分别,直截了当地说,大部分C程序员根本没有能力编写高效无缺陷的并发程序。
所以残酷的事实是,当一个人说自己的C语言如何了得,经验如何丰富时,非常可能他说的是,自己在用C语言写单机、单线程的,不会遭到外界攻击的,在时间预算上没有什么压力,而且用户能够忍受一个很长的产品稳定期的应用程序方面非常有经验。遗憾的是,市场环境和计算环境已经完全变化。面对更复杂的计算环境,用C语言来编写高质量的大规模软件,是只有真正的专家团队才能完成的工作。如果你曾经有过连续数日苦苦追踪和调试一个内存泄露、或者线程错误的经历,你就会明白,你可能不是这样的专家。
相比之下,Java在抽象机制、基础设施、安全和并发方面,与C语言比起来,就好像是马克沁重机枪对弓箭。比如并发,Java 5.0加入的java.util.concurrent包,可能是目前主流语言中对于并发问题最强有力的支持库。Java的内存管理和安全机制,也已经被实践证明确实能够有效地减少程序的缺陷。这也就是那篇诅咒文章的原文的意图。
所以,我的态度明确的,我认为Java替代C是一个进步的想法,不过世界上进步的想法很多,能够美梦成真的却寥寥无几。Java是否真的能够在基础软件领域强有力地替代C语言呢?我看至少短期内还做不到,原因如下:
1. 人的问题。能够用C语言写出优秀基础软件的人固然不多,能用Java写出来的人恐怕更少。Java有好几百万开发者,但是他们在干什么?大部分是去搞企业级开发、Web开发了,有多少人真的理解Java的内存模型?有多少人能够熟练使用concurrent包中提供的那些工具?很多使用Java多年的人没有写过socket程序,不了解Java多线程的开销,不清楚如何进行性能诊断和调优,而这些在写基础软件的时候是必备的技能。大部分Java程序员在刚刚学会Java之后就转向Web开发,把主要精力花费在掌握一个又一个大型的、复杂的、具有厚厚的抽象层和华丽结构的frameworks上,不但对真实计算机体系结构不清楚,对于Java虚拟出来的那个计算环境也不清楚。因此,要把Java社群编程转变成能够担负起下一代基础软件开发工作的尖兵,不但难度很大,而且必须花费足够的时间。
2. Java的内存消耗太大。对于系统级程序来说,内存消耗大,就意味着cache命中率降低,与磁盘交换数据的可能性增大,对性能的影响还是比较严重的。现在很多人还是觉得Java慢,主要的原因已经不是Java跑得慢,而是由于内存消耗过大导致的综合性能下降。这个问题不解决,Java就只能用来做一些比较上层的基础软件。也许随着计算机硬件的发展,这个问题会逐步得到解决?
3. 风格的问题。这个问题我认为是最严重的。基础软件开发崇尚的是自由、直接、透明、简单、高效,要像匕首一样锋利,像战士一样勇猛,像农夫一样朴实,反对繁琐华丽的设计,反对架床迭屋的层层抽象,反对复杂的结构和不必要的灵活性。而Java社群多年来形成的设计风格与此格格不入,甚至可以说是对立的。Java在意识形态上是要面向企业应用软件的开发,所以特别强调架构,强调设计模式,强调标准,强调规规矩矩,强调高姿态,强调一种华贵的宫廷气质。在C中,你吃饭就是吃饭,捧起碗来喝酒,放下筷子骂娘,甩开膀子抓肉,撸起袖子抹油。而在Java中,你经常为了要干某件事,先new一个对象,然后以这个对象为参数new另一个对象,如此这般重复n遍,得到真正需要的对象,最后就是为了调用那个对象的一个方法,就好比吃饭时焚香洗面,漱口净手,战战兢兢,毕恭毕敬。在C中,遇到问题要像亡命徒,像流氓版程咬金,管你三七二十一,冲上去就是三板斧,还怕劈不死你丫的。在Java里,遇到问题要像宋襄公,要张榜檄文,要名正言顺,要礼仪之邦,要把架子拉开了,把谱儿摆足了。Java的口号是,不管劈不劈的死,先把你小子感动了再说。 这套繁琐的东西,对于基础软件开发来说,既不必要,也很难习惯。需要说明的是,这不是Java语言的问题,其实Java本身不必如此复杂、如此巴洛克。从语言本身来看,Java也可以是轻快直接的,也可是酣畅淋漓的。只不过十多年来几乎没有人这样用过,所以大家已经不知道:如果不来个一步三叩首,那么该怎么用Java写程序?
正是因为上面的这种种原因(可能还不全面),直到最近,第一流的基础软件几乎都还是C语言编写的,或者至少其核心部分还是以C为主。而且我认为,在短期内,这种局面不会有大的改变。当然,如果Java社群能够克服上面的这些问题,充分发挥出Java本身的优势,在基础领域开发出一大批一流的支撑软件,那么局面是可以改变的,而且这种改变也是进步的,值得欢迎的。
来源链接:http://tb.blog.csdn.net/TrackBack.aspx?PostId=1482614
51CTO.COM独家特稿:为什么每个程序员都应该学习C语言?
51CTO.COM独家特稿:每个程序员都应该学习C语言?我可不这么认为
51CTO.COM独家特稿:C语言已经死了,5个需要忘却它的理由
如果没有C语言,世界将会怎样?——有感于“C语言已死”
我--曾经的C语言痴迷者,就算C死了,也永远活在我心里
更多网友讨论内容,请进入专题:“C语言是否该扔进垃圾桶”专题
(责任编辑 火凤凰 sunsj@51cto.com TEL:(010)68476636-8007)
网友评论TOP5
查看所有评论(4)-
51CTO网友04-13 13:13然后..c 又超过了.java..成为了第一
-
popotans12-14 16:08三年多过去了,你睁大你的狗眼看看 替代了吗?
-
51CTO网友08-24 19:17楼上的多虑了,一种规范只是为了适用某一类应用,各有所长而已
-
51CTO网友06-06 13:27别忘了java本身也是用C/C++写出来的,这些讨论似乎很滑稽
栏目热门
更多>>开发
频道导航- Java
- WEB开发
- 综合