`
utensil
  • 浏览: 152603 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

编程的未来

阅读更多

有一句话,我觉得对程序员是至理名言:编程未来的趋势是库,动态的脚本语言和虚拟机。这句话我一听就觉得很对,可是对它的领会(尤其是后半句话)却花了很久,现在也还在半路上。

我一直很喜欢C++的一个基本的设计思想,就是有些事情是语言该做的,更多的事情却应该交给库去实现。正是这种思想,使得C++可以应用于各种领域。语言应该给程序员足够的自由,从最底到最高层,从最机器的层面到最贴近现实的层面,然后,用这种语言,我们再来写库,用于各专有的领域。C++成为了工业标准,它写成的库可以被各种语言使用、绑定,它被用来写各种语言。任何宣传C++的没落的言论都是窄视的,它没有看到C++是今天的许多事情的一个基石。C++ 是静态语言所达到的一种极致。

C++与C的兼容以及对其规范化的推动,现在看来是做得再聪明不过的一件事情。时至今日,许多库依然用C 写成。C的生命力是C++成功的最重要的基石。在领略C++的无数美妙之处的过程中,我曾经以为C已经没落了,后来却在实践和更多的对源码(gcc和 Linux内核)的阅读中重新意识到C的永不消逝的价值。看到C里的OOP甚至 AOP的种种实现,正如看到SICP中用Scheme做的编译器时一样,我意识到,更轻小更简单的语言,却能允许人类智力的最完全的发挥,也在一定程度上明白了为什么Linus会说“C++ to C is lang cancer to lang”。很多C++里的东西,现在看来都很语法糖衣。然而,它最可贵的价值之一就在于,用一种语言,使我们学会了OO、多态和泛型的思维,同时也提供了一种对这些思维的描述。C++是设计模式最好的描述语言,我看到许多书用Java这种先天不足的语言来描述设计模式,就觉得别扭。

是的,我恨Java,这种感情与日俱增。虽然我一直都在关注和学习它的技术,包括EJB,Struts,Hibernate和Spring,并且《J2EE Development without EJB》一书使我对这门语言背后的技术有了更大的好感,再加上最近看到一篇文章尖锐地指出Java并不慢,但是,刨去了所有没有根据的偏见,使我憎恨这门语言的核心理由却无法被撼动。不记得谁说过,Java是他第一次学习一门新语言没有感到任何新的惊喜,没有发现新的思想。我还要加上后半句:“反而感觉到一下子丢了好多东西”。Java使OO的一切都变得不再美妙,使一切变得麻烦,这就是我们为所谓的简化付出的代价。C++庞大而精深,任何一个怕难的人都可以栖居于这个语言的简单部分,而让写库的人去充分使用这个语言的其他层面。有了编写良好的智能指针库和对其恰当、适度的使用,所谓的用一种语言来 “把程序员从内存管理的泥潭中解放出来”就相当可笑。程序员的不自律和不善用库没有任何借口。程序员之所以爱好编程,就是喜欢那种一切都可以做到,一切都可以掌控的感觉。静态语言不能丢失指针,不能丢失引用,程序员不应该对const &厌烦。为什么除了栈我们还需要堆?在你离开作用域的时候,栈会严格地帮你回收利用你用过的东西,但你却带不走自己用过的东西。有了堆,你可以带走了,你可以在应该回收的时候再放手。托管却使你完全失去了对一切的控制力,你不得不把东西丢得满地都是,等待机器人来捡你的餐巾。而且Java写的程序就使用的时候感觉,也常有内存释放的问题,也会崩溃。那么,当初何必呢?静态语言不应当放弃自己对内存的管理,自己束缚自己手脚。

Java 的流行的关键是,它对类库的相对统一的捆绑,它的用虚拟机跨平台,它的集成了多线程,它在Web方面和嵌入式方面采用的先进的技术和框架。这些构成了它的生命力,有人说它会消亡,那是不可能的。我不是看不到它的生命力,而是我一直宁可这些概念和技术是基于一门不那么丑陋的语言,尤其不能容忍喝 Java咖啡的人不知天高地厚地耻笑C++,而且对那些把Java称为初恋的程序员感到极度恶心。我无法相信,发明Java的人会是真正资深的C++程序员,他们应该是在早年C++艰苦创业时受了苦的程序员。顺便说一下,我相当明白为什么大家会把这些技术堆到Java身上,Java语言自身的简易(从编译实现的角度)和内存托管功不可没。一切都是时机和真实的历史进程惹的祸。

在看了D&E之后,我对Stroustrup相当佩服,我佩服他在各种程序员的口味面前坚持住了自己设计语言的哲学,保持了语言的纯洁,使得C++的扩充并没有使自己走形,这不是任何人能做到的。举两个我最欣赏的例子:纯虚函数=0的语法,和后缀++重载的方式(operator++(int))。不过也可能有人对这个最不以为然。讲讲我最喜欢C++的一些地方吧:尽量保持少的关键字,善用运算符,有运算符重载(可惜还不够充分自由,要是有自定义操作符的功能就好了),有同名函数重载,有枚举,精心设计的构造和析构体系(就像栈一样让人放心),类的定义和实现分离,模板以及相应的泛型编程,有作用域的typedef以及traits技术,保留了强大的C预处理宏(学C++先要学会不用宏,然后学会善用宏,可惜define间较难相互利用),有指针和引用,有各种const,有名称空间,进行强类型检查却又保有隐式类型转换,有完全可以善用的多重继承,有精心设计的虚函数多态体系以及可爱的->,很多东西交给了库而不是捆绑入语言,这使得我们可以有较多选择。这里太多太多东西Java没有了,而以上每一样技术都是程序员的好朋友。C++自己的问题在于编译器的实现还不够完美。

应该说,没有使用过多个库/类库(尤其是开源库)的C++程序员不算C++程序员。各种通用用途或专有用途的库对于程序员的成长是非常有帮助的,它会培养程序员搭建编程环境,靠文档和例子迅速上手,用Hack解决各种Bug、移植性或依赖性问题,对库进行定制的能力,这些可是保持程序员在不断涌现的新技术面前屹立不倒的能力啊。由于库通常有各种语言的绑定,库也使程序员能迅速摆脱语言的束缚,只要有库,程序员的能力就不受限制。剩下的就是人月神话的问题了。我一直都在涉猎各种类库,他们的源代码就如同经卷,如果有足够的时间,好想像玄奘一样坐下来汲取它们的精华。

在C++之前,(从小学起)我用过 Logo,GWBasic,C, VB。在C++之后,很少再有什么语言能给我真正的惊喜,直到我大范围接触动态脚本语言。Bash是最初的关于脚本的惊喜,但现在看来,它太不脚本了,不够动态。后来用过或学习过,汇编(x86,一点PowerPC,现在正在学MMIX), Make, LaTeX, Matlab, ActionScript, JavaScript, Lex/Yacc, CSS/XPath, XML/JSON/YAML, Grapghiz, Metapost,Scheme,Squiril,PHP,Python,Ruby,Lua,Erlang 等语言,应该说各色语法都见过了,都有一段使用的时间,有些比较钟爱的语言还是在多个时期分别使用过,有反复的咀嚼和重新发现。

最近一段时间做了个网站(DHTML/CSS+LAMP+Ajax),加上对Prototype源代码的阅读,使得我对JavaScript有了重新的发现,同期的Ruby学习也令我惊喜不断,我向所有人推荐这两门语言,这两门动态语言,最适合打破C++给程序员的静态思维,PHP也不错,除了用它做网站后端,用来做零活也不错。相比之下,我还是不那么喜欢Python,有待将来重新发现它了。JavaScript对于函数的内部变量的处理方式(挂为函数的一个属性)和把函数当做普通变量的做法,使得它的函数既能当Lamda函数用,又能当(一个可以不断扩展的)类用,甚至可以当包用,相当伟大的设计。 JavaScript甚至发展出JSON作为数据共享格式,比XML好多了,我相信它将在分布式应用中发挥相当重要的角色。JavaScript和 Java根本是两种完全不同的语言,完全不同的两种思维范式,我从前对它有太多误解。由于JavaScript和C很像,所以掌握其使用不难,但Ruby 则将要求你习惯另外一种思考问题和书写语句的方式。Ruby中的迭代器是它最大的亮点之一,它对前一语句的返回值与{}块进行了相当具有启发性的使用。另外一个特别需要适应的思维是,这里没有强类型检查,只有duck-typing,即如果我们只需要一个对象像鸭子一样叫,只要这个对象能够像鸭子一样叫,我们就接受它是鸭子,不管它事实上是什么。我原先对动态语言的无类型一直不适应,这次使用时才充分意识到它的威力。Ruby很有更多美妙的地方,这里就不提了。

若干年前,有书推荐说,学了C/C++后,Java是相当合适的第二门语言。现在才知道大错特错。程序员的第二门语言应该是一门脚本语言,用来快速完成一些零活,也用于使程序员的思维灵活化。脚本语言的设计思路绝不能像静态语言一样,让语言更纯粹,事情让库做。脚本语言要内嵌许多常用的功能,不仅是通过核心库来提供这些功能,更是要在语言层面支持更方便的调用。正则表达式就是其中最起码的一个,数据库的访问、多线程也是相当重要的(且看Ruby的mutex.synchronize{})。

动态语言还有一个妙处在于eval(),我们可以动态地用脚本生成脚本的字符串,然后执行,这也是Bash当初令我惊喜的原因之一。自然,可以像访问一个关联数组一样访问创建过的变量、函数、类和Symbol,更是动态语言给程序员的最大自由。这两个功能,前者使我们能使用使用语言构筑的语言,后者使我们能够进入语言的元层面。前者建起来,后者挖下去。这样我们得以超出语言提供给我们的单一平面,有了第三个维度。

在文章的最后,简单地说说虚拟机吧。

从使用VMWare在各平台上调试程序,到使用各种模拟器玩游戏,再到使用模拟器进行嵌入式开发,虚拟机的重要性不言而喻。始终希望Fusion或者seamless的技术能够发展得更成熟——有了这种技术,我们可以在一个操作系统上无缝地使用另外一个操作系统上的程序。我可以装个真正的双系统,以其中一个操作系统为主操作系统,需要时不用重启可以调用另外一个操作系统中的程序,最关键的,是这个程序的运行环境,是真正基于那另外一个操作系统的,这样不会有Wine的尴尬,不会有VM的慢。在多核的情况下,可以有多个操作系统来分别使用一个核。这样的技术是可以实现的!只是还没有。如果有足够的内存,这样的技术就可以足速运行。现在的情况是,软件的开发跟不上硬件的发展,即使具备了相应的计算能力,却不能享受到这种便利。一种可能的设想是,不要把虚拟机建在应用层或者内核层之上,而是在内核下面,在BIOS和Booter之间,并像VMWare Tools一样,在应用层也有呼应,两相配合。Intel和AMD已经在CPU里对虚拟机做了支持,然而就使用它的KVM的性能表现来看,我还是比较失望的,可能是我没有恰当使用,或者KVM还在刚起步的发展阶段吧。还有Knuth的结合了各种计算机架构优势的MMIX芯片,目前还只有虚拟机,我希望这样的虚拟机能够硬件化,然而这样的事情,却要等待真实的历史进程了。

然而其实那句话所说的虚拟机,应该不是指这种虚拟机,而是指语言实现用的虚拟机。Chrome所用的JavaScript引擎V8,以及Mozilla的SpiderMonkey引擎,它们也是一种虚拟机,然而是属于动态语言的虚拟机,解释语言的虚拟机。这又涉及到自动状态机……对这些方面了解不多,就此打住吧。

分享到:
评论
2 楼 utensil 2009-05-07  
对此评论回应见于fuliang的读完此文后所写博客:

http://fuliang.iteye.com/blog/377942#comments
1 楼 fuliang 2009-05-01  
我感觉Java的面向对象模型要比C++要好,C++是一个追求效率而不惜牺牲其他空间和优美方面的语言。
一、C++没有interface的概念,这是面向对象概念的很大的一个缺失,当然纯抽象类就是interface,但至少是概念上的一种缺失。因为interface和抽象类在面向对象中是完全不同
的概念,设计的目的也不同,抽象类是为了别人继承,而接口一种契约和规范。
二、C++的继承体系不够完善。C++在每个对象中安插一个指向虚函数表的指针来完成多态,实则是以空间换时间的做法。而Java有着完善的继承体系的实现,查找方法通过super指针遍历类体系结构,这是大多数语言采用的方法。C++这种做法导致类继承函数隐藏的诡异行为(子类一个不同方法签名相同方法名的方法会隐藏掉继承下来父类的方法),实在不爽。
另一方面C++缺少单根继承(Java的所以类的根都是Object),这其实也是面向对象概念的一个缺失,一切都是对象。这样一些类就没有了一个统一的约束。
三、C++引用这个东西的名字几乎起错了,实际应该叫别名,而不是到处都在说引用就是别名这个东东。这点与大多数语言都不同。
四、C++显示对象存在(Java中的对象都不是显式的,是由引用持有的,你看到的都是引用)只会导致误用,由此导致对象的无味拷贝。从而引出像拷贝构造函数,以及引用传递的
复杂概念来支持和避免带来的问题。
五、C++拷贝构造函数,对指针成员深拷贝无能为力,需要手写虚clone方法实现prototype模式,并且没有同一个一个约束,这样是缺少单根继承所造成的后果。而这一切Java都是内置的。
六、C++的异常很不成体系,使用起来让人觉的很是不爽。
七、C++缺少反射机制,这点对使他真正的成为“静态语言”,许多更优雅的框架设计从此离他远去。
其他方面:
八、C++的多维数组作为传递一直很无奈,而Java则足够智能。
九、C++的返回函数内的对象一直没有很好的解决方法。局部对象直接返回造成无意义的拷贝,返回地址则因失去作用范围而无效,使用new在堆中申请需要让别人去delete,而这使用者可能一无所知。使用智能指针,让人阅读代码痛苦不堪,我曾读过Firefox源代码全是智能指针,导致Eclipse ctrl快捷键阅读代码完全失效。这就是托管语言,垃圾回收爽的地方,从而带来代码上的优雅。
九、C++的string和char *不能自动相互转化这点非常不爽。
十、C++的stl库设计缺少和向数组这样基本结构转换的接口。以及一些容器设计不够优雅,
如map的count,find这个函数名字叫的莫名其妙。
十一、其实大量的程序员不会使用C++的const,由此造成传递参数的时候,如果没有参数没有const修饰,而无法传递常量的困苦。以及其他赋值方面没有一个约束机制,例如char *s = "abcd";很自然的一个语法却潜藏阴险的问题。
当然Java也有一些ugly的语法,例如不支持默认参数,泛型是一种擦拭机制。但基本上Java是在去除C++语法的复杂性和糟粕的东西,而吸取了其精华的部分,让你远离了危险的代码而保持健壮性。
引用

C++是设计模式最好的描述语言,我看到许多书用Java这种先天不足的语言来描述设计模式,就觉得别扭

我倒和你有相反的想法,C++描述设计模式要考虑的C++语言的语法的太多,而Java则简单明了的表明了意图。
引用

Java使OO的一切都变得不再美妙,使一切变得麻烦,这就是我们为所谓的简化付出的代价。

我不知道有哪些不美妙的地方。至少我感觉Java的OO机制要比C++美妙的多,C++在向下兼容c的面向过程和一切以效率为目标,以及在stl试图得到使用函数式语言的美妙感觉而背弃面向对象的方法,让它变得不伦不类。
引用

静态语言不能丢失指针,不能丢失引用

Java的引用就是安全的指针,在面向对象语言中,指针的++,--操作不仅危险而且显得很别扭,C++引用其实是一种在提供一种防止大对象拷贝的方法,而Java完全不会有大对象拷贝的情况,而引用的副作用可怕的很。在引用传递的时候,形参的突然改成别的对象的别名,
实参的引用仍然很无辜的以为还在是原来那个对象的别名,虽然可以加上const T &t来限制这个东西。C++给程序员的责任太多,我每次写C++代码的时候都要小心翼翼,不是在考虑设计而是在考虑细微的语法所带来的别人如何使用问题。

相关推荐

    【编程猫】林翔宇_风起时,少儿编程未来3年发展与趋势.rar

    【编程猫】林翔宇_风起时,少儿编程未来3年发展与趋势.rar

    【编程猫】林翔宇_风起时,少儿编程未来3年发展与趋势.pdf

    根据提供的文件信息,我们可以梳理出以下关于少儿编程未来3年发展与趋势的知识点: 一、少儿编程政策背景 1. 浙江省高考改革:自2014年起,浙江省将信息技术科目(包括编程内容)纳入高考体系,这一改革的实施标志...

    scratch编程-未来城市2重难点.pdf

    scratch编程-未来城市2重难点.pdf

    《初识汉语编程环境》-教学课件.pptx

    汉语编程是一种创新的编程方式,它以中文作为编程语言的基础,旨在降低编程门槛,让更多的人能够理解和使用...通过学习和实践,我们可以逐步掌握汉语编程的技巧,从而改变我们对编程的认知,走向更加广阔的编程未来。

    人机编程案列

    人机编程,也称为混合智能编程,是一种结合了人工智能与人类智能的编程方式。它旨在利用计算机的高效处理能力和人类的创新思维,提高软件开发的...通过智能化工具和方法,我们可以期待一个更加高效、智能化的编程未来。

    编程语言的发展趋势及未来方向

    该文档是Anders在比利时的TechDays 2010及荷兰DevDays 2010分别进行了一场演讲,阐述了他眼中对于编程语言的发展趋势及未来方向,本文便对他的观点进行了总结。需要的可以下载使用~不方便,请下方留言!

    汇编编程环境——未来汇编

    【标题】"汇编编程环境——未来汇编" 指的是一个专为汇编语言编程设计的集成开发环境(Integrated Development Environment, IDE),被称为"未来汇编"。这款工具以其出色的性能、易用性和良好的版本兼容性而受到用户...

    编程教育:未来已来, 将至已至.pdf

    报告中预测未来几年软件编程行业会保持高速增长的势头,到2023年预计市场规模将接近千亿元人民币。这表明编程教育相较于传统的英语、思维、音体美等素质教育产品来说,属于新兴的、增长迅速的领域。 编程教育的增长...

    未来汇编编程工具

    【标题】"未来汇编编程工具"所指的是一款专为汇编语言编程设计的工具,它可能提供了高效、易用的环境,帮助程序员更好地编写和调试汇编代码。汇编语言是一种低级编程语言,它与计算机硬件的指令集紧密对应,允许...

    (完整word)编程语言未来的发展趋势-最终版.doc

    编程语言未来的发展趋势 本文主要探讨了编程语言未来的发展趋势,从计算机语言的发展史、计算机语言的分类、编程语言未来的发展方向预测等多方面进行了分析和预测。 首先,本文对计算机语言的发展史进行了回顾,从...

    未来汇编 强大的编程软件

    《未来汇编:强大的编程软件探索》 在编程领域,汇编语言作为一种底层的语言,它直接对应于机器指令,对于理解和优化计算机系统的工作原理至关重要。本文将深入探讨一款名为“未来汇编”的软件,该软件以其高效、...

    scratch编程-未来城市讲义.pdf

    scratch编程-未来城市讲义.pdf

    少儿python编程教学 少儿编程python授课ppt

    总的来说,"少儿Python编程教学 少儿编程python授课ppt"是一个全面而有趣的课程,旨在以生动有趣的方式,激发孩子们对编程的兴趣,培养他们的计算思维,为未来的学习和发展奠定坚实的基础。通过这份少儿Python编程...

    编程猫:孩子们写的编程入门书.pptx

    这种能力不仅对他们的未来学习和工作有益,还有助于提高他们的创造力和创新能力。 《编程猫:孩子们写的编程入门书》是一本非常有趣、生动、实用和富有启发性的编程入门书。它通过有趣的猫形象和生动的故事情节,...

    GoC编程图形化c++编程电脑版安装包

    10. **更新与升级**: 虽然当前版本没有新版本,但关注官方渠道或开发者社区,可能会发现未来的更新或替代软件,以获取更好的功能和安全改进。 总结,GoC编程图形化C++编程电脑版安装包是一个适合初学者的编程工具,...

    斯坦福大学编程范式资源

    编程范式是编程领域中的核心概念,它定义了如何组织代码和解决问题的基本方式。斯坦福大学的编程范式课程提供了...通过系统地学习和实践,学生可以提升代码质量,提高编程效率,并为未来的软件开发工作打下坚实的基础。

    Python高级编程和异步IO并发编程

    理解事件循环、任务、回调和未来对象的概念,以及如何避免回调地狱,将使你在编写高性能网络服务时游刃有余。 在"AdvancePython-master"这个资源中,你可能找到这些主题的源码示例,通过实践学习,加深对Python高级...

    scratch编程-未来城市1重难点.pdf

    scratch编程-未来城市1重难点.pdf

    少儿编程Python课件

    通过这套少儿编程Python课件的学习,孩子们不仅可以掌握Python的基本语法,还能培养解决问题的逻辑思维能力,为未来深入学习计算机科学打下坚实基础。同时,"范文/模板/素材"的标签提示,意味着课件中可能包含了大量...

Global site tag (gtag.js) - Google Analytics