《代码的未来》读书笔记

第一章  代码的时间和空间

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.

 

 

 

相关推荐