《七周七语言》书评

出版日期:2012-5-8
ISBN:9787115276110
作者:Bruce A.Tate
页数:246页

学语言其实不是这么学

感谢图灵给了我试读这本书的机会,也抱歉这本书评一直拖到现在,过程远远超过了七周,可是我觉得这本书也许叫做七天七语言来的更合适,也更有噱头。我是一个语言爱好者,我喜欢看各种冷门语言,从中学习他的语法精髓,曼妙之处,并且试着去理解它的设计和编程思想。在读这本书之前,对一些语言就有一些了解,例如本书的Ruby ,Io , Erlang和Scala,所以其实书看的还是很快的。大概一个语言一两天就看完了。书的翻译很不错,基本没有遇到什么理解的障碍。但是在我看来本书的内容并非足够恰当,其实大部分人工作只能用到一两门语言,大脑也没办法(至少从我的自身情况来说是这样的)存储过多的语言细节,但是本书还是稍微的过多纠缠于语法细节,而在编程思想上鲜有提及,并且缺乏语言之间的横向对比,只是浅显地说了下该语言的优点和缺点,但是这样简单优点和缺点的理由是不足以为读者作出业务场景语言选择的理由的。但是无论如何,我认为作为一个IT从业者,仅仅把思想上局限在同一个语言上是一定会受到发展瓶颈的,这本七周七语言还是推荐给所有程序员来读....

编程模型就好比地基,地基不好很难往上建

书写得很一般,分享一下心得:学编程就好比学游泳,不下水是学不会的。掌握新的技能,不要先想着独立解决什么问题,而是先重复一下前人做过的东西。简而言之:先模仿,再创新。Io语言基于对象和消息。万事皆消息,万物皆对象,消息和对象构成了万事万物。btw,用在并发中,与Erlang有一拼。Prolog语言强调逻辑,一个深度优先搜索的决策树,基于数据库,(阐述)事实,(制定)规则,(执行)查询。不喜欢这种非黑即白的想法,过分注重逻辑的东西,从另一个角度看,就是过分忽略非逻辑的东西。Erlang语言的并发和容错实在太强大了,它的针对性也非常强——爱立信的通讯产品,不知道这种很强的针对性用在其他方向会不会有些约束自己的“手脚”,因而希望往后缩一缩?Haskell成也纯函数语言,败也纯函数语言,拒绝命令式编程的想法,使其不够灵活,加之类型系统,使其有些累赘,不懂得妥协。编程模型(编程范式)有很多种:面向过程编程、面向对象编程、原型编程(OOP的子集)、约束-逻辑编程、函数式编程etc,每过一些年,都会有新的编程模型冒出来,现在的编程模型可能还嫩着呢,Io和Erlang的某些思想(如消息传递、事件触发、局部崩溃)算比较前卫的了。btw,最近了解一种叫Occam的语言,基于一种叫transputer的芯片,不同于Intel芯片,将某些语言在并发上的软件思想硬件化,使其具有无法比拟的优势。

很适合扩展视野(当当书评)

开始还以为是单纯介绍基本语法然后扯两个例子就算一门语言,看了众多好评之后决定买了,结果真心满意,适合扩展视野。。。而且此次购物更是一天内送达,从未如此爽过。------------------------------------------------------------------------------------书不厚,但写的很有针对性,也可以开开眼界。------------------------------------------------------------------------------------可以来满足下自己,了解多种脚本语言,你会发现,那你会喜欢其中几种------------------------------------------------------------------------------------学习一种编程语言,不在于一定要去使用,可以是我们从不同的视角去了解编程这档事!------------------------------------------------------------------------------------简单了解这几种语言可以,具体没什么细节内容,就是范范的了解一下区别,想找一门学学之前,可以先比较一下差异------------------------------------------------------------------------------------这是一本开拓眼界的好书,里面介绍了不同的编程范式,这些语言的范式会对我们现有的思维产生影响。

向美好的编程思想致敬

本来是在准备一个讲义的时候,拿过来参考Erlang和Haskell里面的语法和内容的,结果越看越兴奋,看完以后,激动的久久不能入睡。前面有一位书友说是这本书点子不错,缺乏洞见,看到这位书友本身对于这几门语言已经比较熟悉了,所以提出各门语言的特征讲得不深入。但我个人而言,由于以前除了ruby和lisp以外,都没有接触过,初读之下,在除去语法的外衣以后,接触到的“那些真正重要内容的部分”,有一种很多年前初学编程的那种兴奋,原来除了平常习惯使用的各中螺丝刀、板手以后,还有这样一些稀奇古怪的小工具,可以用在很多奇怪的地方。关于书的内容,作者在第一章里面超越语法、不是安装指南、不是编程参考在这三点,至少后两点做很好,个人觉得第一点也蛮好,至少先有介绍才后有超越。最后简单介绍一下书中最让我兴奋的地方,学习编程十多年来,接触过的语言很多,虽然没有某个神贴里面lz说得精通30种语言。但是对于从机器语言、汇编语言、C语言、批处理语言、面向对象语言、脚本语言,这些类语言都有一定的了解。这本书虽然介绍了四种编程模型:面向对象、原型编程、约束-逻辑编程、函数式编程,其中大头是函数式编程(从Ruby的涉及到Scala、Erlang、Clojure,最后到纯粹的Haskell),里面大量提到了列表和高阶函数上的有趣玩意。实际我们回过头看这些语言的发展,实际上从脱离了汇编语言进入自然语言算起,整个语言发展历史就走向了两个大块,一种是以命令和操作直到发展到面向对象构建的一整套关于程序设计的方法论,至今在TOIBE上在前十名中占据主要席位的C、C++、Java、Object-C、C#,另外也是从六七十年代开始的一种学院派的语言路线,以体现数据函数思想以特点,从Lisp、Prolog等,到后来出现的混搭python、ruby,强调一切都是函数,无副作用性。至少从目前应用来看,是属于小众语言(python和ruby的流行不是由于其中的函数式部分)。其实就编程的思想美好性来说,后一派更简洁、更优雅、更漂亮大方,对于同样的问题,有更丰富的表达方式,通过语言更短小精悍,简言之,更阳春白雪。但是,正如美好的艺术一样,确实不容易理解!也就导致同样经过几十年的发展,只能是在一个小的圈子里面有些应用。正如一个老师上课是时候曾经讲过的一样,这个思想如果进一步发展到Z语言所描述的情况的话,估计人类的编程史会发生巨大的变化。个人观点,就语言而言,没有好坏,没有对错,只是工具。就这本书而言,介绍了一些很漂亮的编程思想,在这里,向无数前辈们为了探索编程(每个少年年轻时都经历过的梦幻传奇)而贡献的人类无差别的美好思想再次致敬!

七段旅程,一场波澜

合上书,五味杂陈。期间旅程,有因顿悟而欣喜,有因迷茫而忧郁,有因好奇而憧憬,有因晦涩而烦躁,有因好恶而斥责,有因困惑而愤怒……各色滋味聚上心头,汇成一股七彩斑斓的钦佩。## 欣喜看到那十四行诗般的罗马数字DSL,不由惊叹method_missing还可以这么用。最早是在Peter Cooper那个神奇的200行自顶向下递归解析器里隐约感受过它的魅力,可没想到竟能如此简洁地重现。见过Io的Singleton实现才深切地体会到世界可以如此简单。从Ruby到Io,再到Clojure,当重写unless的例子再度出现,那一瞬间,我顿悟。宏,这个不可捉摸的神秘概念竟是如此简单,这就是执行之前所做的文本替换啊!还有那两句判断八皇后是否同对角线的Prolog断言,诡异的加减背后竟是极简的斜率公式。……那遍地的宝藏,有时带给我惊喜,有时却是入宝山空手回的遗憾。## 抑郁Ruby的继承图啊,多少次让我不成眠,魂梦牵。Io啊,你家的if/then/else到底是方法还是语法糖?你手下的call一族究竟是何方神圣?Clojure的解构啊,表里如一的你对待map的方式为何如此不同?Haskell啊,你竟如此残忍,刚抛出甘甜的语法糖,让我回想起Lisp的美好,紧接着就打开monad的魔盒,把我推进绝望的深渊。并发啊,你那STM、actor、future十八般大招招招要我肝肠寸断。……坑。蜜月之后是爱情的坟墓,清新的语法身后是逻辑的巨坑!## 憧憬虽然Io的语法让我万分纠结,但是我还是久久不能对她的简洁释怀。我真心觉得可以读懂她,真心希望见到那传说中寥寥数笔实现C子集的40行真经。我还憧憬见到更多的宏,让我更全面、更深入地揭开她的神秘。## 愤怒我将自己的健忘迁怒于Bruce的惜字如金,虽然你在Prolog的第一天第一节的第一段里就明明白白地写上了“以大写开头的词为变量”,但我还是瞬间忘记,长久地纠结What、Who是不是关键词。还有译者们,我知道翻译遍尝百草的辛苦,更深知遍尝百草却不得解的痛苦。但仍然抑制不住我对把“等价推断”译为“合一”的愤怒。好吧,其实我反感的是那些生搬硬套的直译。可这也是因为我对这本书过分怜爱,过分苛求。## ……## 我心中的她首先,我必须斥责Scala、Clojure,这俩Java家的私生子,口是心非的混蛋,口口声声述说着自己如何如何乖巧可人,背地里干着恬不知耻的勾当,还联起手来败坏Prolog的名声,人家可才是真真正正的直爽汉子呐!至于Io和Haskell,我不得不承认,她俩散发着一股Lisp家特有的高贵,一双直白却深邃的眼睛望得我丢魂。她们也许是命运里的女神,却不能是生活中的爱人。所以,抛开弯直不谈,我心中的她还是留给了Miss. Ruby。我曾找了好久去找一个词来形容Ruby的美妙,终于我找到了——善解人意。不管你把代码写成什么烂样,她都竭尽全力去理解你,包容你。是的,她有一些怪癖,可一旦你近距离的接触过,那些怪癖却变成了妖娆的魅力。好了,潘多拉的魔盒已经开启,享受这份痛苦吧。

书看完了,学习才刚开始

这不是一本教我每种语言写一个Hellow World的书,虽然只有不到三百页,还是尽力展现了每种语言的特质。因为只有很短的篇幅,又要介绍很酷的语言特性,这本书采用和不同的叙述方法,基本不会介绍语法的全貌,而是通过自己语言的特性和相邻语言的关联性,来直击要害。我感觉这种方法非常有趣,但同时对作者、译者和读者都是种挑战,当然,几种语言互相联系其实也有助于理解一些概念。不过,我觉得如果读者有几种语言的一些初步了解,或者对函数式编程有点了解的话,还是会容易读一些,否则,曲线就比较陡了。这本书的另一个要点是,书看完了,学习才刚开始。这本书向读者展示了语言最酷的地方,让读者决定是不是喜欢或需要这门语言,但要想真正掌握一种语言,必须要进一步学习很多知识PS: 从前没学过 Haskell 的孩纸表示,monad 真心没懂,

终成经典(当当评价)

计算机语言,在当下社会的很多热血青年的喊叫声、嘲笑声与愤怒声中,一次次地被功利的比来比去,却很少有热血青年能正确的使用、改造、甚至哪怕是思考这些历史沉淀,借这本书应该可以退却一些固有的偏见,还原到计算机语言的本质,从历史大背景中来思考创新与传承。仔细研读这本书理应可以提高编码的素养,甚至从此重新找回编码的乐趣。

《七周七语言》电影整理

“与其说这是项目组,不如说是以机械化方式生产软件的工厂。那时的我,就好比某个酷爱电影的家伙,却居住于偏远小镇,镇上只有一家影院,放的还都是些所谓的‘大片’。直到我自立门户,开始自己生产软件时,我才真正领略到独立电影之妙。就像独立电影不断推动电影业发展那样,这些新兴的编程语言也在改变我们的组织以及编写程序的思维方式。”“其实,拍电影的乐趣就在于把自己的经历和体验融入到演员、场地、外景之中,让它们来讲述你想要讲述的故事。你所做的一切都是为了取悦观众。你知道的越多,拍出来的电影也就越精彩。我们需要以同样方式思考编程。” 豆列:http://movie.douban.com/doulist/1574646/《追忆似水年华》/ Le temps retrouvé, d'après l'oeuvre de Marcel Prousthttp://movie.douban.com/subject/1301670/“今后我们招募的程序员,一定得通读过《追忆似水年华》。——选自未完成的《How Proust Can Make You a Better Programmer》”《欢乐满人间》/ Mary Poppinshttp://movie.douban.com/subject/1292658/“Mary Poppins从家务中寻找乐趣,以责任感唤起热情,做起家务来自然事半功倍。Ruby所做的也同样如此,但它用的不是食用糖,而是语法糖。”《春天不是读书天》/ Ferris Bueller's Day Offhttp://movie.douban.com/subject/1295437/“但过了两三周之后,我居然像未经世事的少女一般,一想到Io将带我体验怎样的奇妙之旅,就会情不自禁地低声轻笑起来。这就像Ferris在新闻上、在棒球场中、在花车游行时频频曝光—总会在你意想不到的地方出现。说到底,我真真切切地通过Io,体验到了我想要的感觉—用一门语言改变自己思维方式的感觉。”《雨人》/ Rain Manhttp://movie.douban.com/subject/1291870/“《雨人》中我最喜欢的是当Raymond的弟弟意识到Raymond可以算牌的那一幕。Raymond和他的弟弟去了拉斯维加斯并在赌城里面大赚特赚。在一节中,你将看到Prolog让你开心的一面。”《人民法官》/ The People's Courthttp://movie.douban.com/subject/2073880/“和多数自闭症患者一样,Raymond痴迷所有熟悉的失误。他缠着要看Wapner法官和The People's Court。今天,一定有“离Wapner法官开演还有15分钟”的时刻,坐好,我们的工具箱里还需要一些工具,你将学到如何使用递归和列表进行数学运算。”《剪刀手爱德华》/ Edward Scissorhandshttp://movie.douban.com/subject/1292370/“在《剪刀手爱德华》中,山丘上有一座看上去有些不同的城堡。在过去,这个城堡是一个神秘且迷人的地方,不过现在它却显得年代久远且荒废失修。面向对象编程范型同样也显示出了一些衰败的迹象,特别是早期实现的面向对象语言。”《王牌大贱谍》/ Austin Powers: International Man of Mysteryhttp://movie.douban.com/subject/1292493/“如果说可变状态是王牌大贱谍的话,那并发就好比邪恶博士。”《黑客帝国》/ The Matrixhttp://movie.douban.com/subject/1291843/“如今我们所在的整个编程行业,都在大把大把地吞食蓝药丸,就好像来到阿姆斯特丹的牧师之子一样:并发不好用,于是我们就尽量避免它。”《黑客帝国3:矩阵革命》/ The Matrix Revolutionshttp://movie.douban.com/subject/1302467/“也就是说,字符串其实是个列表,这就好像特工Smith冲着你母亲哈哈大笑,哎,真粗鲁,前面的2+2.0这行代码,说明Erlang可以做一些基本类型强制转换。”《星球大战2:帝国反击战》/ Star Wars: Episode V - The Empire Strikes Backhttp://movie.douban.com/subject/1296528/“他总是用倒装语序说话,但却意味高深,就像Lisp的语法不过是一些括号和符号。”《星际旅行:原初 第二季》/ Star Trek:The Original Series Season 2 http://movie.douban.com/subject/6772952/“Spock拥有一种特殊的能力,他可以使用一种被他称为心灵融合(mind meld)的能力与某个人建立连接,Haskell爱好者们经常声称他们与Haskell语言间存在这种连接。对许多人来说,对他们影响力最大的语言特性就是类型系统。”

必须阅读,但又浅尝辄止~

作者从ruby开始,给大家带来了7盘小菜,说实话,如果你未曾接触过其中的语言,都会让你看的一头雾水,当然你要是有一打语言的经验,或者自己亲自设计过语言(命令式,OO,原型,FP),那你应该会有更多的体会。对于作者的一些跟各种语言设计师的对话,从中你能得到每种语言的优势和不足,每种语言的诞生环境和设计意图等等,这些在我看来是最有价值的。这本书的定位很奇怪,绝不是无经验的编码人员,至少你已经混迹和使用过3门以上的语言,可绝不是一种范式的语言哦(oo,fp,etc.),如果没有这些理解力,很难了解到作者在说什么。说实话,这本书不适合一下子读完,因为要了解一种语言绝非一周就能学精的,有些人读完恐怕会说,这些小把戏私下玩玩还行,用到生产环境中还是省省吧。额额额,我只能说这本书压根你不该看,何必自讨没趣~这本书还是值得一读,但别相信7周就能理解7种语言,╮(╯▽╰)╭,怎么感觉像是在说21天学会C++,这是个噱头,除非你会穿越~下面是自己的一些话痨:为什么那么多人吐槽Erlang的语法,我怎么就觉得简洁的不得了,多么优美的设计,这就是一个个人习惯问题。克罗尔的STM,的确是个很不错的设计,但目前我更推崇厄兰的多进程模式,就让他崩溃的做法,这是个逆设计,厄兰给我们的是一个世界。Clojure,她可以不浪费你之前在Java上的投资,有时候我也在想Scala是不是学起来更简单,的确,Clojure设计的函数式体系异常庞大,到目前为止我还不能自己主导设计一种框架,实在是很悲哀,连从哪方面入手都很困难,因为Clojure给你的解决方式实在太多了,你学了太多,却不知道那种是最合适的,待我想要用Scala还是Clojure的时候,我还是决定选择Clojure,因为Scala的好多项目还是在用OO,让人不得其解,脚踏两只船的感觉很不好啊。

没有传说得那么好, 可能因为我java用太多了

不够聪明, 所以理解不了lisp及其方言.看完之后对一些新兴的语言有了解, 不过也仅限于了解. 真的想熟悉一门语言, 还是要亲自动手开发一个项目才行.帮助程序员拓宽一下知识面吧, 但谈不上有帮助. 可能还是因为不够聪明...

带您走进七周七语言的世界

编者按在本文中,截选了七门各不相同的语言的概况,这七门语言,无论教还是学,对我们而言都是一个宏伟目标。书中的代码足以深刻阐释每一门语言的精髓。这七门语言都有非常优秀的支持社区,这也是我选择它们的原因之一。本书为你铺就的学习途径......第一周:Ruby有糖相伴好下药。——Mary Poppins松本行弘(Yukihiro Matsumoto)大约在1993年发明了Ruby,大家多称他为Matz。从语言的角度看,Ruby出身于所谓的脚本语言家族,是一种解释型、面向对象、动态类型的语言。解释型,意味着Ruby代码由解释器而非编译器执行。动态类型,意味着类型在运行时而非编译时绑定。从这两方面看,Ruby采取的策略是在灵活性和运行时安全之间寻找平衡点,我们稍后还会深入讨论这一点。面向对象,意味着Ruby支持封装(把数据和行为一起打包)、类继承(用一棵类树来组织对象类型)、多态(对象可表现为多种形式)等特性。Ruby多年来一直默默蛰伏,只为等待一个恰当的出现时机。终于,随着Rails框架崭露头角,Ruby也在2006年前后一鸣惊人。在企业开发的丛林中跋涉了十年之后,Ruby指引人们重新找回了编程乐趣。尽管从执行速度上说,Ruby谈不上有多高效,但它却能让程序员的编程效率大幅提高。关于Ruby、关于松本行弘请参见松本行弘的程序世界第二周:Io问题不是“我们要干点儿什么”而是“我们有什么不能干”。——Ferris BuellerIo和Ruby一样,Io懂得变通,行事不拘小节。他血气方刚、聪明过人,想了解他不难,想猜透他要做什么可就难了,活脱一个Ferris Bueller 。如果你愿意享受喧嚣热闹的狂欢,跟着Io逛逛绝对没错,他什么都会带你尝试一遍。和他在一起,你可能会有最美妙刺激的体验,但你老爸的车也可能变成一堆废铜烂铁。不过,无论发生什么,你都决不会无聊。正如本页最上方Ferris所说,没那么多清规戒律束手束脚。第三周:PrologProlog这门语言有时特别聪明,有时又特别令人失望。只有当你知道如何提问时,你才会得到令人惊奇的答案。回想一下《雨人》 这部电影。我还记得片中的主角Raymond,他在前一晚读过一本电话簿后便可以背出Sally Dibbs的电话号码,而他当时翻电话簿的时候根本没有考虑是否需要记住这个号码。对于Raymond和Prolog,我经常问出这样两个分量等同的问题,“他是怎么知道的?”和“他怎么不知道?”。只要你能以正确的方式表达你的问题,那么他将是一个知识源泉。Prolog与前两章谈到的编程语言有较大的不同。Io和Ruby被称为命令式语言(imperative language)。命令式语言就像是一本烹饪食谱,你需要精确地告诉计算机如何去完成一项工作。更高级别的命令式语言可能会给你带来更多杠杆效力,即将多个比较长的步骤合并为一个步骤。不过从根本上说,你其实是在列出原料的购物清单,并描述烤蛋糕的详细步骤。第四周:Scala我们不是绵羊。——剪刀手 EdwardScala可以说是一个科学怪人,但却不是一个怪物。想一想《剪刀手爱德华》 这部电影。随着对计算机程序的需求越来越复杂,计算机语言也在发展演化。每隔20年左右,老的编程范型就会变得不足以应对一些组织和表达思想的新要求。新的范型必定会涌现出来,但这并不是一个简单的过程。每个新的编程范型都会引入一批编程语言,而不仅仅只是一种语言。最初的语言往往具有惊人的生命力,但也很不实用。比如面向对象编程语言Smalltalk或者函数式编程语言Lisp。接下来,其他范型的语言会加入一些新特性,允许开发人员在采用新概念的同时也可以安全地使用原先的老范型。例如Ada语言,它能够在过程式语言中使用一些面向对象的核心思想,比如封装。某些时候,一些混合语言恰恰是搭建在新老范型之间的一座实用的桥梁,比如C++。紧接着,你将看到一些可用于商业应用的编程语言,比如Java或C#。最后,你才会看到新范型的一些成熟且完整的实现。Scala与Java的密切关系Scala至少可以作为一座桥梁,也许还不仅如此。它与Java紧密集成,为人们提供了一个保护投资的机会,这体现在以下几个方面。Scala运行在Java虚拟机上,这使得Scala可以和现存的应用同时运行。Scala可以直接使用Java类库,使得开发人员可以利用现有的框架和遗留代码。Scala和Java一样都是静态类型语言,因此两种语言遵循一样的编程哲学。Scala的语法与Java比较接近,使得开发人员可以快速掌握语言基础。Scala既支持面向对象范型也支持函数式编程范型,这样开发人员就可以逐步在代码中运用函数式编程的思想。第五周:Erlang似Erlang这般充满神秘感的语言寥寥无几。这门并发语言既可将难事化易,也可将易事变难。在健壮企业部署方面,它的虚拟机BEAM是唯一堪与Java虚拟机匹敌的对手。它调用起来十分高效,甚至效率以外的东西它都很少考虑。因此,它的语法也不像Ruby那样优雅和简洁。Erlang其名,乍听之下很怪。但你若知道,它既是Ericsson Language的缩写,又恰是一位丹麦数学家的大名,你就不会再抱怨“这什么破名儿”了。作为电话网络分析的数学奠基人,Agner Karup Erlang 可称得上是赫赫有名。1986年,Joe Armstrong在爱立信公司(Ericsson)开发了Erlang语言的首个版本。随后的五年间,Erlang在他的精心雕琢下日渐完善。20世纪90年代整整十年间,Erlang的发展都不温不火、时断时续,但到了2000年之后,它却开始成为众人瞩目的焦点。两个广受欢迎的云数据库CouchDB和SimpleDB,都是用Erlang开发出来的,此外,Erlang还是Facebook的聊天系统所采用的语言。正因为Erlang身怀可伸缩并发性和可靠性这两项拿手绝技,而其他语言在这两方面都力不从心,所以Erlang开始越来越多地成为人们谈论的话题。第六周:Clojure做或不做,不要尝试。 ——Yoda(尤达大师)Clojure是JVM上的Lisp实现。Lisp复杂强大,是计算机领域里最早和最新的编程语言之一。许多Lisp方言都曾尝试挤进主流语言的行列,却都无功而返。即便是对今天的开发者而言,其语法和编程模型也有些难以消化。即便如此,Lisp的特质仍叫人禁不住去重温,去回味,新的方言层出不穷,一些编程领域最好的院校也用Lisp语言来帮助学生们塑造创新、开放的思维方式。从很多方面来看,Clojure就像是睿智的功夫大师,神隐山脉的先知或是高深莫测的绝地师父。想想Yoda。在《星球大战系列之五:帝国反击战》 中,Yoda是一位小巧、可爱的配角。他总是使用“倒装”语序说话,但却意味高深 ,就像Lisp所使用的前缀表示法(相信过一会儿你就会明白)。他小巧到难以辨别,就像Lisp的语法不过是一些括号和符号。但是和Yoda一样,它绝非看上去那么简单。Yoda和Lisp年岁都很高,拥有的智慧(例如开头的引语)经过时间磨砺与烈火考验。Lisp宏和高阶编程单元如同Yoda掌握的内在原力,看似无人能掌控。从许多角度讲, Lisp开创了一切。在深入Clojure之前,让我们先来谈谈Lisp,然后再来了解Clojure的激动人心之处。第七周:Haskell逻辑是草地上几只吱吱作声的小鸟在鸣叫。 ——Spock对于很多函数式编程的忠实拥趸来说,Haskell 象征着纯洁和自由。它的功能丰富且强大,但拥有这些功能是需要付出一定代价的。你不可能轻易地就掌握这门语言,因为Haskell 会迫使你去了解关于函数式编程的全部内容。想想《星际迷航》的Spock吧,他上面说的那句话 很有代表性,完美地结合了逻辑和真理。他性格中拥有的那种坚定的纯洁性,这使他得到了几代人的爱戴。当Scala、Erlang和Clojure还允许你少量使用命令式编程概念的时候,Haskell却没有留下任何的回旋余地。在使用Haskell做I/O操作或状态累积(accumulate state)时,你将遇到这门纯函数语言所带来的挑战。和以往一样,如果想了解一门语言为何包含那些妥协方案,就应该从它的历史开始。在20世纪80年代中前期,纯函数编程领域涌现出了多门语言。纯函数式编程和我们曾在Clojure语言中见到过的惰性处理(lazy processing)等关键概念引领着新研究的方向。1987 年的“函数式编程语言与计算机体系结构大会”(Functional Programming Languages and Computer Architecture)成立了一个小组,决定建立一个关于纯函数编程语言的开放标准。Haskell就出自于这个小组,它于1990年诞生并于1998年重新修订。目前的标准是Haskell 98,经过多次修订,包括一份Haskell 98 标准的修订版和一个称为Haskell Prime的新版本定义。因此,Haskell是一门从开始就按照纯函数式编程思想构建的语言,它结合了一些最好的函数式语言思想,并着重于支持惰性处理。和Scala一样,Haskell也是一门强类型定义的静态类型语言。它的类型模型基于推断理论(inferred)并被公认为是函数语言中最高效的类型系统之一。你会发现该类型系统支持多态语义并有助于人们作出十分整洁清晰的设计。

推荐

书中的每一种语言都有各自的特色,每一中语言代表着一种编程范式。知晓这些语言,了解和理解这些语言所蕴含的知识,对于软件开发者而言是非常有必要的。这会开阔他们的眼界、开拓他们的思维,让他们在实际工作中更容易和更愿意去探索解决问题的不同方法。我推荐每一个软件开发人员都来读一读这本书,尤其是从业三年以上的开发人员。

为什么《七周七语言》选中的是这几种语言?

从众多语言中,挑出本书包含的几门语言,这一过程也许不像你想得那么复杂。我们只不过发了些调查问卷,向本书的潜在读者请教了一番。调查数据汇总上来时,有八门语言入选希望最大。不过,我先是把JavaScript“踢”了出去,因为它实在是过于热门了,取而代之的是原型语言中热门程度仅次于JavaScript的Io。随后,我又把Python“踢”了出去,因为我只想给面向对象语言一个名额,而Ruby的票数多于Python。同时,这也给一个出人意料的候选者让出了位置——名单上位列前十的Prolog。下面,我给出成功入围本书的最终名单和挑选它们的理由Ruby。这门面向对象语言高票当选,因为它不仅好用,而且好读。我曾经考虑过不介绍任何一门面向对象语言,但我又想在其他编程范型与面向对象编程之间作一些比较,因此,至少介绍一门面向对象语言还是有必要的。相比于大多数程序员的日常用法,我想把它挖掘得更深入一些,以揭示设计者的良苦用心。我最终决定重点介绍Ruby元编程(metaprogramming),因为它可以扩展Ruby的语法。对于Ruby榜上有名的结果,我还是相当认可的。Io。和Prolog一样,Io也是本书颇具争议的语言。它虽与商业成功无缘,但其兼具简单性和语法一致性的并发结构,却是十分重要的思想。它的最简语法(minimal syntax)功能强大,与Lisp的相似性也颇能给人留下几分印象。Io不仅和JavaScript一样同为原型语言,还有着独一无二、韵味无穷的消息分发机制,因此在众多编程语言之中,它也占有小小的一席之地。Prolog。没错,我知道Prolog年事已高,但它仍然力大无穷。它能轻松解出数独问题,这不禁让我大开眼界。而且用Java或C语言时,有些难题我殚精竭虑方能解决,用它却能干净利落地搞定。承蒙Erlang的发明者Joe Armstrong出手相助,我得以深刻体会到Prolog之妙。同时,也正是深受Prolog影响,Erlang才得以问世。如果你此前从未用过Prolog,我保证,它定会带给你惊喜。Scala。作为运行于Java虚拟机上的新一代语言,Scala为Java系统引入了强大的函数式思想,而且也并未丢弃面向对象编程。回顾历史,我发现C++和它有着惊人的相似之处,因为从过程式编程过渡到面向对象编程期间,C++同样起到了举足轻重的作用。当你真正融入Scala社区之后,你就会明白,为什么对于函数式语言程序员来说,Scala是异端邪说,而对于Java开发者来说,Scala是天降福音。Erlang。作为名单上历史最悠久的语言之一,Erlang不仅是一门函数式语言,而且在并发、分布式编程、容错等诸多方面都有着优异表现,真是想不火都难。CouchDB(新兴的基于云的数据库)的创始人就选择了Erlang,并且义无反顾地一直用它,只要花上点时间了解这门分布式语言,你就会明白原因所在。在Erlang帮助下,设计带有并发、分布式、容错等特征的应用程序将变得无比简单。Clojure。这又是一门Java虚拟机语言,但正是这门Lisp方言,彻底颠覆了我们在Java虚拟机上并发编程的思考方式。它是本书唯一在版本数据库中使用同一种策略管理并发的语言。作为Lisp方言,Clojure或许拥有本书所有语言中最灵活的编程模型,因此绝不缺乏号召力。与其他Lisp方言不同的是,它不会带那么多括号 ,还有众多Java库和在各平台上的广泛部署作为坚强后盾。Haskell。它是本书唯一的纯函数式语言,这也意味着,它根本不存在可变状态:只要使用相同的输入参数调用相同的函数,就会返回相同的输出。在所有强类型语言中,Haskell拥有最令人称羡的类型模型。和Prolog一样,它也需要你花一些时间理解,但你得到的回报绝对物超所值。如果名单上没有你钟爱的语言,我深感抱歉。老实说,还真有语言狂热分子给我发过好几封恐吓信。在本节开始提到的民意调查中,我们总共列出了几十门语言。我挑的这几门语言未必是其中最出色的,但它们特点突出、个性鲜明,都具有重要的学习价值。

没有想象中那么好

知道这本书有一段时间了,感觉应该是本不错的书,但一直没时间看。这个暑假,大体看了一下。书是在网上找到的、别人在图灵社区买的电子书。本想着如果这本书好的话我也买一本的,作为我网购电子书的起点,但这本书看下来感觉并不是很值得去购买。这本书总共介绍了Ruby、Io、Prolog、Scala、Erlang、Clojure、Haskell这七种语言。书的每一章,介绍一个新语言的时候,都会提到一部电影,将这个语言与这个电影的某个人物做类比。介绍具体语言的时候,会从最简单的语法开始讲起,逐步介绍这个语言。虽然名字有“七周”,并且每章中的小节也以“第X天”命名,但一般都知道第三天,让我略感不爽。看这本书,肯定没指望着要真正学会这七种语言。作者当然也明白这一点。不过,作者对每种语言最基本的一些东西都会介绍,如变量特点、运算符特点、结构特点等。而这无非是一个语言自己的定义罢了,多数并没有实际意义或只有跟一些很深层东西结合才有意义。当然,对一个没有接触过这种语言的人来说,或许需要提一下,但是这几乎占了三天中的一天,也就意味着这本书三分之一的篇幅都在讲这些小东西,实在是让人大为恼火。而在第二天,作者一般会介绍一些数组、函数之类的相关语句。其实情况跟上面说的差不多,虽然这些东西可能能体现程序的特点、风格,但这些东西大部分都是“哦,这个方法在这个语言中是这样的”,至少对一个对这个语言认识并不深的人来说很难体会到其中的好处。第三天总该讲些长点的代码了,但写的也并不感觉到十分精彩。恕我愚顿,有些代码还不很能看懂。每小节的最后有一些作者布置的题目,但感觉利用语言去写程序的那些题着实很扯淡。还是那句话,看这本书不是为了写程序,真正要学这门语言、用这门语言写程序肯定不会看这本书。况且,会用不同的语言实现最简单的代码有那么重要吗?这本书没有达到它应该有的效果:让读者从宏观感受到各个语言的不同,而是对细节部分讲的太多。这本书还是有一些地方印象很深的。第一个就是在学数据结构的时候,对串的取头、去尾操作感到很奇怪,因为这个东西压根就用不到。而这本书中介绍的好几种语言,都是有利用串的操作来做一些事情的。而运算符的前缀表示法在当时学的时候也让大家摸不着头脑、感觉莫名其妙,而Clojure这样的Lisp系语言就是用前缀表示的。如果当时讲数据结构相关内容的时候能介绍一下其中一种语言,一定会让大家对串有更直观的了解。还有就是讲Prolog时,确实让我在此震惊:原来写程序还能这样写。上次有这个感觉是在看到用Lingo编程、甚至能解决图论中的一些问题的时候。这本书确实让我对这门语言感兴趣了。不可惜的是,这门语言在国内研究较少,终究是一门小众语言。最后,还是感觉这种书看的必要并不大,还是多关注最基础、最本质的东西,对语法糖什么的不要太在意,需要哪种语言时再去学,毕竟真正热门的语言也就那几种。

開拓下眼界

Bruce A.Tate. 七周七语言[M]. 巨成,戴玮,白明,譯. 人民邮电出版社,2012-5. ISBN 978-7-115-27611-7.Ruby----> Matz: 1993年,當我看到Perl的時候,不知怎麼的,這種混合了Lisp和Smalltalk特徵的面向對象語言讓我的靈感一下子迸發出來。我意識到Perl將成爲一門可提高我們生產力的偉大語言。於是,出於自娛自樂的動機,我着手開發一門與之類似的語言。(p. 9)這讓我想起鳳姐的「Ruby就是沒有到處打廣告的Perl 6」.> Matz: 我喜歡它寓編程於樂的方式。說到某個具體的技術點,我最喜歡的是“代碼塊”(block)。代碼塊即是一種易於控制的高階函數,也爲DSL及其他特性的實現提供了極大的靈活性。(p. 9)這裏Matz說謊了。block很*像*高階函數,但*不是*函數。```ruby->(x){x+3}.call 3```返回6.而```ruby{|x| x + 3}.call 3```將導致`syntax error`.Ruby的祖先Smalltalk中,`block`倒是可以接受消息的:```smalltalk[:x | x + 3] value: 3```返回6.所以Ruby的block是個奇怪的東西。縱向來說,它很像Smalltalk的block,橫向來說,它很像匿名函數。但是事實上,它和兩者都不一樣。Ruby的口號是「Principle of Least Surprise」,但是這個block卻讓我吃驚。語意上塊讓人迷惑,語法上也不好。塊有兩種表達法:大括號或者do...end,問題在於優先級是不同的。例如`f x {|x| puts x}`和`f x do |x| puts x end`是不一樣的,前者等於`f(x {...})`,後者等於`f(x) do...end`。初學的時候很容易搞混。Matz在他寫的《まつもとゆきひろコードの世界 : スーパー・プログラマになる14の思考法》一書中提到了設計塊的緣由:1. 減少對象的生成數,因爲早期Ruby生成閉包對象的代價很高。2. 外觀上看起來像控制結構。Matz還提到,傾向於使用高階函數的OCaml的2239個庫函數,沒用函數參數的佔87.2%,用一個函數參數的佔12.1%,也就是有兩個以上的不到1%。因此,大多數情況下,只能有一個參數的塊也夠用了。所以說,塊就是一個語法糖,讓習慣過程式編程的程序員可以使用類似高階函數的東西(同時讓Smalltalk和Lisp的來客大吃一驚)。> 代碼塊是沒有名字的函數。(p. 20)連以Ruby爲主力語言的人也這麼說…… 匿名函數在哭泣:「block算哪門子函數了?人家纔是沒有名字的函數好不好!」> 使用method_missing (p. 30-31)舉了一個利用`method_missing`實現的羅馬數字轉換爲阿拉伯數字:```rubyclass Romandef self.method_missing name, *argsroman = name.to_sroman.gsub!("IV", "IIII")roman.gsub!("IX", "VIIII")roman.gsub!("XL", "XXXX")roman.gsub!("XC", "LXXXX")(roman.count("I") +roman.count("V") * 5 +roman.count("X") * 10 +roman.count("L") * 50 +roman.count("C") * 100)endend```作者說這個API很簡單:> 對比一下`Roman.i`和`Roman.number_for "i"`就能看出來。 (p. 31)這不是一個好例子。首先,"i"是不行的,因爲代碼邏輯裏沒寫大小寫轉換。其次,如果調用函數的時候使用了`Romain.A`,那又會出現什麼情況?調試起來會很麻煩。相比之下,`Roman.number_for "I"`也很清晰。如果乾脆不使用類, 可以寫成`romanize("I")`,也不錯。Io--Io的語法和語義非常簡約,類似Lisp。創始人解釋了這麼設計的原因。> Steve: 我鍾愛它簡潔一致的語法和語義。這有助於理解代碼做了些什麼。你可以迅速學會這門語言的基礎。我本人的記性不太好,經常忘記C語言的語法和那些古怪的語義規則,因此不得不去查閱它們。而我在使用Io的時候,就不必老惦記這查閱這種事了。(pp. 48-49)> Steve:如果充分簡化語義,它就會更具靈活性。你可以就此創作一些實現這門語言時尚未定義的東西。(p. 49)Prolog------作者舉了一個解數獨的例子:```prologvalid([]).valid([Head|Tail]) :-fd_all_different(Head),valid(Tail).sudoku(Puzzle, Solution) :-Solution = Puzzle,Puzzle = [S11, S12, S13, S14,S21, S22, S23, S24,S31, S32, S33, S34,S41, S42, S43, S44],fd_domain(Solution, 1, 4),Row1 = [S11, S12, S13, S14],Row2 = [S21, S22, S23, S24],Row3 = [S31, S32, S33, S34],Row4 = [S41, S42, S43, S44],Col1 = [S11, S21, S31, S41],Col2 = [S12, S22, S32, S42],Col3 = [S13, S23, S33, S43],Col4 = [S14, S24, S34, S44],Square1 = [S11, S12, S21, S22],Square2 = [S13, S14, S23, S24],Square3 = [S31, S32, S41, S42],Square4 = [S33, S34, S43, S44],valid([Row1, Row2, Row3, Row4,Col1, Col2, Col3, Col4,Square1, Square2, Square3, Square4]).```然後說:> 程序在哪裏?我們沒有編寫什麼程序。我們只是描述了這個遊戲的規則。(p. 91)感覺這個例子並沒有體現邏輯編程的威力。如果用函數式的方法來寫,一樣用不了多少行,也只需要描述下規則。Scala-----從作者的介紹中沒看到Scala的特色——給我的感覺是,Scala之於Java,類似CoffeeScript之於JavaScrip,只不過和CoffeeScript相比,Scale是靜態類型的,而且抄了更多函數式編程語言的東西,語法也複雜得多。Erlang------> Erlang還有一些別的古怪之處,比如說,符合條件的數字數組會顯示爲字符串。(p. 169)作者說的其他Erlang的缺點我覺得都不算什麼缺點,但是這個真的是……用數字字符……還有Erlang孱弱的字符串處理能力。其實Erlang還有一些奇怪的地方。比如在shell裏無法輸入函數定義,因爲Erlang裏模塊是FORM,而FORM不是EXPRESSION。所以在shell裏只能用匿名函數(這個是表達式)。```erlangdouble(X) -> 2*X. // FORMDouble = fun(X) -> 2*X end. //EXPRESSION```畢竟Erlang已經算古老的語言了,爲了維持向後兼容,一些不太好的設計也只好保留下來了。[elixir](http://elixir-lang.org/)是基於EVM的語言,吸收了Ruby的一些東西。Clojure-------> 要調整適應前綴表達法並不容易。它需要更好的記憶力,並且要求開發者有內向外地理解代碼,而不是由外向內。有時,我覺得閱讀Clojure代碼迫使我過早地去瞭解過多細節。(p. 203)如果排版合理的話,閱讀起來沒有問題。> 由於在JVM上,Clojure限制了尾遞歸優化,Clojure程序員必須用可怕的recur語法。不信就試試看分別用遞歸和loop/recur來實現返回序列x長度的函數(size x)。(p. 203)沒有尾遞歸優化的函數式編程語言……> 消滅用戶定義的宏讀取器也是一個典型的例子。好處很明顯,宏讀取器被濫用時,可以導致語言分裂。代價也很明顯,你又失去了一樣元編程工具。(p. 204)Lisp基於S表達式的語法,使得宏特別方便。現在把宏搞殘了,蠻可惜的。宏乃重器,不可輕用。然而這應該靠個人自律和團隊規範來約束,而不是在語言層面直接限制機制。Haskell-------> Philip: 隨着分佈式結構變得越來越重要,我們需要關注運行在多個機器上程序,這些程序將數值從一個機器發到另外一個機器。當發送一個數值時,你可能更想要的是這個本身,而不是一個通過求值才能產生這個值的程序(以及這個程序的所有自由變量的值)。所以,在分佈式世界中,我認爲默認採用渴望求值的方式更好,不過當你需要的時候使用惰性方法也會很容易。(p. 217)Philip Wadler是Haskell設計委員會的成員,連他也承認(至少在分佈式的世界中),默認eager evaluation是個好主意。其實在非分佈式的環境下,可能也是默認eager evaluation好一些。落幕時分-------> 作爲悲催的Java開發者,我不得不爲閉包苦苦等上十年,只因像我這樣熱切期盼閉包的人都是「文盲」或「半文盲」,沒法給閉包搖旗吶喊、鼓吹造勢,也因爲Spring這類主流框架,堅持用匿名內部類解決大量本可用閉包解決的問題。沒有閉包,輸入代碼的工作就太繁重了,我的手指頭都敲出血了;閱讀代碼的任務也不輕,我的雙眼也佈滿了紅紅的血絲。(p. 242)諷刺的是,Spring的作者Rod Johnson貌似現在很是鼓吹函數式編程。(不過[被噴了](https://github.com/yinwang0/blog-cn/blob/gh-pages/_posts/2013-10-05-random-words.md):「简直可以用浑水摸鱼,空话大话天花乱坠,专骗外行来形容。跟 Spring 的那些教程一个德行,广告成分多于实质内容,说半天抓不住关键。」)這本書的作者對編程語言的理解太有限了,所以深度不足,對語言的描述很多都搔不到癢處。好在裏面收了很多某語言社區裏面的核心人物的訪談,部分章節也請人審閱,所以還是值得一看的。語言選擇上,如果讓我來選的話:- 首先把Ruby去掉,太熱門了,要選一門面向對象的,不如換Smalltalk/Squeak.- Scala沒有什麼特別的,不如介紹一門面向堆棧的語言,Forth,或者現代的Factor.- Clojure,我覺得也可以直接換Racket,更純的Lisp風味。這樣子就好多了。當然還有空間:- Prolog太老了,不如換成miniKanren。- Erlang有些奇怪的地方,可以考慮換Elixir,穿插介紹些Erlang。- Haskell比較複雜,可以考慮去掉。惰性求值和類型系統放Racket裏講,Racket有Lazy Racket和Typed Racket。- 把Haskell去掉省出來的空間可以給Lua。Lua也是很有意思的語言。而且Lua雖然是用table的lisp,但是外表可以冒充過程式編程。這樣也算把主要的編程範式都覆蓋到了。也就是以下7種:1. Lua2. Squeak3. Io4. Factor5. Racket6. miniKanren7. Elixir----https://gist.github.com/weakish/8208971

这书真是一本非常好的书

虽然这本书可真够贵的,中文版不到300页,码洋近60元。但是这书是我见过的计算机教程中信息密度最高的一本。作者很淡定的说,你会google我也会google,没必要写一些你随便搜搜就能找到的东西。于是就有这种三十页就包括一门语言的书。而且每个语言又分三段,大概就是语法入门,高级特性,高级特性与实践结合。完全没有安装指南,做得好!很多语言书的安装指南过时又错误百出(这不完全是作者的错,很多书引进之后,对应的软件版本已经过时了),最后还是靠google到的文档解决问题,索性没有也是一件好事。如果读者靠里面的语言吃饭,就完全没有必要读这书。但是如果没接触过,读完这书里一门语言之后就能比读完这语言的其他教程多知道一点东西,此可谓多元化的犒赏。这书类似于我母校某老师宣称的一种理论,计算机教学应该不走寻常路,应该去模仿学自行车的过程,把人扶上车座,然后对准车屁股一脚踹上去。然后能学会的人自然摇摇摆摆的就上路了。这书里面第一天大概类似于扶人上车座,然后第二三天就是猛踹的过程。里面反复提到DSL,可见DSL毕竟是解决大多数实际问题的大势所趋。此外这书很有趣,把每个语言都用经典电影里的角色做比,让人很轻松的记住每种语言的特点,有些电影我看过,有的还没看。本来打算找来一一看过,但是发现最后一门语言对应的是Star Trek,就打消了这个念头。

语言比算法更重要

如果没有五线谱,作曲家只能用自然语言谱曲,那会是什么样子?翻一翻几何原本,看看欧几里德用自然语言写数学的公式和推导,那是多么蛋疼。五线谱和数学公式都是一种专门的语言。维特根斯坦说:凡是语言能表达的,都能说清楚,凡是语言不能表达的,都应该保持沉默。国内编程界长期被理聪主导,几乎每个程序员都听过这句话--语言不重要,算法才是关键。大学时我也深信这句话,半路出家,一心扑在ACM/ICPC上,以至于连恋爱都没谈!对于红朝的穷苦屁民,除了大学谈恋爱,一生中还能有什么美好的事?尤其是拒绝过至少五六个女生的倒追……没做过这种SB,你永远无法体会到那种悔恨和自责……我扯太远了……回到《七周七语言》这书,它展现了七种语言不同的表达能力。如果你还相信语言不重要,那这本书绝对能颠覆你的观念。然而,它并不完美。我拿到这本书时,第一感觉是:“好薄!”这么几页书就能把七种语言的精髓讲清楚么?--果然是讲不清楚的。除非是接触过相似的语言或概念,书中很多地方的跳跃感很强。作者解释得也不细致,单靠这本书掌握某种新语言的核心是完全不可能的。之前有好几篇书评都是在吐槽这点。此外,我对作者选的这七种语言也不甚满意。似乎作者的目的主要是卖书,而不是理清各种编程范式。函数式编程的概念正当红,于是作者选的七种语言中,只有prolog完全没有函数式编程的影子。Ruby作为面向对象的唯一代表,作者大谈花藜胡哨的语法和奇技淫巧的元编程,和面向对象有个毛关系!就算C++,Java这种不能用,好歹smalltalk吧!再不济,object-C也好得多。Lisp的方言居然选的是Clojure!相较于其它方言,Clojure的特点是当红和复杂,或许Clojure是语法最复杂的Lisp方言,短短几页书根本讲不清楚,还不如用Scheme把函数式编程的概念说得更透彻些。况且Clojure和Scala多少有点重叠的感觉。介绍了那么多函数式语言,居然没有一种ML系的语言,我觉得这也是一大失败。再怎么说,人家在函数式领域的江湖地位至少相当于武当派,你连提都不提……最后,作者对语言的评价太单细胞了。每一种特性不是优势就是劣势,哪有这么简单的事!大多特性都有好用的时候,也有变成麻烦的时候,这难道不是常识么?比如Haskell的类型推断系统,在我熟悉的F#中有几乎一样的特性,它推断得好是很省事,但万一它认为类型不匹配,那补类型声明就要补到死!吐槽到此为止。不管怎么说,这本书是值得一读的,尤其是受理聪毒害颇深的国内程序员。我很想听听三总( @远古邪恶巨坑)对这本书的评价。


 七周七语言下载


 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024