基本信息
- 原书名:Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages
编辑推荐
2011年Jolt大奖图书
带你轻松入门七种先锋语言
开阔视野,享受更多编程乐趣
内容简介
作译者
戴玮 80后宅男,中科院自动化所在读博士,热爱机器学习与计算机视觉。编程喜C#、Ruby、Haskell而厌Java。
白明 Neusoft某开发部技术总监,拥有多年电信级软件开发经验;资深C程序员,对Common Lisp、Python等小众语言也有涉猎;对开源软件有着浓厚的兴趣,曾先后贡献了lcut、cbehave等多个工具框架;喜好写博客http://bigwhite.blogbus.com),耕耘七年,仍孜孜不倦。
巨成 万方数据数字出版事业部架构师,.NET开发人员。
目录
第1章 简介 1
1.1 不走寻常路 1
1.2 语言 2
1.3 谁应该买这本书 4
1.3.1 学会如何学习 4
1.3.2 乱世英雄 4
1.4 谁不应该买这本书 5
1.4.1 超越语法 5
1.4.2 不是安装指南 6
1.4.3 不是编程参考 6
1.4.4 严格督促 6
1.5 最后一击 7
第2章 Ruby 8
2.1 Ruby简史 9
2.2 第一天:找个保姆 10
2.2.1 快速起步 10
2.2.2 从命令行执行Ruby 10
2.2.3 Ruby的编程模型 11
2.2.4 判断 12
序言
——Erlang语言的作者Joe Armstrong
“Gmail编辑器不能正确排版引文格式。”
“这可够丢人的,”马杰里说,“看来他们负责引文格式的程序员水平不行,企业文化也在走下坡路。”
“我们该怎么办?”
“今后我们招募的程序员,一定得通读过《追忆似水年华》 。”
“读过全部七卷?”
“没错。”
“读这书能让人更好地驾驭标点符号,从而不至于在引文格式上犯错?”
“那倒未必,不过他们会因此拥有更精湛的编程技艺。这种感觉只可意会、不可言传……”
学编程就好比学游泳,再好的理论也不如一头扎下水,扑腾着呼吸新鲜空气管用。在初次没入水面的那一刻,你必定会惊慌失措,但当你奋力浮出水面、大口大口地喘着气,你又会无比喜悦。这时你心里明白:“我学会游泳了。”至少我当初学游泳那会儿,就是这种感受。
编程也同样如此——迈出第一步最难。因此你需要一位好老师,鼓励你勇敢地跳入水中。
Bruce Tate正是这样的好老师。他写的《七周七语言:理解多种编程范型》,带你从编程学习中最困难的地方入手,鼓励你大胆迈出第一步。
假设你想学习某门语言,而且顺利完成了下载安装编译器或解释器的艰巨任务,接下来要做什么?你用它写的第一个程序,会是个什么样子?
Bruce回答得十分巧妙。他在《七周七语言:理解多种编程范型》这本书里,展示了许多完整程序和代码片段,你只需将它们一一输入,看看结果是否与书上相同。也就是说,你先不要想着自己编写程序,而是先把书中范例全都实现一遍。随着信心渐长,你会逐渐拥有独立完成编程项目的能力。
获得任何新技能的第一步,是先别想着独立解决什么,而是重复一遍前人已竟之事,这是掌握一门技能最快的方法。
用一门新语言上手编程的过程,与其说是投入大量时间反复实践,试图理解语言背后蕴含的深奥原理,还不如说是让分号、逗号各就各位,同时读懂出错时系统反馈的千奇百怪的错误信息。只有不断提高编程水平,让自己超越先输入代码、再等待编译成功的枯燥阶段,你才有能力思考程序语言中各种语法结构的含义。
跨过输入、运行程序的门槛后,你会有如释重负的感觉,因为潜意识将接管余下的工作。意识刚琢磨出分号放哪儿,潜意识就已明白了表面结构下的深层含义。这样下去,你终会有所顿悟,理解某个程序逻辑的更深层含义,某种语言结构如此特殊的原因,等等。
对几门语言均略知一二,这其实是一项相当实用的技能,因为我常常发现,网上的某个程序有助于解决手头问题,却没法直接拿来使用,还得针对问题稍作调整才行。这程序用什么语言写的都有可能,所以懂点儿Python、Ruby什么的就非常管用。
每门语言都自有一套惯用法。它们各有所长,亦各有所短。通过学习各种不同的编程语言,你会明白,哪门语言最适宜解决自己当下关注的问题。
媒体评论
——Vankat Subramaniam博士,Agile Developer公司创始人,敏捷开发权威
“看过这本书后,我解决问题的思路扩宽了,学习新语言的热情也被点燃了。”
——Travis Kaspar,Northrop Grumman公司软件工程师
书摘
编程语言亦是如此。在这本书中,我将为你介绍七门各不相同的语言。不过,我不会像你的妈妈那样将吃的直接喂到你嘴边。我更愿意做你的导游,带你体验一次启迪心智之旅,并由此改变你看待编程的视角。写这书的目的不是让你成为专家,而是教会你比“Hello, World”更实用的知识。
1.1不走寻常路
假如我想新学一门编程语言或一种编程框架,一般会找一篇速成互动教程看看。因为这类教程中,先做什么、后做什么都已精心设计好。通过它们,我们可以更容易体会语言的妙处所在。当然,扔掉教程,直接动手实践也未尝不可,但说白了,我就是想尽快发现语言的动人心弦之处,尽快对它的语法糖和核心概念有个大体印象。
然而多数情况下,我找不到称心如意的教程。受到篇幅限制,那些教程往往只介绍各门语言间相去无几的皮毛。而这些皮毛,我又早已熟知。若想领会一门语言的精髓,它可就无能为力了。我想要的是那种痛快淋漓、深入探索语言本质的感觉。
本书将会给你这种感觉。不是一次,而是七次。你将从书中找到以下问题的答案。
语言的类型模型是什么?强类型(Java)或弱类型(C语言),静态类型(Java)或动态类型(Ruby)。本书侧重于介绍强类型语言,但各种静态类型和动态类型语言也都有所涉及。你将看到,语言在类型模型间的权衡会对开发者产生何种影响。语言的类型模型会改变你对问题的处理方式,还会控制语言的运行方式。就类型模型而言,书中的每门语言都堪称独树一帜。
语言的编程范型是什么?是面向对象(object-oriented,OO)、函数式、过程式,还是它们的综合体?本书介绍的语言涵盖了4种编程范型,有些语言还由几种范型组合而成。你将看到一门基于逻辑的编程语言(Prolog)、两门完全支持面向对象思想的语言(Ruby和Scala)、四门带有函数式特性的语言(Scala、Erlang、Clojure和Haskell)及一门原型语言(Io)。这里有Scala这样的多范型(multiparadigm)语言,也有Clojure这种多方法(multimethod)语言,后者甚至允许你实现自定义范型。本书最重要的任务之一,就是学习新的编程范型。
怎样和语言交互?语言可编译也可解释,可以有虚拟机也可以没有。在本书中,如果某门语言带交互命令行,将先通过交互命令行探索这门语言,当我们处理规模较大的项目时,还会转而采用文件编程。我们接触的项目不会特别大,因此无需深入研究打包(packaging)模型。
语言的判断结构(decision construct)和核心数据结构是什么?或许你会惊讶,在作判断时,居然如此多的语言都用到了与if和while的各种变型都不相同的结构。你会见识到Erlang的模式匹配,还有Prolog的合一(unification)。至于数据结构,集合(collection)在任何语言中都扮演着至关重要的角色。对Smalltalk和Lisp这类语言,集合刻画了语言特征,而在C++和Java等语言中,集合更可谓无所不在,它们决定着用户体验,若没了它们,语言势必成为一盘散沙。因此,无论用哪一类语言,都必须全面、透彻地理解集合。
哪些核心特性让这门语言与众不同?有些语言支持并发编程的高级特性,有些语言提供独一无二的高级结构,比如Clojure的宏(marco)和Io的消息解释(message interpretation);有些语言包含性能强劲的虚拟机,如Erlang的BEAM,它能让 Erlang构建的容错分布式系统远远快于其他语言;有些语言提供专门针对特定问题的编程模型,比如利用逻辑规则解决约束问题。
就算这些问题全被你弄个一清二楚,你仍然成不了语言专家,哪怕只是其中一门语言。但你会明白,这几门语言各自拥有哪些独门绝技。下面,我们先看看本书介绍了哪几门语言。
1.2语言
从众多语言中,挑出本书包含的几门语言,这一过程也许不像你想得那么复杂。我们只不过发了些调查问卷,向本书的潜在读者请教了一番。调查数据汇总上来时,有八门语言入选希望最大。不过,我先把JavaScript“踢”了出去,因为它实在是过于热门了,取而代之的是原型语言中热门程度仅次于JavaScript的Io。随后,我又把Python“踢”了出去,因为我只想给面向对象语言一个名额,而Ruby的票数多于Python。同时,这也给一个出人意料的候选者让出了位置——名单上位列前十的Prolog。下面,我给出成功入围本书的最终名单以及挑选它们的理由。
Ruby。这门面向对象语言高票当选,因为它不仅好用,而且好读。我曾经考虑过不介绍任何一门面向对象语言,但我又想在其他编程范型与面向对象编程之间作一些比较,因此,至少介绍一门面向对象语言还是有必要的。相比于大多数程序员的日常用法,我想把它挖掘得更深入一些,以揭示设计者的良苦用心。我最终决定重点介绍Ruby元编程(metaprogramming),因为它可以用来扩展Ruby的语法。对于Ruby榜上有名的结果,我还是相当认可的。
Io。和Prolog一样,Io也是本书颇具争议的语言。它虽与商业成功无缘,但其兼具简单性和语法一致性的并发结构,却是十分重要的思想。它的最简语法(minimal syntax)功能强大,与Lisp的相似性也颇能给人留下几分印象。Io不仅和JavaScript一样同为原型语言,还有着独一无二、韵味无穷的消息分发机制,因此在众多编程语言之中,它也占有小小的一席之地。
Prolog。没错,Prolog年事已高,但它仍然威力无穷。它能轻松解出数独问题,这着实让我大开眼界。用Java或C语言时,有些难题我殚精竭虑方能解决,用Prolog却能干净利落地搞定。承蒙Erlang发明者Joe Armstrong出手相助,我得以深刻体会到Prolog之妙,而且也正是深受Prolog影响,Erlang才得以问世。如果你此前从未用过Prolog,我保证,它定会带给你惊喜。
Scala。作为运行于Java虚拟机上的新一代语言,Scala为Java系统引入了强大的函数式思想,同时也并未丢弃面向对象编程。回顾历史,我发现C++和Scala有着惊人的相似之处,因为从过程式编程过渡到面向对象编程期间,C++同样起到了举足轻重的作用。当你真正融入Scala社区之后,你就会明白,为什么对于函数式语言程序员来说,Scala是异端邪说,而对于Java开发者来说,Scala是天降福音。
Erlang。作为名单上历史最悠久的语言之一,Erlang不仅是一门函数式语言,而且在并发、分布式编程、容错等诸多方面都有优异表现,真是想不火都难。CouchDB(新兴的基于云的数据库)的创始人就选择了Erlang,并且义无反顾地一直用它,只要花上点时间了解这门分布式语言,你就会明白原因所在。在Erlang帮助下,设计带有并发、分布式、容错等特征的应用程序将变得无比简单。
Clojure。这又是一门Java虚拟机语言,但正是这门Lisp方言,彻底颠覆了我们在Java虚拟机上并发编程的思考方式。它是本书唯一在版本数据库中使用同一种策略管理并发的语言。作为Lisp方言,Clojure或许拥有本书所有语言中最灵活的编程模型,因此绝不缺乏号召力。与其他Lisp方言不同的是,它不会带那么多括号,还有众多Java库和在各平台上的广泛部署作为坚强后盾。