代码之髓

不论程序设计语言如何演变,总有那么一些知识是相对稳定的。

本书通过比较多种语言,追溯了语言共有特性——语法、控制流程、函数、异常、作用域、数据结构、并发、类、继承——的发展轨迹。尽管没有论述“惰性求值”,但瑕不掩瑜。

如何学习一门新语言?首先,明了它是如何表现共有特性的;其次,用它编写程序;最后,深入理解它的独有特性。

文摘

语言只是工具,程序设计语言的选用因使用者目的不同而不同,不同语言致力于达成不同的目的。

要保证代码的品质只能是尽早发现 bug 并及时修正它,发生错误应该停止操作并立刻报告。

静态作用域为函数创建局部的名-值对照表。

浮点数的数值本身就包含小数部分是何处开始的信息。

/assets/bookshelf/代码之髓/floating-point.jpg

IEEE 754 中单精度二进制浮点数的原理图

静态类型把变量名、保存数值的内存地址、内存中内容的类型作为一个整体;动态类型把类型的信息和数值看作一个整体。

并行执行的两个处理之间出现竞态条件,必须同时满足以下三个条件:

  • 两个处理共享变量

  • 至少一个处理会对变量进行修改

  • 一个处理未完成之前另一个处理有可能介入进来

借助事务内存来解决锁的问题(陷入死锁、无法组合)。做法是先试着执行,如果失败则回退到最初状态重新执行,如果成功则共享这一变更。要注意的是:当写入的频率太高时,回退重新执行的操作就会被多次执行,这会导致性能下降。

类的三大作用:

  • 整合体的生成器

  • 可行操作的功能说明

  • 代码再利用的单位

继承的实现策略大体可以分为三种:一般化与专门化、共享部分的提取、差异实现。继承已有的类并实现差异部分,很容易造成多层级的继承树,从而导致代码理解困难。

多重继承的问题——冲突,解决方法:

  • 禁止多重继承(委托与接口)

  • 按顺序进行搜索(C3 线性化)

  • 混入式处理(混入小的、无法实例化的类)

  • Trait

C3 线性化对类进行编号以满足以下两个约束条件:

  • 父类不比子类先被检查

  • 如果是从多个类中继承下来则优先检查先书写的类

Trait 技术认为类具有两种截然相反的作用。一种是用于创建实例的作用,它要求类是全面的、包含所有必需的内容的、大的类。另一种是作为再利用单元的作用,它要求类是按功能分的、没有多余内容的、小的类。