代码的未来----读书笔记(1)

来源:互联网 发布:蘑菇街互刷软件 编辑:程序博客网 时间:2024/05/21 17:36

第1章 编程的时间和空间

       其实是在介绍摩尔定律和目前计算机的硬件的设备等

 

第2章编程语言的过去、现在和未来

1、近年来,为了提供更丰富的内容,更倾向于让JavaScript在浏览器上运行,这实际上是“客户端/服务器系统(C/S)”换个马甲又复活了

 

2、20年后的编程语言,应该是在分布处理(多台计算机协作处理)和并行处理(多个cpu协作处理)功能上进行强化,使得开发者不需要特别花心思就能够使用这些功能

 

3、原来在编译原理上出现的yacc和lex分别是unix中的词法分析器工具盒词法分析器生成工具

 

4、元编程

       描述数据所具有的结构的数据,也就是关于数据本身的数据,被称为元数据、小说中的角色如果知道自己所身处的故事是虚构的,这样的小说被称为元小说;由此可知,元编程的概念是“用程序来编写程序”

(1) 对比了一下ruby和lisp,说明ruby中大部分信息都可以很容易地被访问和操作,但其实这种优势是很早就出现在lisp上面了

(2) 原来虚拟机、异常处理、垃圾回收这些概念最早已经在lisp中得到了实现

(3) 像虚拟机、字节码解析器其实是Smalltalk所使用的技术

(4) 元编程的可能性与危险性

       在ruby和lisp这样的语言中,由于程序本身的信息是可以被访问的,因此在程序运行过程中也可以对程序本身进行操作,这就是元编程。使用元编程技术,可以实现通常情况下无法实现的操作。例如:

require 'builder'builder = Builder::XmlMarup.newxml = builder.person {|b|b.name("Jim")b.phone("555-1234")

#=><person><name>Jim</name><phone>555-1234</phone></person>

       由于XML中并没有事先规定要使用哪些标签,因此在库中对标签进行预先定义是不可能的。于是,在Builder库中,是通过元编程技术,用钩子截获要调用的方法,来生成所需的标签的

       一方面通过元编程技术队无法预先确定的操作进行了应对,这样一来,未来的可能性就不会被禁锢,体现了语言的灵活性

       另一方面,元编程技术如果用得太多,程序不好理解。例如,上面的代码中,怎么也找不到person方法的定义,如果没有元编程知识的话,要理解源代码就很困难。和宏一样,元编程的使用也需要掌握充分的知识,并遵守用量和用法。

 

5、内存管理

GC的三种基本方式

(1) 标记清除方式

       还能够对对象进行引用的,就标记起来,不能引用的则不标记;最后把没有标记的都清除掉

(2) 复制收集方式

       新开辟一个空间,把能引用的对象进行拷贝进来,结束后释放旧的空间

(3) 引用计数方式

       在每个对象中保存该对象的引用方式,当引用发生增减时对技术进行更新;计数为0则清除

缺点:

       最大的缺点是无法释放循环引用的对象;第二个缺点是,必须在引用发生增减时对引用计数做出正确的增减,漏掉了某个就会引发很难找到原因的内存错误;第三个缺点是并不适合并行处理。

 

GC的基本算法,大体上都逃不出上述三种方式以及它们的衍生品。现在,通过对这三种方式进行融合,出现了一些更加高级的方式,比如下面的三种:

a、分代回收

       分代回收的基本思路,是利用了一般性程序所具备的性质,即大部分对象都会在短时间内成为垃圾,而经过一定时间存活的对象往往拥有较长的寿命。比如,对象按照生成时间进行分代,刚刚生成不久的为新生代,较长时间的对象划分为老生代;

       进行一次常规扫描,找到“存货”对象。这个步骤采用标记清除或者是复制复制收集算法度可以。

       那么这种情况比较难处理,老生代对新生代的一个引用;这时需要引入一个记录集,对这种情况进行记录

b、增量回收

       有时候为了维持程序的实时性,不等到GC全部完成,而是将GC操作细分成多个部分逐一执行,这种方式就是增量回收。

       因为是增量,所以会出现已经被标记清除的对象,又被引用,导致明明“存活”的对象却被回收掉了。

       所以和上面的一样,要加入写屏障

c、并行回收

       多个核上面进行GC?

 

6、异常处理

       异常处理功能就是为了将程序员错误处理的负担尽量减轻而产生的一种机制。21世纪的编程语言中,绝大部分都具备了。

 

7、闭包

(1) 函数对象,在c语言中一般认为是函数指针。也就是讲函数作为值来利用的方法,其最大的用途就是高阶函数。所谓高阶函数,就是用函数作为参数的函数,比如我们可以在使用qsort的时候,传入一个比较规则的函数指针,用这样的形式来使qsort函数更加的方便。

(2) 函数指针的局限

       “对外部(局部)变量的访问”是C语言函数指针的最大弱点?

(3) 为了克服2的缺点而出现了闭包

       作者举了一个js的例子:

function extent(){var n = 0;return function(){n++;console.log("n="+n);}}f = extent();f(); // 输出n=1f(); // 输出n=2

也就是说,局部变量n,在被函数对象给“封闭”在里面了,从而能把值保存了下来

(4) 总结一下

其实闭包,就是带有上下文的函数,c11有lambda表达式,boost库中也能实现闭包

 

第3章 编程语言的新潮流

1、语言的设计

js是客户端语言的代表,Java其实也在客户端活跃过(Applet)。

Java在服务器端获得成功的四大理由:

(1) 可移植性

(2) 功能强大

(3) 高性能

(4) 丰富的库

 

2、go语言

(1) 并发编程

       go对并发编程做了一系列的设计,包括支持内存空间共享、使用自动增长栈的segmented stack技术、利用通道作为goroutine之间的通信手段(通过使用通道,就基本上不必考虑互斥锁等问题)

(2) 垃圾收集

(3) go也不是一种十全十美的语言,它也有诸多的不足。如数组、字典等特殊对待的部分,以及作为一种静态语言,总归还是需要对泛型做出一定的支持等

(4) go语言是为了替代c/c++产生的?

 

3、Dart

(1) google推出的,打算用来替代js的web前端语言

(2) js的缺点

       无法应对复杂的互联网应用程序;无法进行高速化;不支持多核/GPU

(3) Dart的特征

       基于类的对象系统、非强制性静态类型

 

4、CoffeeScript

又是一种打算替代js的语言,使用了粉黛垃圾回收;编译器是用js编写的,也就是说,只要有js,CoffeeScript编写的程序就可以在浏览器上直接运行,CoffeeScript利用这个优势,无论在服务器端还是客户端,今后其应用范围都会越来越广,可以说是将来值得期待的语言之一。

 

5、Lua

       这个自然不必说了,嵌入式、游戏开发领域目前最红的脚本语言。速度可以和c++相媲美,自带有垃圾收集器。在多线程环境中,通过为每个线程分配解析器,可以最大限度发挥多核的性能。


0 0
原创粉丝点击