描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121315114
《Dart编程语言》由Java泛型作者、JVM规范核心制定者、Dart语言标准作者Gilad Bracha所著,全面介绍Dart的方方面面,包含基本语法和反射、isolate等进阶内容,包含语言背后的原理和思想。
《Dart编程语言》包括如下内容。
·Dart的对象模型,万物皆对象,甚至是数字和布尔量。
·Dart程序是如何由模块化的库组成的。
·Dart函数是如何构成的,以及是如何存储于变量中作为参数传递,并作为结果返回的。
·Dart处理可选类型的创新方式。
·Dart如何处理表达式和语句。
·如何使用Dart实现的反射来对库、类、函数和对象进行自省。
·Isolates及其他Dart支持的并发与分布式特性。
第1章 简介 1
1.1 动机 1
1.2 设计准则 2
1.2.1 万物皆对象 2
1.2.2 面向接口编程,而非面向实现 2
1.2.3 类型是为开发者服务的 3
1.3 限制 4
1.4 概述 4
1.5 本书结构 10
1.6 相关语言及其对Dart的影响 11
第2章 对象、接口、类与mixin 12
2.1 accessor 13
2.2 实例变量 16
2.3 类变量 16
2.4 final变量 18
2.5 相同与相等 18
2.6 类与父类 20
2.7 抽象方法与抽象类 22
2.8 接口 23
2.9 对象的创建 24
2.9.1 重定向构造函数 28
2.9.2 工厂构造函数 29
2.10 noSuchMethod() 30
2.11 常量对象与字段 31
2.12 类方法 31
2.13 实例及其类与元类 33
2.14 Object与其方法 34
2.15 mixin 35
2.16 相关语言 46
2.17 总结 46
第3章 库 47
3.1 顶层 47
3.2 脚本 48
3.3 隐私 49
3.4 导入 49
3.5 将库拆分成part 54
3.6 导出 55
3.7 钻石导入 56
3.8 延迟加载 58
3.9 相关语言 59
3.10 总结 60
第4章 函数 61
4.1 参数 61
4.1.1 位置参数 61
4.1.2 命名参数 62
4.2 函数体 63
4.3 函数声明 64
4.4 闭包 65
4.5 调用方法与函数 66
4.5.1 级联 66
4.5.2 赋值 68
4.5.3 使用运算符 68
4.6 Function类 68
4.7 函数作为对象 70
4.8 生成器函数 72
4.8.1 迭代器与可迭代对象 72
4.8.2 同步生成器 73
4.9 相关语言 74
4.10 总结 75
第5章 类型 76
5.1 可选类型 76
5.2 类型之旅 78
5.3 接口类型 81
5.4 类型实践:添加类型的表达式问题 83
5.5 泛型 87
5.6 函数类型 93
5.6.1 可选位置参数 94
5.6.2 命名参数 95
5.6.3 重温Call() 96
5.7 类型具体化 97
5.7.1 类型检测 97
5.7.2 强制类型转换 98
5.7.3 检查模式 99
5.7.4 具体化泛型 100
5.7.5 具体化和可选类型 100
5.7.6 类型和代理 101
5.8 malformed类型 104
5.9 非严格 106
5.10 相关语言 108
5.11 总结 109
第6章 表达式和语句 110
6.1 表达式 110
6.1.1 字面量 110
6.1.2 标识符 117
6.1.3 this 121
6.1.4 常量 121
6.1.5 创建对象 122
6.1.6 赋值 123
6.1.7 抽取属性 124
6.1.8 方法调用 124
6.1.9 使用运算符 125
6.1.10 Throw 126
6.1.11 条件运算符 127
6.2 语句 127
6.2.1 block 127
6.2.2 if 127
6.2.3 循环 128
6.2.4 try-catch 130
6.2.5 rethrow 131
6.2.6 switch 131
6.2.7 assert 133
6.2.8 return 135
6.2.9 yield和yield-each 137
6.2.10 label 138
6.2.11 break和continue 139
6.3 总结 140
第7章 反射 141
7.1 自省 141
7.1.1 速度与大小的影响 144
7.1.2 例子:代理 146
7.1.3 例子:序列化 147
7.1.4 例子:解析器组合器 158
7.2 为什么使用mirror 168
7.3 元数据 169
7.4 通过代码生成执行反射 169
7.5 自省之外 172
7.6 相关语言 173
7.7 总结 173
第8章 异步和isolate 174
8.1 异步 174
8.2 future 175
8.2.1 使用future 175
8.2.2 生成future 176
8.2.3 调度 177
8.3 stream 178
8.4 isolate 178
8.4.1 Port 179
8.4.2 spawning 179
8.4.3 安全 180
8.5 例子:客户端-服务器通信 180
8.5.1 promise:更好的future 180
8.5.2 将isolate作为分布式对象 182
8.6 异步函数 187
8.6.1 await 187
8.6.2 异步Generator 188
8.6.3 await-for循环 189
8.7 相关语言 189
8.8 总结 189
第9章 结论 190
9.1 可选类型 190
9.2 面向对象 191
9.3 反射 192
9.4 工具 192
9.5 总结 193
相关文献 194
译者序
Dart是一门由Google开发并被批准为ECMA标准(ECMA-408)的通用编程语言。它可以用于构建Web端、服务端和移动端应用程序。它是开源的,使用宽松的免费软件许可证(修改版BSD许可证)。Dart是完全面向对象的,使用类和单继承,可编译为JavaScript,语法风格是类C的。它支持接口、mixin、抽象类、泛型和可选类型。
Dart目前在业界的认识度不高,社区规模也比较小,主要原因是Dart自身还在不断地发展、完善中,而Google对外还没有真正地对Dart做过推广。幸好,近两年Dart的发展开始步入正轨。Dart是2016年Google内部使用量增长快的编程语言,多个重要项目如AdSense、AdWords等Web应用,正在用Dart重写。Google正在研发中的跨平台移动端开发工具Flutter,也正在使用Dart。Dart未来的发展值得我们期待。
本书虽然名为《Dart编程语言》,且内容也涉及了对象、类型、表达式与语句等基础知识,但它总体还是着重于讲解语言背后的原理和思想。这意味着本书并不适合真正的初学者,读者至少要具备基本的编程知识,好对Dart有基本的了解且使用过一门编程语言,例如JavaScript、Java或C#等。
作为一门新生的可选类型编程语言,Dart目前的关注者比较少,可参考的资料也非常匮乏,而本书内容具有一定深度,加上笔者水平有限,翻译时出现错误或偏差在所难免,欢迎读者朋友指正。
感谢出版社编辑的校对,特别感谢付睿编辑,让我得到了翻译(学习)本书的机会。翻译工作耗费了我大量的业余时间。也感谢家人的支持与理解。
推荐序
在2006年的早春时节,我在博客上写了一篇简短的文章《Gilad是正确的》,主要内容是表述作为一名静态类型主义者,我认同Gilad关于可选和分层类型系统的想法,静态类型不能改变程序的运行时行为,不阻止非法程序的编译或执行,是面向数百万开发人员的编程语言必然要做出的设计权衡。当时我正在忙于学习Visual Basic语言,它通过Option Strict Off语句已经可以支持可选类型,但该特性受到静态类型支持者的猛烈抨击。类型系统通常是高度非线性的,当它成长至某一节点之后,其复杂性将呈爆炸性增长,带给开发者的价值却很少,还使语言实现者的生活变得暗淡无光。可选和分层类型系统通过允许强制静态类型与动态类型和平共存来实现一种更加缓和的处理方式。现在,近十年后,Gilad开创性的愿景已经化名为渐进类型并逐步成为主流。过去几年中所诞生的许多编程语言,如Hack、TypeScript、Flow、Racket和Dart,都选择了渐进类型。即使是学术界,也接受了这个想法,并用包含如“三人行”和“责备”等轻蔑字眼的标题,来编写与之相关的论文。
Dart另一个务实且没有被语言纯粹主义者所接受的事实是,Dart的类型系统被故意设计为非严格的。用正常的语言来描述,这意味着Dart类型检查器在编译时不会标记某些类型错误,反而依靠运行时检查来确保类型安全。Dart中类型非严格的主要来源是协变泛型。为了解释其中的分歧,让我们先看看一台自动售货机,我们只能从中取饮料。如果自助餐厅需要售卖汽水的自动售货机,则我们可以合法地安装售卖根汁汽水的自动售货机,因为根汁汽水是一种汽水(但是在需要售卖根汁汽水的自动售货机的地方,安装售卖汽水的自动售货机则是非法的)。在编程语言中,我们说自动售货机是协变的。接下来让我们看看只能用来装填垃圾的垃圾桶。如果自助餐厅需要一个垃圾桶来回收垃圾,则我们可以合法安装一个普通的垃圾桶,因为可回收垃圾是垃圾的一种(但对于需要普通垃圾桶的地方,安装可回收垃圾桶是非法的)。在编程语言中,我们说垃圾桶是逆变的。你不是对协变和逆变感到困惑的人,你会欣赏Dart的决定,使所有的泛型类型协变。这种选择的后果是,如果你需要普通垃圾桶,则你可以合法安装一个用于可回收垃圾的垃圾桶,但该垃圾桶会拒绝回收人们向其中投入的所有不可回收的垃圾。虽然理论上非严格,但对于大多数开发人员来说,不安全的协变实际上是很自然的,我赞赏Dart设计者在这里做出的选择。作为曾经挣扎于选择super或extends的人可以证明,选择支持静态类型安全的泛型语言,其付出的代价是建立在减少用户之上的。
Dart语言设计者做出的其他务实选择,使Dart的编码过程变得流畅。例如,Dart没有接口、抽象基类或“普通”类。相反,Dart只有作为接口的类,你可以实现它们,或者通过继承它们来作为基类使用,或者通过mixin来重用它们的实现。Dart中的每个类型都是一个对象,所以基础类型(如数字)和常规对象类型是没有区别的。虽然Dart中的所有内容都是对象,但定义函数和变量也是可以的,所以顶层类中不再需要可怕的public static void咒语了。Dart允许用户自定义算术运算符,但不支持基于类型的方法重载,这大大简化了语言本身。其他支持基于类型重载的编程语言,它们的语言规范花费了大量不必要的篇幅来描述此特征的语义。null感知运算符(null也是一个普通的对象)和级联为点操作符赋予了更多的能力,也使API的作者不费吹灰之力就能编写出可让用户流畅使用的API。
因为所有类型都是可选的,所以Dart本质上是一种动态语言,虽然如此,与其他大多数动态语言相比,你很少有机会产生疑问。有null但没有undefined,因此只有==但没有===。只有true是true,所以也不需要使用 (foo && foo.bar()) 来检查null。Dart有常见的整数和浮点数字类型,但是 和==不会产生令人惊讶的运行时类型转换,类型转换可能会是伟大的考试问题或有趣的会议演示,但都会带来令人沮丧的错误。
在我看来,虽然我明显存在偏见,但Dart成为我喜欢的编程语言的原因是,它是我知道的支持以下四种模式的编程语言。
也就是说,Dart通过使用sync*块中的生成器和for循环,对同步数据流(Iterable <T>)的生成和使用提供良好的支持,使用async块中的await表达式,生成和使用future(Future <T>),后且重要的是,使用async*块中的异步生成器和for循环生成及使用异步数据流(Stream <T>)。内置对异步编程的支持在任何现代编程语言中都是必不可少的,虽然数据存在于内存中,但让它们在网络上传输,那是非常“遥远”的,在如此高延迟下进行同步访问的代价极高。类似于JavaScript,但又不同于其他支持生成器的语言,Dart拥有所谓的委派生成器,避免流的生成在嵌套和递归中呈现二次方规模的爆发性增长。
尽管有以上诸多优点,Dart在大体上是一门被设计得比较无趣的语言。由于支持getter、setter、lambda、enum、reified generic、模块、一个精心设计的标准库和一个简单的包管理器,如果你用过Java或C#,则使用Dart会让你感觉非常舒适,就像一双合脚的鞋子;如果你用过JavaScript,那么你会觉得Dart像新鲜的空气。本书将帮助你了解Dart的所有特性,了解为什么需要这些特性及它们是如何实现的,Gilad对细节的详细讲解和其独特的方式,可让你在短时间内熟悉Dart。
Erik Meijer
加利福尼亚州
帕罗奥图
2015年10月
前言
本书与其他Dart书籍有什么不同?其他Dart书籍都注重于实操,本书着重于讲解原理和思想。
Dart的实操非常重要,但它们可能会逐年变化,并可能一直变化下去。相比之下,Dart背后的原理应该很少会随时间而改变。如果你对激发Dart语言设计的想法及它们是如何实现的,还有如何权衡现实世界对Dart的需求等感兴趣,那么你应该阅读本书。
Dart的主要思想之一是可选类型。我在几十年前就开始从事可选类型的工作,今天我们看到使用可选类型系统的语言在飞速增加,我对此感到非常欣慰。虽然Dart和它的任何竞争对手都不像我想要的那样实现可选类型,但可选类型成为主流的事实才是重要的。
更重要的思想是,Dart是一种面向对象的语言,这不等同于传统意义上的类、继承或其他大多数开发者所理解的概念,它的深层含义可以表述为,一个对象重要的是它可观察的行为。同样,Dart对这个想法并没有完美地实现,但比大多数主流语言要好。
本书中涉及的另一个关键思想是反射。大部分关于编程的书籍都没有很好地讨论反射。因此,我非常渴望在本书中探讨反射。然而,Dart的反射历史却意外地曲折。
一方面,很多Dart用户都渴望使用反射,有时只是为了用而用,但并不一定适用。另一方面,某些作为Dart编译目标的平台存在严重限制,使得对反射的支持异常昂贵,尤其是需要考虑代码的体积。这种双向压力使Dart的反射陷入尴尬的境地。
我们从一开始就知道代码体积和反射对其影响的敏感性。这个问题及其解决方案在2011年11月的第1个Dart反射设计文档中被讨论。然而,直到实现解决方案且开发者可以轻松使用时,已经花费了四年。
我希望本书有效地传达上述及其他语言设计相关的想法,但它们的好坏由读者来判断。我们可能可以创造一门更加纯粹的语言,并做得更好,但另一方面,我们也不清楚是否可以得到大家的认可。也许有一天我会进行那样的尝试。
本书的写作历时很久。直到我能完整讲述一个关于反射的合理故事,我才完成本书。拖延本书写作的另一个原因是,本书的主题发展得如此之快,以至于它总是面临过时的风险。这种风险还没有过去,但在某个时刻我们需要说“适可而止”。
Dart并没有完美实现驱动其设计的思想。没有人比它的设计者更了解这个事实。然而,它是一门真正的语言,已经被用来书写数百万行的关键任务代码。它以某种方式推动了编程文化的发展,引人注目的是在可选类型领域。正如有人在丹麦说的:“它本可能更糟”。
致谢
Dart编程语言是大团队努力的结果。Dart
评论
还没有评论。