再论计算机语言

        工作以后,技术上还是学到了很多东西,改变了很多观念。

        曾经认为,对于计算机软件来说,算法和数据结构无所不能,但现在更感觉在含有诸多限制的嵌入式系统中,软硬件的合理分工,系统的合理架构对于性能的影响更大。

        也曾经认为,重要的是语言后面的思想,语言本身无关紧要,但实际上,逐渐发现,语言就是程序员的工具,就好像木匠的刀、斧、锯、刨,各有其妙用,是手臂的延伸,绝非可有可无。

        对于程序员来说,语言也是如此,语言不仅仅是一个实现工具,它更会影响使用者的思维方式以及表达思维的方式。糟糕的语言设计、糟糕的教育都会对语言的使用者在问题分析,方案设计设计和表达方面造成极大的负面影响。

       手里拿着锤子,看到什么都是钉子。语言是思维的工具,因此也必然会限制使用者表达思维的内容。这就好比使用平面直角坐标系可以简洁明了的表示一根直线,而使用球面坐标系更适合表达一个球。因此现在就经常看到诸如《C缺陷与陷阱》,《C++批判》之类大师们反思语言缺陷性的文章。遗憾的是,很多语言相关的书籍只是关注于语言语法的细致末节,而对于如何把语言作为媒介进行清晰、优雅的表达却很少提及,甚至一些被公认的经典、热销书籍也是如此。C++之父Bjarne Stroustrup在很多文章和访谈中都有提及关于C++教育方面的问题,并且亲自编辑了一套The C++ In-Depth Series。想要学习C++的朋友可以这个系列为蓝本,逐步深入学习。

        Eric Raymond就建议学习Python,Java,C,Perl和 LISP这几种语言,认为"它们还代表了截然不同的编程思路和方法,每种都会让你受益非浅","你需要学会如何以一个通用的方法思考编程问题,独立于任何语言"

       C语言很灵活但是对数据的抽象处理不够。C++够强大也灵活了吧?它学习了C的灵活和高效以及Simula的抽象数据能力。可是C++的面向对象机制比不上Java。而当你学了Lisp以后你会发现原来程序还可以这样编,虽然C++也号称可扩展性,但Lisp的扩展性是C++所不能及的。Java确实很优秀,适合分布式计算,但Java太安全了,而且移植性太好了,因为它为了安全牺牲了很多灵活性和效率。

       尤其是LISP语言,自底向上设计(bottom-up design),改变语言,使之适合于要解决的问题,那么的优美,让人耳目一新。

       下文摘自邓辉兄翻译的《自底向上设计》一文,不为别的,光是这幅愿景,就已经值得去学这门语言了。
        有经验的Lisp程序员却以一种不同的方式来分割他们的程序。和自顶向下设计对应,他们称之为自底向上设计(bottom-up design):改变语言,使之适合于要解决的问题。在Lisp中,你不是仅仅用语言来编写程序,同时你还要对语言进行增进,使之更加适用于你的程序。在你编写程序时,你会这么想:“我希望Lisp具有某某操作符。”于是你就去把它编写出来。然后,你发现使用这样一个新的操作符会简化程序其他部分的设计。语言和程序在一起演化。就像是位于两个处在战争状态国家的边界一样,语言和程序之间的边界线不断地重新划分,直到最后停留在山川、河流区域――最适合于你的问题的一个自然边界。最后,你的程序看上去就像是使用专门为它设计的语言编写的。当语言和程序相互非常匹配时,代码也会变得更加的清晰、短小、高效。

         总之,语言都有最擅长的领域和不足的地方,没有一种语言真正通用。而且往往针对实际问题,解决方案并不是只有一种可能,或者这个问题的解决可能分若干个子系统,而不同部分可以使用不同的方法。就以Emacs为例。Emacs的底层代码是C写的而上层代码却是Lisp。这也是进来,为何perl,tcl等"粘合型"的脚本语言大行其道的原因。

       话说到这里,不禁又回到了一个我推崇备至的一个词——pragmatic

       你不应该局限与任何特定的技术,而是应该拥有足够广博的背景和经验基础,以让你能在特定情况下选择好的解决方案。你的背景源自对计算机科学的基本原理的理解,而你的经验来自广泛的实际项目。理论和实践的结合使你强大起来

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值