中国开发网: 论坛: Java/J2ME: 贴子 462267
haitao
孟岩:Java替代C语言的可能性
http://blog.csdn.net/myan/archive/2007/01/14/1482614.aspx

Java替代C语言的可能性
前不久CSDN刊登了一篇《C语言已经死了》的文章,引起了一些争论。其实那篇文章是从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本身的优势,在基础领域开发出一大批一流的支撑软件,那么局面是可以改变的,而且这种改变也是进步的,值得欢迎的。








Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1482614



[收藏到我的网摘] 孟岩发表于 2007年01月14日 10:40:00


# liujin4049 发表于2007-01-14 11:21:08 IP: 59.61.85.*
对java的批评写得还是比较生动的


# prostar 发表于2007-01-14 11:45:40 IP: 218.94.8.*
不知道用Java如何写系统底层软件如BIOS之类的东西,难道要在计算机power on之后就搞个Java VM??


# hacker47 发表于2007-01-14 11:52:39 IP: 220.179.170.*
如果用java代替c,那么用什么写java的虚拟机呢?
就好比,如果让人成为上帝,那么让谁来制造人呢?


# pongba 发表于2007-01-14 15:27:21 IP: 222.94.3.*
关于软件开发成本的论述我很认同,成本来自多方面,有时候效率根本不是主要考虑。

<blockquote>
... 而在C语言中,这一不足暴露得格外明显。最大的挑战或许得说是并发问题了,并发是一个很复杂的问题,需要在相当高的抽象层面上解决,而C语言的抽象机制过于简单,提供不了高层的抽象,因此在开发者只能从一些“并发原语”出发去构造并发程序,这跟用铅笔刀锯大树没什么分别,直截了当地说,大部分C程序员根本没有能力编写高效无缺陷的并发程序...
</blockquote>

C语言中的并发编程问题是源于语言对多线程内存模型没有内建支持,从而使得编写可移植的多线程程序变得不可能。C++也有同样的问题,不过C++社群正在积极解决。
除此之外,在C里面编写多线程程序和在Java里面一样,因为Java的内存模型也只是传统的Lock-based。Lock-based模型众所周知的问题就是粒度粗了会损伤效率,粒度细了又容易导致死锁。所以使用lock来编写并发程序是件非常tricky的事情。Java只不过提供了一些方便一些的库,如lock-free的ConcurrentHashMap,除此之外,没有本质区别。
另一个很有前景的并发机制就是STM(software transactional memory),目前在haskell等一些FPL中得到了初步实现,不过由于这个领域目前还是比较不够成熟(与lock-based相比),所以大规模投入商业应用估计还要一段时间。
此外,C语言的抽象机制简单与并发编程并无多大关系。实际上支持并发编程模型的语言如Java在语言层面也支持提供一点简单(虽然很tricky)的支持,从而让编译器能够“知道”多线程的存在;更高层的抽象仍然是由库来完成。所以把这个问题归结到语言的抽象层次上似乎不够准确。

<blockquote>
... 在C中,你吃饭就是吃饭,捧起碗来喝酒,放下筷子骂娘,甩开膀子抓肉,撸起袖子抹油。而在Java中,你经常为了要干某件事,先new一个对象,然后以这个对象为参数new另一个对象,如此这般重复n遍,得到真正需要的对象,最后就是为了调用那个对象的一个方法,...
</blockquote>
似乎并没有这么夸张。即便有(如 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));这种),那也只是局部现象,似乎并不能立即得出普遍的风格或意识形态问题。Java事实上是一门完全实践派的语言。此外C语言程序员(并非指每个:))的过于dirty的作风似乎也未必就是好事,反正过犹不及就是了。相反,我认为Java里面的你说的这个风格问题是库的抽象及易用性做得不够好的原因,并不是多么严重的问题。




# lanphaday 发表于2007-01-14 17:15:57 IP:
说得好!


# lanphaday 发表于2007-01-14 17:15:57 IP:
说得好!


# tgv_mic 发表于2007-01-14 17:51:02 IP:
看此文感觉有点怯怯的,想问一句:Java的竞争者C#怎么样啊?


# zhouhongyun 发表于2007-01-14 18:32:54 IP:
成本来自多方面,有时候效率根本不是主要考虑。
-----不是效率不效率,是做不做得出来,c能做的东西很多语言做不出来,就这么简单,我不说多了,在windows上面api hook其实是很普通的技术,而且应用也很广泛,稍微有点技术含量的软件基本上都要用到,可惜纯粹用java和c#是根本做不出来的,你让一群java程序员用纯java实现一个金山词霸,他一百年也做不出来,这样的效率怎么算,应该为零吧??



# zengguowen1984 发表于2007-01-14 20:07:37 IP:
说的很好,楼主把JAVA是看彻底了。由于公司项目的关系,尽管我不想用JAVA但还是得用JAVA。在windows或上层应用软件JAVA是王者,在unix/linux下c/c++也是王者,一个东西在不同的环境会有不一样的效果产生,这也许就是语言的区别吧。


# jihailong 发表于2007-01-14 20:13:19 IP: 58.57.103.*
java已经走过巅峰了..................................


# joyous 发表于2007-01-14 20:22:59 IP:
目前C在系统、核心及虚拟系统的开发方面是不可战胜的
JAVA在应用、服务层的确有很大的强势


# missdeer 发表于2007-01-14 20:58:57 IP: 219.134.40.*
一直以来为脚本语言辩护的都会提出,效率问题,随着计算机硬件的发展将不成为问题。这其实是一种很不负责任的,误导初学者的荒谬言论。难道计算机硬件发展了,软件就一直不发展了,等硬件发展到可以让那些原本跑得不快的脚本程序跑快了,那些脚本程序也已经改成需要更快硬件的新版本了。看看Vista的硬件的需求……用JAVA写个QuakeIII出来啊……


# uuq 发表于2007-01-14 22:02:56 IP: 221.218.38.*
D语言出来了,别担心
到时java已死,估计也是他首发的


# yaotong 发表于2007-01-14 22:22:22 IP: 121.25.69.*
你文中指的C语言,包括C++语言不?
请谈谈C++语言的未来.


# wubaowang 发表于2007-01-14 23:28:18 IP: 221.222.163.*

LZ
说得好!


# hai1039 发表于2007-01-14 23:32:19 IP: 221.11.48.*
java有那么慢? gmdroc不是宣称java比汇编语言还要快2-3倍吗?


# phoenixsh 发表于2007-01-14 23:46:36 IP:
的确主要是成本问题。但是最主要的还不是有没有足够的开发人员,而是有没有动力去做。Java本来就是为了跨平台而设计的,基础软件并不是其目标。而且开发优秀的基础软件需要大量的人力财力,现有的基础软件又没有什么重大的缺陷,有谁会仅仅为了证明某种语言的能力而投入数千人年去开发新的基础软件?这就好比能源一样。大家都知道太阳能、风能什么的环保,可持续,但是世界上绝大多数的能源消耗还是来自石油。等哪天油价涨到二百美元一桶了,不知道会有多少机构去开发新能源。哎,说起来当年还说要开发Java芯片呢,现在都成遥远的历史了。现在是多核的时代。谁能充分发挥多核的威力,谁就是王者。

每个语言都有其适用的领域,没有必要为了证明语言的威力或者程序员的能力而硬要在不擅长的领域蛮干。该干嘛干嘛去吧。大家现在或者从前的头衔大概都带个“工程师”,就该讲究实用。

transactional memory的软硬件实现都还在探索研究阶段。这个为了性能而开发的技术,可是极度消耗内存的(听起来似乎有点矛盾吧?呵呵)。但是只要它能够充分发挥多核芯片的潜力,我决不会因为它消耗内存而抵制它。


# dilisi 发表于2007-01-15 01:26:03 IP: 58.55.2.*
java代替不了C,很简单的道理.
高中的物理知识代替不了大学的物理知识.


# lyanry 发表于2007-01-15 07:39:28 IP: 211.64.21.*
现在的现实世界都呈现多元化了,为什么计算机语言就不能多元化呢?

为什么总有人每天都在幻想要用一种语言去取代另一种语言,而不去考虑结合两种语言或结合更多的语言,去发挥所有语言的最大效用呢?

不管C是不是能写可以跨越1000台机器的程序, 如果这种分布式的程序在每台单机上运行的模块依然可以大量的用C来写, 在处理分布式功能时采用java或其他别的什么试图取代C的语言来写,这也未尝不可吧.

很多人都有些自私, 总是幻想用自己喜欢的那种语言去取代他所不喜欢的.


# julong88 发表于2007-01-15 08:57:17 IP:
作者写此文的目的无非有两点
1、看到了前几点驳来驳去关注度
2、此文还抓住了java的愤青,你看上面有不少的叫好者。但这部分人除了愤我看没别的

没想到的是每天坐在圣坛上大师也有忍不住寂寞的时候


# mhmdanger 发表于2007-01-15 09:23:22 IP: 222.209.96.*
写得很不错,比较客观,不同的语言适合不同的环境,黑客界把c和java都作为应该学会使用的语言,说明他们都是很优秀的。


# lgs666 发表于2007-01-15 09:26:26 IP: 222.182.2.*
现在很多人还是觉得Java慢,主要的原因已经不是Java跑得慢,而是由于内存消耗过大导致的综合性能下降。
--------------------------------------------------------------------
对于一个贪婪的人来说,你不能怪他贪婪的本质,而要怪你,你给他的太少了。
哈哈!


# cime63 发表于2007-01-15 09:31:04 IP: 220.163.82.*
现在很多人还是觉得Java慢,主要的原因已经不是Java跑得慢,而是由于内存消耗过大导致的综合性能下降。
--------------------------------------------------------------------
对于一个贪婪的人来说,你不能怪他贪婪的本质,而要怪你,你给他的太少了。
哈哈!
=====================================
同意
而且要多给,等内在达到1024T的时候,JAVA就会更快了


# CAYU 发表于2007-01-15 09:32:14 IP: 220.197.208.*
很不错


# tangtao 发表于2007-01-15 09:34:36 IP: 210.77.134.*
典型的鸡同鸭讲

你看看有多少人看懂了你写的?


# Let4g0 发表于2007-01-15 09:38:13 IP: 221.224.51.*
又一个无知的家伙,简直扯蛋


# xiahouwen 发表于2007-01-15 09:56:07 IP: 61.185.224.*
怎么不见大师为 DotNet 摇旗呐喊 ?


# SBtoSB 发表于2007-01-15 10:04:18 IP: 219.136.164.*
没什么替代不替代的,这等于拿牛和马来比,没什么替代关系性


# hertcloud 发表于2007-01-15 10:34:39 IP: 221.237.164.*
说了几十年 那个死了嘛
不同的 领域 用不同的东西。


# Flwu 发表于2007-01-15 11:00:21 IP: 219.140.167.*
我看Java永远别想取代C,
倒是有可能利用C开发另外一种语言取代Java,比喻说.Net++


# Flwu 发表于2007-01-15 11:00:21 IP: 219.140.167.*
我看Java永远别想取代C,
倒是有可能利用C开发另外一种语言取代Java,比喻说.Net++


# yevv 发表于2007-01-15 11:02:45 IP: 219.142.151.*
用Java语言开发基础软件,怎么开发呢?如果JVM算作一种基础软件的话,至少它就不可能用
Java来开发,如果要用Java来开发OS,显然OS需要运行在JVM之上,自然JVM的实现就要脱
离操作系统的支持,直接建在HW之上,想必这对JVM来说也不是件小事,对OS来说就更是盘古重
开天地,女娲再造人,这样的事不会是“姿势不对,起来重睡”那么简单,也不会是哪个
牛人嘴大一点就能解决得了的。


# flydream1981 发表于2007-01-15 11:16:02 IP: 210.76.108.*
汗,你就不能做点有意义的事情么?



# Terony 发表于2007-01-15 11:37:29 IP:
Java 是不可能替代 C 语言的。


# pottichu 发表于2007-01-15 11:39:27 IP: 61.50.219.*
寒! 孟岩老师也来凑这个热闹,呵呵。
读过你翻译的书,非常不错, 支持一下,呵呵。


# Analyst 发表于2007-01-15 11:52:12 IP: 58.38.155.*
呵呵,孟岩也来参与讨论了。
你的观点我基本赞同,在并行计算时代,C/C++肯定是不适合的,我不喜欢java的理由也主要是风格的问题,与我的实用主义原则是格格不入的,这方面.net要好很多,C#从1.0发展到3.0步调比java轻快的多,如果微软能够选择开放的姿态,.net的前途会很好。


# mcs51a 发表于2007-01-15 12:09:29 IP:
什么是基础软件?hehe


# lnp 发表于2007-01-15 12:16:39 IP: 218.249.243.*
在并行计算时代,C/C++肯定是不适合的
--------------------
为什么?java.util.concurrent 就很厉害?


# powpow 发表于2007-01-15 12:17:01 IP: 218.6.245.*
如果本地化编译器能完全支持jdk(gcj),这不是不可能的。现在java最大的弱点还是效率问题,作者说得java在1.4以上不比c差,其实从目前的java桌面应用的普及度就看得出来,这点儿java还有很长得路要走,我觉得根本解决java桌面应用的办法就是本地化编译,只可惜java生来就不是为了这点儿的。


# mcs51a 发表于2007-01-15 12:23:26 IP:
跨平台,跨系统就那么重要?


# airu 发表于2007-01-15 12:40:33 IP: 222.221.7.*
好文章。说道风格的比喻太形象了。


# longrenrex 发表于2007-01-15 13:05:49 IP:
写的不错,比较客观!

CSDN 上面现在很难看到这样客观的文章了。


# starwhisperer 发表于2007-01-15 13:29:43 IP:
呵呵,写得很客观,Java社区确实很偏重于构架,性能的考虑基本都是放在其次的。现在CSDN上愤青越来越多,像楼主这样沉着稳重的已经很少了,呵呵。


# TourWind 发表于2007-01-15 13:30:12 IP:
写得不错,但楼主的题目容易让人误解。

应该是“JAVA替代C语言的主流地位的可能性”。

JAVA无法替代C语言,就像C语言无法替代汇编。但JAVA有可能替代C语言的主流地位,就像C语言替代汇编的主流地位。


# flyfreely 发表于2007-01-15 13:34:49 IP:
不用说Java替代C语言了, 就是C语言取代汇编都不可能。

看看操作系统代码里面仍然是C语言加汇编就知道了,
经过十年以上的工业级发展的语言是很难被完全替代的。


# ztanlee 发表于2007-01-15 13:34:57 IP: 210.51.173.*
领域不同,而且就写并发程序那一部分鄙人也不是很认同。并发性同现在一般都是从系统级去提升,而不是语言级


# summersnowgieno 发表于2007-01-15 13:39:28 IP: 207.46.89.*
用Java替代C语言的可能性甚至没有没有我每天用汇编写日记的可能性大。鼓吹Java能够替代C语言的人一般都是既不了解C也不了解Java的,或者是有意哗众取宠,才说出这种可笑的言论。


# huanzhugege 发表于2007-01-15 13:57:30 IP: 121.23.180.*
你拿Java与C比简直就像拿李小双与邓亚萍比一样,根本不是一个领域的东西。C是做基础系统开发的,基础系统不用去管什么可扩展性什么的,而Java是做业务系统开发的,面对的是千变万化的业务需求,必须考虑可扩展性等东西,所以拿Java与C比简直就是笑话。


# cc555 发表于2007-01-15 14:03:23 IP: 222.66.73.*
如果真要说替代,
那也是c#替代c/c++,而不是java!



# cc555 发表于2007-01-15 14:04:35 IP: 222.66.73.*
如果真要说替代,
那也是c#替代c/c++,而不是java!



# chinamarcdata 发表于2007-01-15 14:32:38 IP:
不懂c语言的家伙在呓语,还以为你的水平很高,呵呵,不过如此而已.


# floater 发表于2007-01-15 14:39:11 IP:
各自应用领域无交集,如何替代?如此误导,实在不该!


# codez 发表于2007-01-15 14:44:23 IP: 61.181.247.*
算是一种鼓吹吧,文中对 java 似贬实捧,对 C 则是似捧实贬。
只考虑 java 长处,对于 C 的长处则不涉及谈论,比较有失公允。

没有人能对一门语言指手画脚,就是所谓的“高手”也是。

语言比较没有意义,很多人却乐此不疲。

简要概括:有病!

如果真要从功效性比较 C 更擅长,java能做的C能做,java 不能得C也能做。

虽然大部分学 java 的都是笨人和懒人,而且,本人既笨又懒,很可惜我不喜欢 java,虽然学过,但是没兴趣。

保留对 java 的评价,因为本身水平不够。只能说我不喜欢这门语言。

自己不能用 C 语言做到,不要说大家都不能做到。

关于 C 的讨论,大家都歇菜吧。各找各妈,各回各家,散了吧。


# dragonbbc 发表于2007-01-15 14:51:13 IP:
高手就是高手啊,受教了


# DarknessTM 发表于2007-01-15 15:11:34 IP: 60.12.8.*
不要忘了给JAVA铺平道路的是JVM,完成JVM的是C/C++!抹平硬件的区别,抹平OS区别的谁,绝对不可能是JAVA。或许随着硬件的发展,JAVA程序的速度会越来越快,可能快到现在的C/C++程序一样快,但是同时的C/C++程序会更快。通用和性能是没有任何一个东西可以做到双极的,只考虑开发效率而不注意运行效率是对用户硬件的不负责,永远也别指望JAVA能完全代替C/C++,除非CPU运算时就用的JAVA指令


# lbx19822004 发表于2007-01-15 15:12:05 IP:
吃饭就是吃饭,捧起碗来喝酒,放下筷子骂娘,甩开膀子抓肉,撸起袖子抹油。 --- 这样子才是写程序的样子嘛,呵呵
其实用java写程序也并不是不能做到这些,关键是看我们对这门语言所掌握和理解的程度,至于是不是能够取代C,我想还是取决于java今后的发展和java使用者的水平。


# rexfa 发表于2007-01-15 15:18:13 IP:
很多地方说道点子上了,俺们做单片机的兄弟(用C)因为设备稳定问题都上过第7日这个节目,被元元狠劈……现在很多年过去了 终于稳定了,可是这些设备打算淘汰了……

工具就是合不合手的问题。 那个勇气号 据说是JAVA驱动的,不知道是不是真的


# nightyoung 发表于2007-01-15 16:45:25 IP: 203.95.5.*
既然是种语言,就没有好坏之分.用的人多了自然交流起来比较方便.没有什么替代的说法.


# drpython 发表于2007-01-15 17:12:29 IP: 61.133.106.*
好文章,讲的很到位

Java早晚要被它这种华而不实的作风而付出代价


# lesliewong2006 发表于2007-01-15 17:32:38 IP: 219.142.193.*
难得的好文章,顶一个


# zhuyie 发表于2007-01-15 18:11:29 IP: 219.131.196.*
没有能解决所有问题的编程语言,要承认Java相对于C在软件开发生产力上的进步,也要承认它在效率(速度和内存占用)上改进的局限性。


# yanonsoftware 发表于2007-01-15 18:17:09 IP: 219.239.35.*
C的地位是永远无法取代的,就像你不能说汇编死了。底层的知识永远都是有用的。
至于更方便。。。。D语言不错,呵呵。


# lijing1982916 发表于2007-01-15 18:34:17 IP: 218.79.83.*
其實任何語言的存在都有本身的價值,我不知道,這個主題拿出來討論有什麼意義,語言只是工具而已!!


# huyi 发表于2007-01-15 19:07:31 IP: unknown, 211.*
1.对于并发的问题,java.concurrent综合能力不见得比C++版的ACE中某些支持并发的元件强大。
不知道为什么大家都觉得java的并发能力很强,ace其实也不错啊,使用简单,跨平台,高效率,哪一点都不比java差。
恰恰相反,大部分专门做高并发型程序(像通讯服务器)的程序员,讨论C/C++的次数,肯定比提到java的次数多。

2.如果要说到差别,先举个例子:
对于某个要对应于10种平台的应用软件,有两种开发方案:
1)采用java做应用本身,然后采用c/c++在10个平台上分别开发JVM.
2)采用c/c++本身开发10个功能上一样,但对应10个平台的应用。

算起总账来还是第一种方案好些,复用性强。开发虚拟机虽然难,但可能别人都给你做好了。

3.还有一个差别,就是在于使用java和c/c++的人。
举个例子:
现在要开发一个高并发的,cpu占用率高的程序。该程序内存占用也高(1.5GB),现在要求设计一个容错处理机制,让使用这个程序的服务器在当机后在尽量不丢失内存数据的前提下恢复。

就是要求设计一个热备份机制。并且要求尽量不影响服务器。
长期java企业应用的人,这个时候可能会第一反应是在记忆中搜索有没有类库来完成,如果没有,又会去考虑要使用什么模式,要用什么架构来搞定这个问题,或者是怎么抽象出框架留出接口给其他“专家”。因为他们的信条是用架构和设计模式来搞定一切。但针对上面提出的问题,往往是未果。因为还是算涉及到了一些超出架构范畴的知识。
而长期从事c/c++开发的人,第一感觉可能会去分析什么因素会制约效率,普通io操作要使用cpu复制数据,所以当把内存中的数据dump到硬盘时,cpu不能应答客户的请求,从而降低了效率(当然这是从单核考虑),做java的大部分人可能都意识不到复制数据要通过cpu这个小知识点。但做c/c++的大部分都能意识到,知道DMA,以及基于DMA特性的技术。

一般作c/c++的人基础知识都比较扎实,哪怕是在java最骄傲的OOP方面。我做的一个极小范围的调查,调查中没有一个java程序员说出了怎么用设计模式去解决热备份的问题。但却有不只一个C++程序员提出了方案:在CPU完全空闲时完全备份,然后在这个备份点之后用Gof23的Command模式来录制关键的用户操作。恢复时先恢复最近的备份点,然后在这个基础上执行保存下来的command......


# lxpbuaa 发表于2007-01-15 19:39:34 IP:
不错,比较客观,赞同文章基本观点


# shadowstar 发表于2007-01-15 19:58:33 IP: 61.154.244.*
不是只有C和JAVA,还有很多其它语言呢!!!


# Sodier 发表于2007-01-15 20:52:04 IP: 218.193.181.*
搂主分析得很透彻啊,看来得多花点时间研究java语言基础性的东东了


# stormful 发表于2007-01-15 21:06:01 IP:
什么样的东西,用在什么样的地方。这是基本尝试了。大家都知道的。我们每天都在使用C的产生物,从操作系统到MP3。根本谈不上什么替代不替代。C的难处在于成才率,JAVA的窘迫在于太泛滥。实在不敢恭维JAVA开发人员的平均技能素质。如果我是个人士主管,招聘JAVA程序工。如果我面对1个C熟练工和一个JAVA熟练工的应聘。我选择C熟练工,让他去学习JAVA。


# ahzjg 发表于2007-01-15 21:56:06 IP: 222.240.216.*
在Java中,你经常为了要干某件事,先new一个对象,然后以这个对象为参数new另一个对象,如此这般重复n遍,得到真正需要的对象,最后就是为了调用那个对象的一个方法,就好比吃饭时焚香洗面,漱口净手,战战兢兢,毕恭毕敬。

---------
Java这样做是为了让自己的类库看起来简练,是decorator设计模式的应用


# ahzjg 发表于2007-01-15 21:57:46 IP: 222.240.216.*
说替代太夸张了,也觉得不太可能。说在某些领域替代还是有可能的,因为Java确实可以让我们少考虑很多问题


# superpingl 发表于2007-01-15 22:23:28 IP: 211.138.145.*
要是有可能的话,计算机的物理结构就要发生翻天覆地的变化。c是建立在物理基础上抽象的,而java是建立在操作系统上的虚拟机抽象。他们的本职是有区别的。有可能将java去抽象物理的东西吗?可以的话那就是第二个C++,这有必要吗?基础的东西还是要存在的,不要盲目的跟风,被老外个忽悠了。失去最核心的东西,不要忘了软件的基础是硬件。
我的blog:http://szhaitao.blog.hexun.com & http://www.hoolee.com/user/haitao
--以上均为泛泛之谈--
不尽牛人滚滚来,无边硬伤纷纷现 人在江湖(出来的),哪能不挨刀(总归是要的)
网络对话,歧义纷生;你以为明白了对方的话,其实呢?

您所在的IP暂时不能使用低版本的QQ,请到:http://im.qq.com/下载安装最新版的QQ,感谢您对QQ的支持和使用

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录