《代码的未来》读书笔记
第一章 代码的时间和空间
1.1编程的本质
创建出一种人类和计算机都能理解的语言(编程语言),并通过这样的语言将人类的意图传递给计算机,这样的行为叫编程.
编程的本质是思考.
人类到底想要什么?想要这些东西的本质是什么?要实现这个目的需要哪些操作步骤?
因此,编程是人来完成的工作,因此我不相信未来计算机可以自己编程.
能够按照自己的意愿创造世界,是编程的最大魅力所在.
1.2预测未来
IT领域的未来容易预测的根本理由:从计算机的出现到现在已经过了半个世纪,但计算机的基本架构没有变化.
第二章编程语言的过去/现在和未来
2.1编程语言的世界
最早的编程语言是FORTRAN.
自动生成机器语言的程序,叫汇编器.
编程语言是编程者根据自己的需要发明出来的.
目前主流语言:系统描述语言C/C++,商务语言Java,Web领域热门的Ruby/Perl/Python/PHP.
编程语言是在不断的试错中发展起来的.
从编程语言进化过程看,一个关键词是”抽象”.编程语言进化的动机,不是工具和语言本身的简化,而是通过这些工具和语言所得到的结果更简洁的表达出来.
2.2DSL特定领域语言
优势:提高了生产线率,让程序在整体上以更整洁的方式表达.
DSL并不仅仅是一种技术,而是应用程序开发的重要设计原理和原则之一,适用于任何软件开发.
2.3元编程
元编程:用程序编写程序
获取和变更程序本身的功能称之为反射.
Lisp早期的编译器早就具备的垃圾回收的机制,比Java早。
程序在运行过程中也可以对程序本身进行操作的过程叫做元编程。
2.4内存管理
计算机系统通过双重“幻觉”,让我们觉得内存无限:GC机制、虚拟内存机制。
将内存管理,尤其是内存空间的释放实现自动化,就是GC。
将“死亡”对象找出来,并作为垃圾进行回收,就是GC的本质。
GC的三种方式:标记清除方式(变形:标记压缩方式)、复制收集方式(提高了内存使用的局部性)、引用计数方式。
GC算法的改良剂高阶算法:分代回收、增量回收/并行回收
分代回收
像这种只扫描新生代对象的垃圾回收操作,被称之为小回收.具体步骤是:
1)从根开始1次常规扫描,找到”存活”对象.这个步骤采用标记清除或复制收集(大部分)算法都可以.
2)将存留下来的对象划分到老生代.
若遇到来自老生代对新生代对象的引用,为了不让它被误认为”死亡”,在分代回收中会对对象的更新进行监视,将从老生代对新生代的引用,记录在一个叫做记录集的表中,在执行回收的过程中,记录集也作为根.
对全部区域为对象的GC操作叫做完全回收或大回收.分代回收通过减少GC中扫描的对象数量,达到缩短GC带来的平均中断时间的效果.
检查程序需要对所有涉及对象内容的地方进行保护,因此被称为写屏障.
增量回收
实时性高的系统更重视缩短GC的最大中断时间.
将GC细分为多个部分逐一执行,这种方式叫增量回收.
为了防止已经完成扫描和标记的对象呗修改,对新的对象产生了引用,以至于新对象不被标记而误认为死亡,也要写屏障.
当已经被标记的对象的引用关系发生变化时,通过写屏障会将新被引用的对象作为扫描的起点记录下来.
并行回收
利用多CPU的处理能力进行GC的操作叫并行回收.
并行回收的原理:在原有的程序运行的同时进行GC的操作.利用多CPU的性能,尽可能让这些GC任务并行执行
并行回收也要写屏障对当前的状态信息保持更新。
GC大统一理论
IBM的Davaid F。 Bacan 于2004年发表《垃圾回收的统一理论》——任何一种GC算法都是跟踪回收(标记清除和复制收集)和引用计数回收2中思路的结合。
2.5异常处理
产生异常的应对:中断执行或清除异常产生的原因并重试。
2.6闭包
函数对象不一定是闭包;但要理解闭包需要充函数对象谈起
函数对象:作为对象来使用的函数
函数对象也即将函数作为值来利用的方法,其最大用途是高阶函数(用函数作为参数的函数---可以提高通用性)
要理解闭包,需要理解:
作用域:变量的有效范围
生存周期:变量的存在范围
从属于外部作用域的局部变量,被函数对象给封闭在里边了—闭包
在函数对象中,将局部变量这一环节封闭起来的结构叫做闭包
C语言的函数指针不是闭包;JavaScript的函数才是闭包
第三章编程语言的新潮流
3.1语言的设计
Java成功的特点:可移植性、功能强大、高性能、丰富的类库
3.2 Go
2009年11月Google发布
3.3 Dart
2011年10月Google发布
3.4 CoffeeScript
用JavaScript实现的用于编写JavaScript的方便语言。
3.5Lua 巴西人开发
第四章云计算时代的编程
4.1可拓展性
DHT(分布式散列表),将散列表在分布式环境中进行实现的技术的统称.
算法包括:CAN,Chord,Pastry,Tapestry等.数据会以多份副本保存.
运用DHT的NoSQL型数据库KV数据库(如Roma DB)
4.2C10K问题(Client 10000 Problem,即在同时连接服务器的客户端数量超过10000个的环境中,即便硬件性能足够,依然无法正常提供服务)
在使用套接字Socket的网络连接中,不能忽视第一次连接索要的开销.在HTTP访问中,如果对一个个的小数据传输请求每次都进行套接字连接,当访问数据增加时,反复连接所需要的开销是巨大的.
为了避免这种浪费,从HTTP 1.1 开始,对同一台服务器产生的多个请求都通过相同的套接字连接完成,即Keep-alive技术.
4.3HashFold(MapReduce的变体)
以散列表的方式接受Map后的数据,然后通过Hold过程实现对散列表元素的去重.
当进程数量过多时,几乎所有的时间都消耗在对硬盘的访问,实际的处理则陷入停滞,产生抖动.
为此的优化:写时复制技术:创建子进程时,对于所有的内存空间并非一开始就创建副本,而是进行共享,只有当实际发生对数据的改写时才进行复制.以此减少对内存的浪费
4.4进程间的通信
同一台计算机上的进程通信:管道,消息,信号量,共享内存,TCP套接字,UDP套接字,UNIX域套接字.
第五章支持大数据的数据存储技术
5.1 KV键值存储
大规模环境中的CAP(由ACID演化):一致性(Consistency),可用性(Availability),分裂容忍性(Partition Tolerance),满足三个条件中的2个.
5.2 NoSQL
类型:KV型,面向文档型(如CouchDB,MongoDB:不具备事务,分数据库/几何/文档三层,采用乐观并发控制),面向对象型.
5.4SQL DB的反击
对SQL数据库进行分割;
MYSQL:Spider存储引擎
VoltDB:面向特定领域的DB,内存DB系统
5.5 Memcached及小伙伴
用于高速访问的缓存(对数据访问的局部性)
缓存:可以高速访问,以改善性能为目的,仅用于临时存放数据,数据是否放于缓存中,不产生性能以外的其他影响.
Memcached提供缓存,主要面向Web应用,对DB的查询进行缓存处理.
其他: MemcacheDB,Roma,Flare,Tokyo Tyrant,Kumofs.Redis.