不论程序设计语言如何演变,总有那么一些知识是相对稳定的。
本书通过比较多种语言,追溯了语言共有特性——语法、控制流程、函数、异常、作用域、数据结构、并发、类、继承——的发展轨迹。尽管没有论述“惰性求值”,但瑕不掩瑜。
如何学习一门新语言?首先,明了它是如何表现共有特性的;其次,用它编写程序;最后,深入理解它的独有特性。
文摘
语言只是工具,程序设计语言的选用因使用者目的不同而不同,不同语言致力于达成不同的目的。
要保证代码的品质只能是尽早发现 bug 并及时修正它,发生错误应该停止操作并立刻报告。
静态作用域为函数创建局部的名-值对照表。
浮点数的数值本身就包含小数部分是何处开始的信息。
静态类型把变量名、保存数值的内存地址、内存中内容的类型作为一个整体;动态类型把类型的信息和数值看作一个整体。
并行执行的两个处理之间出现竞态条件,必须同时满足以下三个条件:
两个处理共享变量
至少一个处理会对变量进行修改
一个处理未完成之前另一个处理有可能介入进来
借助事务内存来解决锁的问题(陷入死锁、无法组合)。做法是先试着执行,如果失败则回退到最初状态重新执行,如果成功则共享这一变更。要注意的是:当写入的频率太高时,回退重新执行的操作就会被多次执行,这会导致性能下降。
类的三大作用:
整合体的生成器
可行操作的功能说明
代码再利用的单位
继承的实现策略大体可以分为三种:一般化与专门化、共享部分的提取、差异实现。继承已有的类并实现差异部分,很容易造成多层级的继承树,从而导致代码理解困难。
多重继承的问题——冲突,解决方法:
禁止多重继承(委托与接口)
按顺序进行搜索(C3 线性化)
混入式处理(混入小的、无法实例化的类)
Trait
C3 线性化对类进行编号以满足以下两个约束条件:
父类不比子类先被检查
如果是从多个类中继承下来则优先检查先书写的类
Trait 技术认为类具有两种截然相反的作用。一种是用于创建实例的作用,它要求类是全面的、包含所有必需的内容的、大的类。另一种是作为再利用单元的作用,它要求类是按功能分的、没有多余内容的、小的类。