正确认识C语言在当代的地位和作用

来源:互联网 发布:mac隐藏dock快捷键 编辑:程序博客网 时间:2024/04/29 23:25

无意中在网上看到了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语言?我可不这么认为

有人说,“每个”程序员都应该学习C语言,这太滑稽了。在2006年,我甚至想不到那怕一个让“每一个”程序员都学习C语言的原因。事实上,我能想到的需要用到C语言的地方,仅仅是在编写设备驱动程序的时候。我认识大约200个程序员。其中有多少个是编写驱动程序的呢?一个都没有!# [4 @) A( H1 |! T
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' O7 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% @; V1 |' 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' W6 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, XC语言已经死了,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个需要忘却它的理由

我用C语言编程已经超过20年了。我写过C语言的编译器、C语言的调试器、用C开发的其他语言、游戏、客户端程序和服务器程序,你说吧!还有什么是我没写过的。还有我的书架上充斥着折了角的K&R和Steele的书。我太了解C语言了,但是,我讨厌他。十分讨厌!: {6 O% ]+ O7 v* i2 ]( t

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" U9 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' o2 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的主编。
不是丢弃,而是放下“圣经”的架子。C已经不是必修的了。7 t7 z0 U- S# o

3 u- [1 x2 ?" s+ C! F如果要学习算法,严谨的PASCAL或许更适合;如果要做企业应用,JAVA在保留了强大功能的同时,比C语言更简单(最典型的,莫过于不需要了解指针以及内存自动回收);如果要研究底层细节,没有比汇编更直接的了;如果要论绝对的性能……C 比汇编更快吗?: |- ?9 ^5 O3 g
4 ~% P, D! `, r/ }1 e" b( `
1、在高中时,学了 BASIC、LOGO 和数据结构,感觉自己“会编程”了;偶尔也玩一下汇编,但在 6502 CPU上,可玩的并不多;
. [: w* z% i3 w: I1 L2、大一时学了 PASCAL(高中时只有中华学习机,无法运行PASCAL),觉得自己又长见识了,尤其是算法,原来用 BASIC 实现起来很麻烦的(例如河内塔),用 PASCAL 竟然这么简单……- Z8 C  r& q5 W" e% q( y
3、后来学了DOS和汇编,才真正了解计算机系统的运作原理,知道了病毒为什么能横行、操作系统能干什么;
+ R& a6 \1 U- L" E4、大三时学习C语言,感觉仅仅是多了一门语言而已,除了调用API接口方便一些外,也没啥大不了的(在BASIC中照样可以调用系统中断);指针、堆栈等概念,在 PASCAL 和汇编中,都已经是老朋友了;
. X! I9 m% r* ~; c) J) k- i5、1996 年以后,做网站应用,用 C 写 CGI 程序,觉得很麻烦,后来改用 DELPHI 写,方便了一些;
2 x5 ~1 n5 q1 T6、1997 年做 MIS 系统,先用 FOXBASE、FOXPRO,后用 DELPHI,也没 C 语言什么事;
! z8 [+ r  n% J3 t& ?. ^7、2000 年起,做电信行业的 OSS 软件,主要用 JAVA,还是没 C 语言什么事;
3 C" N7 W; s% V8、……
! B3 p( j- R& u) ]# ]+ W
2 l0 Y, S0 i- Z. w不可否认,C 语言有自己的应用场合。在某些情况下,C 甚至是唯一的选择。但在许多应用中,C 没有市场也是很明显的。程序员同行们,一定不要有“不会C就不是高手”的想法,放下架子,把更多的时间花在“更向上”或“更向下”上。什么是“向上”?了解用户的需求,知道你的软件的价值所在,然后设计出合理的系统结构,这是向上;了解计算机底层硬件原理,了解电路设计及驱动方式,了解操作系统的原理等,这是向下。. b1 T& c' ~" j

' W: Q6 U8 R, w3 t% s7 R+ o关于“高手”,我的一个观点是:能把有用的事情做到位的,就是高手。这里面有两个关键因素:
& B/ b0 q0 e* X+ q+ K+ N6 O(1)一是有用。慕容复惊才绝艳,可是老百姓不需要大燕国,他再厉害也没价值;8 |- l) W5 m8 Q, z# r1 L! A0 G
(2)二是做到位。别小看这个做到位,我敢打赌,90%自以为很牛的程序员都做不到这一点。前几年有个游戏叫“北京浮生记”,深受北漂欢迎。作者就曾说过,要做没有BUG的软件。虽然“没有BUG”有点绝对,但这个意识,无疑是非常可敬的。不妨检查一下自已的程序,尤其是牛人,看看吧,乱七八糟的注释,语法不通、错别字连篇的的说明文档,有可能需要花几个小时才能运行起来的例程,到处乱抛出的异常或根本不抛出异常……你还有什么资格说牛?如果哪天你真的发明了质能方程,再回来说自己牛也不迟。(其实质能方程等,也是由很严谨的人创造出来的)# c! E. j+ O  t3 j6 S8 R

, ?: z7 y3 d8 C4 l5 R4 F4 r1 V周鸿伟在谈程序员创业问题时说过,越是牛的程序员,越不容易成功。因为越牛越自负,越不善于合作。6 E* {0 w$ V7 @1 D  q3 ~
) [3 Z. _# f% |5 M/ k$ `6 M% N8 d8 b
在我的博客中,有几篇文章可供参考:- ?% C0 `/ f3 j5 D! m# l
C语言:落日下的挽歌:http://wakan.blog.51cto.com/blog/59583/134378 l$ C/ I2 c3 `% F; c
剑法三套,程序员也能挣大钱:http://wakan.blog.51cto.com/blog/59583/dir/175 X) L" m( e! r3 o9 A" C$ j
8 i& V# b8 M' J' O" D& i
[ 本帖最后由 豪客 于 2006-12-27 11:29 编辑 ]
QQ
UID
59583 
阅读权限
20 
性别
男 

查看个人网站

论坛详细资料

TOP

在目前看来 C是基础,很多语法都有C的身影,如JAVA,C#等,
* 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无非是打口水仗而已

如果你是做unix系统的,忘掉C/C++简直是天方夜谭。如若不是倒也关系不大。  F- t2 ~) ]7 U9 ~" e" y5 N
计算机编程思想基本来说是一致的,不过是各有不同表达并各自附加了一些高级的功能。通一门语言,再学其他语言不过是翻翻手册,再掌握一下新特性而已。没必要搞得忽悠忽悠的。
做为一个程序员可以不学C语言,
# 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语言,落日下的挽歌

这几天,关于要不要学 C 语言这个问题,挺热闹的。一开始时觉得挺无聊的,就没有凑份子。但现在看了大家的文章,也想说几句了。不过我的重点,不在技术上,前面几位朋友的文章,已经说了很多了。我想从发展的角度来谈谈。
 
    1、什么是程序员——能捉老鼠的猫就是好猫
 
    正确的人,做正确的事,是成功的关键。既然说到“程序员与 C 语言”,那就不能不定义一下“程序员”的含义。
    头悬梁,锥刺股,苦练严冬与酷暑,最终艺成下山,凭语言利剑,携算法威风,闯出一片江湖……这是传统意义上的程序员。汇编、C 语言、数据结构,一个都不能少。在 1990 年之前,这几乎是天经地义的法则。不会这些,你就找不到工作,换句话说,那时的电脑,基本上也只能跑这些东东。
    到 2000 左右,大量会 VB、DELPHI 的编程从业者(暂且叫这个吧)走上了岗位。尽管你可以鄙视他们,“基础不好,难成大器”云云,然而,你不能否认,人家找到工作了,而且活得也不错。
    2000 年以后,VB、DELPHI 也逐渐淡出眼界,J2EE/.Net 又冒出来了。真是“编程代有语言出,各领风骚数百天”。这些用 JAVA/.Net 的人,又有多少人是懂汇编的?有几个人开发过设备驱动程序?他们照样活得挺好。
    那么,什么是程序员呢?我的定义是:能通过某种手段,写出程序的人,就是程序员;能通过写程序找到一份工作的,是活着的程序员;写出好用的程序的人,是好程序员。在程序员的定义中,没有“C 语言”的字样。
 
    2、技术更替与市场法则——谁是看不见的手?
 
    亚当·斯密在《国富论》中指出,经济的发展有一只“看不见的手”在发挥无形的作用。那么,IT 的发展呢?让咱们回到 100 多年前,看看近现代科学是怎么发展的。
  • 1665 年,胡克出版了《显微术》,影响了地质科学至少 30 年,尤其是在化石观测方面;
  • 1887 年,赫兹证实了电磁波的存在;1894 年,Guglielmo Marconi 有幸读到了赫兹的论文,并开始做无线电实验,1901 年,无线电波穿越了大西洋,掀起了无线通信技术的革命;
  • 1905 年 9 月 27 日,爱因斯坦发表了质能方程;1945 年 7 月 16 日,第一颗原子弹爆炸;
  • ……
    更多的就不写了,免得大家睡着了。引用上述事实的目的,是想让大家跳出“编程”这个思维圈子,试图去找到这只“看不见的手”。
  • 如果没有发现细胞、没有化石观测,显微术能否这么著名,还不一定;
  • 如果没有 Guglielmo Marconi,赫兹“看到”电磁波的意义,也许仅仅是个被记载在物理教科书中的经典实验;
  • 如果没有原子弹的爆炸,质能方程能否象今天这样家喻户晓还是个问题……
    我想要表达的,已经非常明确了。技术是要为“应用”服务的。而“应用”,来源于“市场需求”。市场,决定了技术之路能走多远。
    或者你会说,没有技术革命,哪来的市场?是的,新技术的出现能带来工业革命,但反过来说,如果没有工业革命,所谓的新技术又有什么用呢?不过是图书馆里多了的一篇论文而已。况且,编程语言与“能引起工业革命的新技术”之间的距离,似乎比地球与太阳的距离还要远那么一点点。
    所以,是否要学 C 语言,不是由 C 语言本身决定的,也不是由专家决定的,而是由市场决定。市场,就是那只看不见的手!
 
    3、再回头看看 C 语言——夕阳无限好
 
    1972 年,C 语言被发明出来,广为流行;现今的 UNXI/LINUX 系统内核,就是用 C 写的。在此后的很长一段时间里,或许是为了生存,或许是为了实现技术高手的梦想,C 语言一直程序员的不二法宝。
    但是,社会一直在进步。现在,C 语言的应用已经越来越少了,JAVA 等后起之秀,已经修成大器。你能看到这篇文章,就表明已经在关注,已经在反思,或者说,C 语言感觉到了自己的危机。
    不要害怕,害怕也没用。社会前进的步伐,不是任何人可以延迟或改变的。既然 C 语言在走下坡路,我们又有什么理由一定要严防死守,要求每个人都学呢?条条大路通罗马,C 语言并不是唯一的选择。
 
    4、适应社会——如果斗不过你,就让我跟你干
 
    如果你想活下去,那就要适应这个社会。如果你的公司不用 C 语言,你也不必抱残守缺,更不要认为“精通 C 语言的才是高手”。实际岗位中,需要你用什么,就去学什么。个人的力量,是很难改变社会环境的。
    说句闲话:做人做事,首先都要“识时务”。认清社会发展的大趋势,是成功的关键。就算自己认不清路,那也要跟着能认清路的人一起走。如果我斗不过你,那就让我跟你一起干吧!
 
    5、任何语言都会过时——保持积极的心态
 
    任何事物都有产生、发展、灭亡的过程,编程语言也一样。而且,语言的更新换代速度非常之快。现在是 J2EE 和 .Net,没准过几年,又出来啥玩意呢。作为编程从业者,应该保持“活到老、学到老”的积极心态,而不是“学一门手艺,吃一辈子饭”。
 
    不必唱挽歌,C 语言的时代已经结束。与其花时间在争论上,不如赶快去买一本新书。


C语言是一门古老的语言,它是1972年由美国的Dennis Ritchie设计发明的,并首次在UNIX操作系统的 DEC PDP-11 计算机上使用。C语言是一门中级语言,它把高级语言的基本结构和语句与低级语言的实用性结合起来。经过C语言的学习,可以为嵌入式编程和其他高级语言的学习和应用打下良好的基础。
 
    C语言是一门要求严格的结构化编程语言,其他面向对象的高级语言也需要由结构化程序模块来组成。虽然C语言的编译很容易出现各种对数据及指针的操作错误,但也迫使使用者养成细心严谨的编程态度。而且C语言是纯结构化程序编程,少了面向对象的技术,容易被编程初学者接受。
 
    我是一名刚毕业的本科生,我通过对C语言的学习,理解了计算机编程的基本思想,也对计算机的硬件有了初步的了解。现在我找到了一份在J2EE环境下的软件编写的工作,虽然以前对JAVA语言了解有限,但JAVA是在C的基础上衍生出来的,基本的结构化语句相差不大,而且所有语言的编程思想和算法异曲同工,要实现从C语言向JAVA的过渡并不是很难的。(听豪客大哥说他从C语言向JAVA过渡只用了3天时间!)
 
    总而言之,对初学者来说,简单并要求严格的C语言绝对是你开始编程之旅的首选,C语言入手比其他高级语言快,学好了C语言后学习其他语言简直事半功倍(个人感觉)。现在大多数大学本科都选择了C语言程序编程作为编程课程的基础课,听说有的学校开设的课程是更为基础的PASCAL语言,但这门语言实用性比C语言低的多,现在好多底层开发和嵌入式程序设计以及驱动程序的编写依然使用C语言。而且C语言的发展方向多,嵌入式多数用汇编和C语言,大型游戏开发也以C和C++居多。
 
    仅以此文章告诫打算学习程序编写的门外汉门,不要以为现在C语言在应用软件开发方面应用较少就放弃对C语言的学习。应用软件开发商选择JAVA,.NET开发,也许是考虑到开发成本的问题,但并不能否定C语言高效的运行效率。


如果没有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语言的可能性

2007-01-16 08:52 孟岩 Csdn博客我要评论(4) 字号:T |T
一键收藏,随时查看,分享好友!

不少人在讨论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语言的确死了

C语言:生得伟大,死得光荣

更多网友讨论内容,请进入专题:“C语言是否该扔进垃圾桶”专题

(责任编辑 火凤凰 sunsj@51cto.com  TEL:(010)68476636-8007)


  • 给力
    (13票)
  • 动心
    (6票)
  • 废话
    (12票)
  • 专业
    (6票)
  • 标题党
    (6票)
  • 路过
    (9票)
原文:Java替代C语言的可能性返回开发首页
分享到:
0
收藏|打印|复制
关于Java  C  可能性的更多文章
  • Java之父评价C语言之父:我用尽了形容词
  • 让你的程序轻盈起来
  • 一道常考的javaSE面试题
  • 有凭有据 C语言真的比Java快?
  • 09年编程语言使用率前景分析
网盘战国:需求,机遇与挑战
网盘战国:需求,机遇与挑战

网络硬盘并不是一个新鲜事物。早在IE6的时代就有很多人在使用网[详细]

网友评论TOP5

查看所有评论(4
  • 51CTO网友
    04-13 13:13
    然后..c 又超过了.java..成为了第一
  • popotans
    12-14 16:08
    三年多过去了,你睁大你的狗眼看看 替代了吗?
  • 51CTO网友
    08-24 19:17
    楼上的多虑了,一种规范只是为了适用某一类应用,各有所长而已
  • 51CTO网友
    06-06 13:27
    别忘了java本身也是用C/C++写出来的,这些讨论似乎很滑稽
提交评论
通行证: 密码:   注册通行证


验证码:点击图片可刷新验证码请点击后输入验证码匿名发表 

栏目热门

更多>>
  • 2012年1月编程语言排行榜:Objective-C成为
  • 十种可能改变IT行业走向的编程语言
  • 回顾过去一年中编程语言领域的起起落落
  • 2012最受企业欢迎的开发技能Top10
  • 一个站在技术之巅的女游戏程序员

同期最新

更多>>
  • 手机SMS开发—编码和解码(C++)
  • Delphi7目录结构----初学者参考
  • Delphi编程技巧常见实例问答
  • Visual C++中的多线程
  • PHP对战ASP:这还值得讨论吗?

开发

频道导航
  • Java
    Java开发|Java基础|Java EE开发|Java框架|设计模式
  • WEB开发
    PHP开发|Python|Ruby|JSP|HTML 5|DIV+CSS
  • 综合
    .NET开发|嵌入式开发|项目管理|架构设计

热点推荐

  • Android开发应用详解
  • 那些性感的让人尖叫的程序员
  • HTML5 下一代Web开发标准详解
  • 高性能WEB开发应用指南
  • Ubuntu开源技术交流频道
热门标签: windows频道移动开发云计算objective-ctp-link路由器设置图解html5



原创粉丝点击