近年来随着人工智能、大规模分布式计算、多核CPU和异构计算等的发展,计算机中的各种编程技术在编程语言、软件架构、编译器、硬件体系结构、集成电路设计等方面都有着剧烈的变化。编程语言方面,越来越多的主流语言引入函数式编程的概念。软件架构方面则有了更多并行计算的东西、各种分布式并发的模型,以充分利用多核CPU。编译器方面则有了更多领域应用方面的发展,比如MLIR、TVM等,充分利用异构计算中的硬件加速单元。硬件体系结构方面则随着各种硬件加速单元的兴起,改变了原来以CPU为计算中心的格局,计算更多地依赖各种硬件加速单元。集成电路设计方面则为了实现各种硬件加速单元,需要缩短电路设计的周期,以更快速地应对各种频繁变化的需求,近年来有不少公司使用Bluespec、Chisel、SpinalHDL等具有函数式特性的语言来设计集成电路。
作为程序员,如何应对这些变化呢?如果每出现一种新的技术都去学习,那将会让我们疲于奔命,会有学不动的感觉——需要学习的东西太多了。但实际上这些新技术的基础变化并不大,有些甚至是在原有基础上的重新组合。所以,我们应该更多地学习基础的技术,提升抽象思维能力,善于发现各种不同技术的本质、不同技术之间的相似关系(更好的是同构关系)。这样我们就能够以不变应万变,对各种技术融会贯通,以较小的代价掌握新的技术。
同构:编程中的数学
作者:刘新宇
从数字、递归、对称、范畴、融合、无穷、悖论
七个方面介绍了计算机程序的数学基础和原理
作者在这本书中非常详细、清晰地阐述了与编程相关的一些基本数学概念和抽象方式,并将这些概念在实际的编程中展示出来,使用函数式编程语言在实际编程中展示良好的抽象是如何做的。读者通过阅读本书,将会得到一个全新的编程思维方式、良好的抽象能力,对编程中的数学概念有更清晰的理解(特别是对近年来关注度越来越高的函数式编程的一些基础概念,比如lambda演算、递归、代数数据类型、函子、自然变换等)。本书对后续学习函数式编程语言或者理解主流语言中的函数式特性会非常有帮助。
内容简介
本书从数字、递归、对称、范畴、融合、无穷、悖论七个方面介绍了计算机程序的数学基础和原理,并以“同构”概念为线索揭示出编程本质上是和数学同构的。第1章介绍皮亚诺算术公理系统,通过5条公理,构筑了计算机程序大厦的基石;通过单向链表、斐波那契数列等例子,展示了和自然数同构的计算结构。第2章介绍递归,通过欧几里得算法作为开端,最终把递归的数学原理构建在Lambda演算和Y组合子之上。第3章介绍对称群、环、域等抽象代数结构,解释了伽罗瓦理论这一抽象思维的明珠。第4章介绍范畴论,把列表、异常、多态、类型系统、复合数据结构等众多编程概念构筑在范畴论的基础上。第5章介绍融合律,它是进行算法推导和优化的有力工具。第6章介绍无穷,给出了康托尔的无穷集合论和超限数概念,介绍了编程中流的概念和无穷的关系。第7章以罗素悖论、可计算性和哥德尔不完全性定理结束本书,介绍了计算能力的边界和对编程基础哲学的影响。
本书还在各个章节中介绍相关数学家的人生经历和逸闻趣事,讲解他们如何克服困难、追求真理、创造奇迹,并穿插讲述编程、数学、艺术、音乐之间的有趣联系。
作者简介
刘新宇
亚马逊中国研发中心研发经理,负责分布式仓储物流系统的开发。1999年和2002年在清华大学自动化系分别获得学士和硕士学位。长期专注于函数式基础算法,著有《算法新解》一书(2017年出版)。
专家推荐
培根言:“数学是思维的体操。”而编程是一项高度复杂的思维活动。学习数学思想对编程的益处不言而喻。本书作者阅读了大量的数学典籍,以同构视角从中挑选了诸如递归、对称等精妙的数学思想,构思成书呈现给大家,非常难得!这是一本浓缩思想的书,言简意赅,值得我们细细品味。
赵俊民 北京荣耀终端有限公司软件架构师
本书不仅把代数系统中深奥的同构理论讲解得完整透彻,还把数学发展的历史脉络交代得清清楚楚,特别是把数学理论应用到实际生活的方方面面,让我作为一个数学爱好者受益匪浅。此书如今得以出版,能让更多数学爱好者有机会看到,着实令人开心。
李曲 浙江工业大学计算机学院教师
本书以浅显易懂的文字将数理逻辑、抽象代数和函数式编程的知识娓娓道来,这是我读过的最好的范畴论入门书籍,每个计算机相关专业的本科生都应该读一读这本书。
chirsz GitHub读者
初读这本书,感觉是在看大学教材,不过大学教材很少有这么多生动的故事来烘托和关联。细读这本书,才发觉现实开发中的许多任务原来可以做得更有趣也更花哨,就算要玩点把戏也不会被人一眼看穿。觉得本书太复杂也不要紧,不妨先浏览一遍,只要大致了解书中讲了什么就足够,然后常备在案头,需要的时候按图索骥,在数学方面绝对能超越大部分同行了。
余晟 《正则指引》作者
目录
上拉下滑查看目录 ↓
前言
第1章数字1
1.1数的诞生1
1.2皮亚诺自然数公理2
1.3自然数和计算机程序4
1.4自然数的结构6
1.5自然数的同构10
1.6形式与结构14
第2章递归16
2.1万物皆数16
2.2欧几里得算法18
2.2.1欧几里得和《几何
原本》19
2.2.2欧几里得算法概述19
2.2.3扩展欧几里得算法22
2.2.4欧几里得算法的意义26
2.3λ演算28
2.3.1表达式化简30
2.3.2λ抽象31
2.3.3λ变换规则31
2.4递归的定义35
2.5λ演算的意义36
2.6更多的递归结构38
2.7递归的形式与结构39
2.8附录:倒水趣题完整程序42
第3章对称43
3.1什么是对称43
3.2群46
3.2.1群的定义50
3.2.2幺半群与半群52
3.2.3群的性质55
3.2.4置换群58
3.2.5群与对称61
3.2.6旋转对称与循环群62
3.2.7分圆方程65
3.2.8子群66
3.2.9拉格朗日定理72
3.3环与域82
3.3.1环的定义84
3.3.2除环和域86
3.4伽罗瓦理论87
3.4.1扩域87
3.4.2从牛顿、拉格朗日到伽
罗瓦89
3.4.3自同构和伽罗瓦群95
3.4.4伽罗瓦基本定理96
3.4.5可解性98
3.5附录:伽罗瓦群 100
第4章范畴102
4.1范畴概述104
4.1.1范畴的例子106
4.1.2箭头≠函数110
4.2函子111
4.2.1函子的定义111
4.2.2函子的例子112
4.3积与和118
4.3.1积与和的定义120
4.3.2积与和的性质122
4.3.3积与和作为函子123
4.4自然变换126
4.4.1自然变换的例子127
4.4.2自然同构130
4.5数据类型131
4.5.1起始对象和终止对象131
4.5.2幂136
4.5.3笛卡儿闭和对象算术140
4.5.4多项式函子142
4.5.5F-代数143
4.6小结156
4.7扩展阅读158
4.8附录:例子代码158
第5章融合160
5.1叠加-构建的融合161
5.1.1列表的叠加操作162
5.1.2叠加-构建融合律163
5.1.3列表的构建形式164
5.1.4使用融合律化简165
5.1.5类型限制167
5.1.6用范畴论推导融合律168
5.2巧算100171
5.2.1穷举法171
5.2.2改进173
5.3小结和扩展阅读175
5.4附录:巧算100问题的代码175
第6章无穷177
6.1无穷概念的提出179
6.1.1无穷的哲学181
6.1.2穷竭法与微积分183
6.2潜无穷与编程186
6.3实无穷的思考191
6.3.1无穷王国的花园192
6.3.2一一对应与无穷集合194
6.3.3可数无穷与不可数无穷200
6.3.4戴德金分割203
6.3.5超限数和连续统假设205
6.4无穷与艺术209
6.5附录:例子代码214
6.6附录:康托尔定理的证明215
6.7附录:巴赫《音乐的奉献》
无限上升的卡农216
第7章悖论218
7.1计算的边界221
7.2罗素悖论222
7.3数学基础的分歧225
7.3.1逻辑主义225
7.3.2直觉主义227
7.3.3形式主义229
7.3.4公理集合论230
7.4哥德尔不完全性定理232
7.5不完全性定理的证明234
7.5.1构建形式系统234
7.5.2哥德尔配数237
7.5.3构造自我指涉238
7.6万能的程序与对角线证明239
7.7尾声240
附录241
加法交换律的证明241
积与和的唯一性242
集合的笛卡儿积和不相交并集构成积
与和的证明243
参考答案246
参考文献296