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本身的优势,在基础领域开发出一大批一流的支撑软件,那么局面是可以改变的,而且这种改变也是进步的,值得欢迎的。

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

注:巴洛克一词本义是指一种形状不规则的珍珠,在当时具有贬义,当时人们认为它的华丽、炫耀的风格是对文艺复兴风格的贬低,但现在,人们已经公认,巴洛克是欧洲一种伟大的艺术风格。

古典主义者认为巴洛克是一种堕落瓦解的艺术,只是到了后来,才对巴洛克艺术有了一个较为公正的评价。巴洛克艺术产生于16世纪下半期,它的盛期是17世纪,进入18世纪,除北欧和中欧地区外,它逐渐衰落。巴洛文艺术最早产生于意大利,它无疑与反宗教改革有关,罗马是当时教会势力的中心,所以它在罗马兴起就不足为奇了,可以说,巴格克艺术虽不是宗教发明的,但它是为教会服务,被宗教利用的,教会是它最强有力的支柱。概括地讲巴洛克艺术有如下的一些特点:首先是它有豪华的特色,它既有宗教的特色又有享乐主义的色彩;二是它是一种激情的艺术,它打破理性的宁静和谐,具有浓郁的浪漫主义色彩,非常强调艺术家的丰富想象力三是它极力强调、运动,运动与变化可以说是巴洛克艺术的灵魂;四是它很关注作品的空间感和立体感;五是它的综合性,巴洛克艺术强调艺术形式的综合手段,例如在建筑上重视建筑与雕刻、绘画的综合,此外,巴洛克艺术也吸收了文学、戏剧、音乐等领域里的一些因素和想象;六是它有着浓重的宗教色彩,宗教题材在巴洛克艺术中占有主导的地位;七是大多数巴洛克的艺术家有远离生活和时代的倾向,如在一些天顶画中,人的形象变得微不足道,如同是一些花纹。当然,一些积极的巴洛克艺术大师不在此例,如鲁本斯、贝尼尼的作品和生活仍然保持有密切的联系。

巴洛克一词的起源,有两种说法影响很大。意大利B.克罗齐等人认为源出于Baroco,原本是逻辑学中三段论式的一个专门术语;另一说认为源出于葡萄牙语baroco或西班牙语barrueco,意为各种外形不规则的珍珠,引申为“不合常规”。17世纪末叶以前最初将巴洛克运用于艺术批评,泛指各种不合常规、稀奇古怪,也就是离经叛道的事物。18世纪用作贬义,一般指称违背自然规律和古典艺术标准的情况。一直到19世纪中叶都是用于贬义而非艺术风格的名称。1888年H.韦尔夫林发表《文艺复兴运动与巴洛克》一书,对巴洛克风格作了系统论述,从此确定了巴洛克作为一种艺术风格的概念。20世纪西方学者对巴洛克作了更为深入的研究,赋予它不同的意义,但当做一种艺术风格理解仍是主流。
 

巴洛克风格

  音乐的巴洛克时期通常认为大致是从1600年至1750年,即从蒙特威尔地开始,到巴赫和亨德尔为止。

  1750年,对位法大师约翰·塞巴斯蒂安·巴赫的与世长辞,标志着巴洛克巅峰的对位法音乐的终结,也标志着巴洛克时代的终结。之所以称这一时期为巴洛克,是由于一时期音乐表达的技术及方式基本上有它一定程度的共同点,所以用此名词来标志,并无特殊的意义。巴洛克(Baroque)一词来自法语,追本溯源是葡萄牙语barroco,意谓形态不圆的珍珠。是巴洛克末期评论家们在评论此一时期的音乐时所首先使用的,而且一般含有贬意,指粗陋曲、奇异的、夸张的音乐。巴洛克之后古典主义时期的音乐家们趋于将音乐语言简化和规范化,在他们看来,巴洛克音乐过于夸饰而不够规范。

  因此巴洛克一词被评论家用来指十七世纪及十八世纪前期的艺术及音乐作品。现在,随着时间的推移,我们可以用更为深入和细致的历史眼光来看待这一时期的音乐,巴洛克不复有粗陋和毛糙的含意,但是比之巴洛克前后的音乐作品,它确实存在着夸饰和有些不太规律化的特征。文艺复兴时期的艺术讲究清晰、统一和协调。但至十六世纪末期,艺术中感情的因素日益增加,明净清澈和完美的形式被表达感情的需要所压倒。

  在美术中可以从卡拉瓦乔(1573-1610)的色彩浓烈的、戏剧性的绘画中看到。在音乐上我们也早已从马伦齐奥、杰苏阿尔多的牧歌以及道伦德的古歌曲中看出端倪,而他们的下一代则更往前发展了。要制造出这些强烈的效果,必须发展一种新的音乐风格。一般地说,文艺复兴时期平稳的复调音乐已不适合新时期所需要的特色。巴洛克时期最重要的创造就是“对比”的概念。文艺复兴时期的音乐进行流畅,各个声部(通常为四至五个声部)相互交织,同步进行。1600年以后这种织体日渐少用,只有在教会音乐中才能见到,这是因为教会音乐受传统及固定的礼拜礼式所束缚,因此是最为保守的。

  “对比”可以表现为各个不同的方面:音的高与低;速度的快与慢(快与慢的段落对比或快慢声部间的对比);力度的强与弱;音色的不同;独奏(唱)与全奏(合唱)等等。所有这些都在巴洛克时期的音乐结构中存在,各有它们的地位。许多巴洛克时期的音乐家使用协奏曲或复协奏曲形式(此词本身意味着明显的对比因素),这种形式的基本特点是织体的变换,有时用一个声部(独奏)或几个声部,有时用较大的群体合奏。最明显而强烈的对比是当时出现的一个新的体裁叫做“单声部歌曲”(monody),它是一种独唱歌曲,大致是在上面有一个流畅的人声声部,配以琉特琴或羽管键琴的伴奏,伴奏的进行较为缓慢,这一体裁的代表人物(在某种程度上可以说是创造者)是作曲家兼歌手卡奇尼(Caccini,约1545-1618)在他划时代的作品《新音乐》(Le nuove musiche)歌集中,人声的旋律依循歌词的意义,变化极大,在节奏和织体上可以从很简朴到非常富有装饰性;而且又与几乎固定不变音型的伴奏声部形成对照。

  卡奇尼属于佛罗伦萨的“卡梅拉塔会社”(一个由音乐家、诗人、贵族组成的团体)成员,他在十六世纪七十至八十年代接触到将古希腊音乐中表现感情的观点加以再创造的概念,这个团体遵循这个概念采用了“单声部歌曲”的形式。上述“伴奏”这个词,在文艺复兴时期音乐中几乎不用考虑,作为一个观念,它属于巴洛克时期,它意味着乐器声部之间的地位不同。

  事实上巴洛克音乐最重要的特征是它的伴奏部分即通奏低音。通奏低音演奏者在羽管建琴或管风琴(或拨弦乐器琉特琴或吉它)上奏出低音声部,上面标出数字指示他应演奏的填充和弦。通奏低音经常由两个人演奏,一人用大提琴(或维奥尔琴或大管)一类可延长音响的乐器演奏低音声部,另一人演奏填充和弦。

  这种使用通奏低音的织体是:上面一个人声或乐器的旋律声部,底部是一个低音乐器,中间填以和声,这是典型的巴洛克音乐的风貌。上面的声部也常有用两个的,有时是为两个歌手写的,有时是两把小提琴(此时即称三重奏鸣曲),此种结构在巴洛克音乐中也很典型,特别是通奏低音不能或缺,说明由低音产生和声的概念对于巴洛克音乐是如何重要,是它的中心。这个概念的出现并不突然,在十六世纪中已有将低音声部区别于复调音乐中上面其他几个声部线条的,但只是到了巴洛克时期这种风格才清楚地确定下来。

  与上述的变化一起,而且是有关的,是放弃复调(更精确地说,复调音乐成为一种老式的方法,几乎只用于教会的某一类音乐中)。重视和声必然导致在一首乐曲中出现和声进行的若干终止点,这些终止点称终止或收束,是由于某一种标准的一系列和声进行而形成的。与此相关的是节奏的进行,在声乐中,旋律要表达歌词的情感,必须按照(甚至夸张)语言的自然节奏;在器乐中(包括一些声乐,特别是合唱曲)有用舞蹈节奏的。由于低音用了舞蹈音乐的节奏型,加速了调性感觉的发展以及向某一个特定的音进行的趋向性。

  与此同时,新乐器种类的出现加速了这个进程,其中最重要的乐器为小提琴族系。当时维奥尔琴的发音适合复调音乐的清晰但却缺乏节奏的动力感,而小提琴洁净明快的运弓以及其演奏辉煌技巧乐曲的能力适合演奏舞蹈节奏的音乐,与单声部歌曲相比更有发挥技巧的能力。声乐风格与器乐风格的交替进行是典型的巴洛克的手法,巴洛克音乐中有这样两种不同风格的交替进行是为了新奇和效果。

  巴洛克早期重要的音乐形式是单声部歌曲(相对于前一个时期复调音乐而言)以及与此相联系的体载歌剧与清唱剧,强调语音与音乐的紧密结合,在歌剧中还有布景的效果。单旋律音乐中不使用对位,其形式是由旋律与低音相结合发展起来的,如分段歌形式,回族曲结构,在反复出现的低音声部上的变奏。在乐器方面也有相应的发展,如适合于演奏通奏低音组合的乐器,以及替代维奥尔琴族系的小提琴等,小提琴族系乐器更灵活而且能演奏较高的类似人声的音域。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值