JavaScript动态函数式语言精髓

所需积分/C币:50 2012-03-13 01:22:39 3.47MB PDF
0
收藏 收藏
举报

中文 文字 版 计算机语言有很多种分类方法,例如高级语言或者低级语言。其中一种分 类方法,就是“静态语言”和“动态语言”—— 事物就是如此,如果用一对绝 对反义的词来分类,就相当于概含了事物的全体。当然,按照中国人中庸平和 的观点,以及保守人士对未知可能性的假设,我们还可以设定一种中间态:半 动态语言。你当然也可以叫它半静态语言,这个随便你。 所以,我们现在是在讨论一种很泛义的计算机语言工具。至少在眼下,他 (在分类概念中)概含了计算机语言的二分之一。当然,限于我自身的能力,我 只能讨论一种确指的工具,例如JavaScript。但我希望你看到的是计算机编程 方法的基础,而不是某种愚人的器物
前言 11语言 我相信,在这个世界上无时不刻地在产生着新的语言。例如我刚才叫住我 脚下的这只小猫,我喊了一声“嗨”,它就停下来望着我。如同我与猫一样, 你可能正在用另外的一种语言—声音的,或者符号的—与另外一种个体进 行着交流。 无论这种个体是否是一个鲜活的生命,还是一堆电器元件,如果你们需要 交流,那么唯一的方式就是创生一种语言,或者使用两种个体既有的语言之 进行交流。 我们一边在创生着与计算机交流的语言,一边也不得不用既有的语言与之 交流。这就是现状。这与此时我跟脚下的猫,或者数千年前的铸剑师与一柄剑 之间交流时的情状,是完全一样的。 语言是一种交流的工具,这约定了语言的“工具”木质,以及“交流”的 功用。“工具”的选择只在于“功川”是否能达到,而不在于工具是什么 在数千年之前,远古祭师手中的神杖就是他们与神交流的工具。祭师让世 人相信他们敬畏的是神,而世人只需要相信那柄神杖。于是,假如祭师不小心 丟掉了神杖,就可以堂而皇之地再做一根。甚至,他们可以随时将旧的换成更 新或更旧的神杖,只要他们宣称这是一根更有利于通神的杖。对此,世人往往 做岀迷惑的表情,或者欢欣鼓舞的情状。今天,这种表情或情状一样地岀现在 大多数程序员的脸上,出现在他们听闻到新计算机语言被创生的时刻。 神杖换了,祭师还是祭师,世人还是会把头叩得山响。祭师掌握了与神交 流的方法(如果真如同他们自己说的那样的话),而世人只看见了神杖。 所以,泛义的工具是文明的基础,而确指的工具却是愚人的器物。 计算机语言有很多种分类方法,例如高级语言或者低级语言。其中一种分 类方法,就是“静态语言”和“动态语言”—一事物就是如此,如果用一对绝 对反义的词来分类,就相当于概含了事物的全体。当然,按照中国人中庸平和 的观点,以及保守人上对未知可能性的假设,我们还可以设定一种中间态:半 动态语言。你当然也可以叫它半静态语言,这个随便你。 所以,我们现在是在讨论一种很泛义的计算机语言工具。至少在眼下,他 (在分类概念中)概含了计算机语言的二分之一。当然,限于我自身的能力,我 只能讨论一种确指的工具,例如 JavaScript。但我希望你看到的是计算机编程 方法的基础,而不是某种愚人的器物。 Javascript的生命力可能足够顽强,我 假定它比C还顽强,甚至比你的生命都顽强。但他只是愚人的器物,因此反过 来说:它能不能长久地存在都并不重要,重要的是它能不能作为这“二分之 的泛义”来供我们讨论。 12,分类法 新打开一副扑克牌,我们总看到它被整齐的排在那里,从A到K以及大 小士。接下来,我们将它一分为二,然后交叉在一起:再分开,再交叉……完 成了洗牌之后,我们便可以拿它新开一局了。但是你是否注意到在这个过程中 牌局的复杂性,其实不是由“分开”这个动作导致的,而是由“交叉”这个动 作导致的。 所以分类法本身并不会导致复杂性。就如同一囑新牌只有四套A~K,我们 可以按三牌面来分类,也可以按四种花色来分类。当你从牌盒里把他们拿出 来的时候,无论他们是以哪种方式分类的,这幅牌都不混乱。混乱的起因,在 于你交义了这些分类 同样的道理,如果世界上:只有动态、静态两种语言,或者真有半动态语言 而你又有明确的“分类法”,那么开发人员将会迎来清醒明朗的每一天:我们 再也不需要花更多的时间却学习更多的古怪语言了 然而,第一个问题便来自于分类本身。因为“非此即彼”的分类必然导致 特性的缺失——如果没有这样“非此即彼”的标准,就不可能形成分类。而特 性的缺失又正是开发人员所不能容忍的。我们一方面吃着碗里,一方面念着钠 里。即使锅里漂起来的那片菜叶未见得有碗里的肉好吃,我们也一定要捞起来 尝。而且大多数时候,由于我们吃肉吃腻了∫嘴,因此会觉得那片菜叶味道其 实更好 所以首先是我们的个性,决定了我们做不成绝对的素食者或肉食者。当然, 更有一些人说我们的确需要一个新的东西来使得我们更加强健。但不幸的是 大多数提出这种需求的人,都在寻求杀死人狼的纯质银弹或者混合毒剂。无论 如何,他们要么相信总有一种事物是完美武器,或者更多的特性放在一些就变 成了魔力的来源。 我不偏向两种方法之任一。但是我显然看到了这样的结果,前者是我们在 不断地创造并特化某和特性,后者是我们在不断地混合种种特性。 更进一步的说,前者在产生新的分类法以试图让武器变得完美,后者则通 过混乱不同的分类法,以期望通过突变而产生奇迹。 者相同之处,都在于需要吏多的分类法 函数式语言就是来源于另外的一种分类法。不过要说明的是,这种分类法 是计算机语言的原力之一。基本上来说,这种分类法在电子计算机的实体出现 以前,就已经诞生了。这种分类法的基础是“运算产生结果,还是运算影响结 果”。前一种思想产生了函数式语言(如Lip)所在的“说明式语言”这一分类, 后者则产生了我们现在常见的C、C++等语言所在的“命令式语言”这一分类。 然而我们已经说过,人们需要更多的分类的目的,是要么找到类似银弹的 完美武器,要么找到混合毒剂。所以一方面很多人宣称“函数式是语言的未来”, 另一方面也有很多人把这种分类法与前种分类法混在一起,丁是变成了我们 这本书所说的“动态函数式语言” 然,毋庸置疑的是:还会有更多的混 合法产生。因为保罗·格雷厄姆( Paul graha m)已经做过这样的总结 二十年来,开发新编程语言的一个流行的秘决是:取C语言的计算模式, 逐渐地往上加Lisn模式的特性,例如运行时类型和无用单元收集 保罗·格雷厄姆是硅谷著名的程序员之一,在1995年他和 Robert morris开 发了第一个基于web的应用程序 Via web,该项目在1998年被雅虎(Yaho)收 购。在202年,他设计了一种垃圾邮件过滤器算法。他同时还是计算机程序 语言Arc的设计者,写了多本关于程序语言以及创业方面的书籍。在2005年 他和3位合伙人成立了 Y Combina tor创业投资基金公司,专注于早期阶段的种 子投资。 然而这毕竞只是“创生一种新语言”的魔法。那么,到底有没有让我们在 这浩如烟海的语言家族中,找到学习方法的魔法呢? 我的答案是:看清语言的本质,而不是试图学会一门语言。当然,这看起 来非常概念化。甚至有人说我可能是从某本教材中抄来的,另外一些人又说我 试图在这本书里宣讲类似于我那本《大道至简》里的老庄学说。 其实这很冤枉。我想表达的意思不过是:如果你想把一幅牌理顺,最好的 法子,是回到他的分类法上,要么从A到K整理,要么按四个花色整理。毕 竟,两种或者更多的分类法作用于同一事物,只会事物混淆而不是弄得更清楚。 因此,本书从语言特性出发,把动态与静态,函数式与非函数式的语言特 性分列岀来。先讲述每种特性,然后再讨论如何去使用(例如交叉)他们。 13.漏掉了点儿什么 你会发现一个问题:无论是四种花色,还是A到K的牌面,我们都漏掉了两张王。是的,这 正是问题之所在:这两种分类法是以特性为主的,而不是按照我们前面说的“绝对一分为二 的方法”。因为如果用那样的方法,那么一副牌应该分为“王牌”和“非王牌” 1.4.特性 无论哪种语言(或其它工具)都有其独特的特性,以及借鉴自其它语言的特 性。有些语言通体没有“独特特性”,只是另外一种语言的副本,这更多的时 候是为了“满足一些人使用语言的习惯”。还有一些语言则基本上全是独特的 特性,这可能导致语言本身不实用,但却是其它语言的思想库 我们已给讨论过这一切的来源。 对于 JavaScript来说,除了动态语言的基本特性之外,它还有着与其创生 时代背景密切相关的一些语言特性。直到如今, JavaScript的创建者还在小心 翼翼地增补着它的语言特性。在特性集的设定方面, JavaScript一直以来都是 个典范。 由于 JavaScript轻量的、简洁的、直指语言木实的特性集设计,它成为解 剖动态语言的有效工具。这个特性集包括: 1.一套原型继承的、基于对象的语言特性和对象系统 套支持自动转换的弱类型系统 3.语言、类型相关的基础涵数/法 4.动态语言与函数式语言的基本特性 需要被强调的是, JavaScript非常苛刻地保证这些特性是相应语言领域屮 的最小特性集(或称之为“语言原子”),这些特性在 Javascript中相互混合, 通过交错与补充而构成了丰富的、属于 Javascript自身的语言特性 本的主要努力之一,就是分解出这些语言原子,并重现将它们混合在 起的过程与方法。通过从复杂性到单一语言特性的还原过程,让读者了解到语 言的本实,以及“层出不穷的语言特性”背后的真相。 15合理性 本书之所以有趣,一个重要的原因是它讨论问题的角度,以及讨论这些问 趣的日标与其它书籍全然不同。我在这本书中试图以一种多范型语言(当然 我们已经知道亡叫 Javascript),米讨论不同语言范型之间的特性;用分解特性 的方法来讨论它们为什么、以及如何被结合在一起,变成了一种语言 因为讨论的角度与目标的不同,本书中你会看到一些全然不同的观点。你 会发现这些观点可能在其它 JavaScript书中,或者其它专论语言的书中都没有 出现过。于是,你会置疑:这些观点合理吗? 个创生这种语言的人都没有提出的观点,或者其它语言大师在同类范型 的语言中都没有提出过的观点,的确是值得置疑的。我高兴看到这样的置疑 并欢迎读者带着疑问将本书读下去。但你不应当先给出一个结论说:这不合理, 因为没人这样说过,甚至语言的创生者可能都没有这样想过。 要人们抛弃一种观点来接受另一种,的确非常艰难。但我所认为的合理性 并不是一个人或者某些人所讲述的“论点”。声音越大、重复得越多的观点未 见得一定合理,没被这样大声地官讲或重复的观点未见得就不合理。我经常的 问题是:存在的合理性。 如果一和事物“坚持不懈”地存在了十年或者一个时代,那么它必然有存 在的理由,也有被人接受的理由。这些理由本身可能荒诞(例如是因为茼业而 非技术原因才有了 Javascript这个名字,而它原本是叫 Mocha),另一些也可能 很接近本质(例如lisp这种语言居然还活着)。而我则试图去揭示 JavaScript 语言“被创造成这样”却仍然还活着的一些本质原因。这些原因是否因为没有 出自某个人或者某些人的观点而显得“不合理”,则是我要忽略的。 因为如果我不忽略它,则我永远只能接受那些“看起来貌似合理”的观点, 而这本书也就变成了重复之作。 16.技巧 技巧是“技术的取巧之处”,所以根木上来说,技巧也是技术的一部分 很多人(也包括我)反对技巧的使用,是因为难于控制,并且容易破坏代码的可 读性 哪种情况下代码是需要“易于控制”和“可读性强”的呢?通常,我们认 为在较大型的工程下需要“更好的控制代码”;在更多人共同开发的项目代码 上要求“更好的可读性”。然而,反过米说,在一些更小型的、不需要更多人 参与的项目中,“适度的”使用技巧是否就是可以接受的呢? 这取决于“需要、能够”维护这个代码的人对技巧的理解。这包括: 技巧是否是语言特性支持的,还是仪特定版本所支持或根本就是BUG; ③技巧是否是唯一可行的选择,有没有不需要技巧的实现 技巧是为达到日的、实现功能,而不是为了表现技巧而出现在代码中的 即使如此,我仍然希望每一个技巧的使用都有说明,甚至示例。如果维护 代码的人不能理解这个技巧,那么连代码本身都失去了价值,更何论技巧存在 于这份代码中的意义呢?所以本书中的例子的确要用到诈多“技巧”,但我 方面希望读者能明白,这是语言/框架内核实现过程中必须的,另一方面也希 望读者能从这些技巧中学习到它原本的技术/理论,以及活用的方法。 17.本书讲的不是技巧 尽管我对技巧持以一种理解和宽容的态度,但我却要声明,我在木书中讲 述的并不是技巧。 这样说并不是要为我的“出尔反尔”争叫一点面子。事实上,对很多人来 说,木书在讲述一个完全不同的语言类型。在这种类型的语言中,木书中讲述 的一切,都只不过是“正常的方法”。然而在其它类型的一些语言中,这些看 起来就成了技巧。例如在 Javascript中要改变一个对象方法指向的代码非常容 易,并且是语言本身赋予的能力;而在 Delphi/C++中,却成了“破坏面向对象 设计”的非常手段——以至于在编译级与系统级受到层层阻挠。 你最好能改变一下思维来看待本书中讲述的方法之精髓。无论它对你产生 多大的冲击,你应该先想到的是这些方法的价值,而不是它对于“你所认为的 传统”的挑战—一事实上,这些方法,在另一些“同样传统”的语言类型中, 已经存在了足够长久的时间,如同“方法”之与“对象”一样,原本就是那样 “(至少看起来)自然而然”地存在于它所在的语言体系之中。 语言特性的价值依赖于环境而得彰显。横行的螃蟹看起来古怪,但据说那 是为了适应一次地磁反转。螃蟹的成功在于适应了一次反转,失败(我们是说 导致它这样难看)之处,也在于未能又一次反转回来 18本书讲什么 你当然可以置疑:为仆么要有这样的一本书?是的,这的确是一个很好的 问题 首先,这本书并不讲浏览器( Browser,例如 Internet Explorer)。这可能令 人沮丧。但的确如此。尽管在很多人看来, JavaScript就是为浏览器而准备的 种轻量的语言,并认为它离开了DOM、HTML、CSS就没有意义。在同样 的“看法”之下,国内、外的书籍一提及 JavaScript,无不讲述浏览器如何 开发,更多的是从“如何验证一个输入框值的有效性”讲起 是的,最初我也是这样认为的。因为本书原来就是出自我在写《B端开发》 这本书的过程之中。事实上,《B端开发》是一本讲述“在浏览器( Bro wscr)上 如何用 JavaScript”来开发的书。然而,《B端开发》写到近百页就放下了,因 为我觉得应该写一本专门讲 JavaScript的书,这更重要。 所以,现在你将要看到的这本书就与浏览器无关。在本书中,我将会把 Javascript提升到与Java、C或 Delphi一样的高虔,来讲述它的语言实现与扩 展。由于在本书中的最后一部分内容中,讲述了名为“Qomo”的完整的 Javascript框架,因此如果你需要在浏览器上构建大型应用(例如基于Ajax的工 程),那么你可以从Qomo中得益良多。Qomo可以成倍地提高你的开发工效 有利于你实现更多的、更有价值的应用特性。但是,嗯,本书不讲浏览器,不 讲WEB,也并不讲“通常概念下的”Ajax javAscript是一门语言,有思想的、有核心的、有灵魂的语言。如果你不 意识到这一点,那么你可能永远都只能拿它来做那个“检测值是否有效的输入 框”的代码。 本书讲述 JavaScript的思想、核心、灵魂,以及如何去丰富它的血肉。主 要包括三个部分: 动态、函数式语言,以及其它语言特性在 JavaScript的表现与应用; 如何用动态函数式语言的特性来扩展 JavaScript的语言特性与框架 如何将 JavaScript引擎整合到其它高级语言的开发过程中 另外,这本书里有很多示例的代码是大同小异的。但对于 JavaScript这种 语言来说,任何一点点看起来微不足道的变化,可能都源自对某些语言特性的 深刻理解。另一方面,一段相同的代码,在很多时候也可以从不同的语言类型 或特性来审视。 19本书的适读者 我试图给这本书找到一个适合的读者群体,但我发现很难。因为通常的定 义是低级、中级与高级,然而不同的用户对自己的“等级”的定义标准并不 样。在这其中,有“十年学会编程”的谦谨者,也有“三天学会某某语言”的 速成家。所以,我认为这样定位读者的方式是徒的。 如果你想知道自己是否适合读这本书,建议你先看一下目录,然后试读 二章节,可以选一些在你的知识库中看来很新鲜的,以及一些你自认为已经非 常了解的。通过对比,你应该知道这木书会给你带来什么。 不过我需要强调一些东西。这本书不是一本让你“学会某某语言”的书, 也不是一本让初学者“学会编程”的书。阅读本书,你至少应该有一点编程经 验(例如半年至一年),而且要摈弃某些偏见(例如C语言天下无敌或 Javas crips 是新手玩具)。 最后,你至少要有一点耐心与时间 第一部分语言基础

...展开详情
试读 127P JavaScript动态函数式语言精髓
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
sx1989827 恩 不错 很好的东西 对我这种菜鸟很实用 我要好好研读下
2013-08-22
回复
killyoou 函数式编程也是js的一部分,不错的介绍
2013-06-18
回复
danislyn 页数很多,章节标题都很深入,是深入理解js语言特性,缺点是例子太多,还有其他语言的例子,篇幅太长
2013-05-18
回复
liugl9527 题目挺好,内容废话真多..
2012-10-12
回复
  • GitHub

    绑定GitHub第三方账户获取
  • 签到新秀

    累计签到获取,不积跬步,无以至千里,继续坚持!
关注 私信 TA的资源
上传资源赚积分or赚钱
    最新推荐
    JavaScript动态函数式语言精髓 50积分/C币 立即下载
    1/127
    JavaScript动态函数式语言精髓第1页
    JavaScript动态函数式语言精髓第2页
    JavaScript动态函数式语言精髓第3页
    JavaScript动态函数式语言精髓第4页
    JavaScript动态函数式语言精髓第5页
    JavaScript动态函数式语言精髓第6页
    JavaScript动态函数式语言精髓第7页
    JavaScript动态函数式语言精髓第8页
    JavaScript动态函数式语言精髓第9页
    JavaScript动态函数式语言精髓第10页
    JavaScript动态函数式语言精髓第11页
    JavaScript动态函数式语言精髓第12页
    JavaScript动态函数式语言精髓第13页
    JavaScript动态函数式语言精髓第14页
    JavaScript动态函数式语言精髓第15页
    JavaScript动态函数式语言精髓第16页
    JavaScript动态函数式语言精髓第17页
    JavaScript动态函数式语言精髓第18页
    JavaScript动态函数式语言精髓第19页
    JavaScript动态函数式语言精髓第20页

    试读结束, 可继续阅读

    50积分/C币 立即下载 >