计算机程序的构造和解释(第二版)笔记

计算机程序的构造和解释(第二版)

跳转至: 导航、 搜索
  1. define
  2. cond
  3. if (else)
    1. special form,不能实现为对cond的封装(why?)
  4. and or not
  5. sqrt
  6. 形参应该可以统一换名:‘作弊检测程序’?
  7. 内部定义:嵌套的define(块结构)
    1. 词法作用域:内部程序共享的变量可以作为自由变量
  8. 线性递归(gcd)
  9. 尾递归(Scheme解释器必须支持TCO)
  10. 树状递归(fib)
    1. 灵巧的编译器:--> 迭代形式(参考TLS:关键是推断出额外的语义变量?)
  11. Lame定理:如果gcd需要k步计算m,n的最大公约数,则min(m,n)>=Fib(k)
  12. 能够骗过Fermat检查的称Carmichael数,561 1105 1729 2465 ...
  13. Miller-Rabin检查
  14. lambda
  15. let
  16. fixed-point:guess-next
  17. (cont n d k):连分式
  18. 第一级过程:必须为自由变量分配空间
  19. 序对(tuple?):可用cons、car、cdr来实现
    1. (cons x y)返回的值是一个过程,作用于0得到x?
  20. 区间:make-interval
    1. 数值计算的精度问题
  21. list
    1. map
    2. for-each:不收集结果
  22. 层次式数据结构:
    1. cons作用于list
    2. ‘序列’抽象
      1. (define (filter predicate sequence) ...
      2. (define (accumulate op initial sequence) ...
        1. --> fold-left/right
  23. 多项式求值:Horner规则(最优) A.M.Ostrowski, 1954
  24. flatmap?map的结果再包一层accumulate
    1. queens:为什么flatmap里交换参数顺序会使计算很慢?
  25. e.g. 一个图形程序(分形?) transform-painter
  26. 符号数据:'
    1. 引入特殊形式quote恢复语言的一致性
    2. deriv 求导
  27. e.g. 集合
    1. intersection-set
    2. 集合作为二叉树(应该是说‘用二叉树实现集合’吧):
      1. element-of-set?(归并树)
      2. (adjoin x set)
      3. lookup
  28. e.g. Huffman编码树
  29. 抽象数据的多重表示
    1. complex
    2. 数据导向的程序设计:基于类型的dispatch?转换表?
    3. apply-generic:在复杂类型层次中的搜索。。。
  30. e.g. 符号代数
    1. 多项式计算
  31. GCD计算是所有需要完成有理函数操作的系统的核心
    1. 概率方法:Richard Zippel,1979
  32. 对于系统结构2种不同的‘世界观’:对象、流
  33. account:withdraw
  34. set!
  35. begin?
  36. rand:random-init rand-update
  37. p159 代数互换的本质是,符号不过作为值的名字 ...
  38. ‘同一’的可以相互替换:引用透明性
  39. 使用‘赋值’的命令式程序:强迫人们去考虑赋值的相对顺序,以保证变量更新的都是正确的版本
  40. ?一个环境就是框架(frame)的一个序列 —— Stack frame?
  41. 求值的代换模型 => 求值的环境模型(自底向上?自顶向下?)
  42. set-car! set-cdr!
    1. + get-new-pair 可实现cons操作
    2. 队列(front,rear)
  43. table?一维、2维、任意维
  44. memoize
  45. e.g. 数字电路的模拟
    1. half-adder
    2. full-adder
    3. make-wire
    4. get-signal
    5. add-action!
    6. after-delay 待处理表
    7. 约束传播:约束系统、连接器
  46. 并发
    1. 串行化
      1. parallel-execute
      2. make-serializer:确保parallel-execute不会交错执行(同步互斥锁?)
    2. mutex
    3. test-and-set!
    4. 屏障同步:PowerPC指令sync eieio
    5. ×在本质上看,在并发控制中,任何时间概念都必然与通信有内在的密切联系
    1. p221 从表面上看,流也就是表(#see Haskell type class?)
    2. stream-car cons-stream stream-filter stream-map ...
    3. delay force
  47. p252 交错级数的加速序列?
  48. P255 interleave?无穷流?
  49. integral 积分电路?
  50. e.g. 。。。为什么是信号处理???
  51. p244 ML的多态数据类型?
  52. p245 随机数的流
    1. (define random-numbers (cons-stream random-init (stream-map rand-update random-numbers)))
    2. Cesaro试验?monte-carlo过程计算pi?
  53. 用流模拟一个变化的量?(Haskell的IO Monad?)
    1. 并发:流的‘归并’?
  54. 元语言抽象:构造自己的求值器(解释器)
    1. 标准Scheme:顺序求值的限制
    2. 正则序求值?
    3. 不确定顺序?
    4. 元循环:用被求值的语言写出的此语言的求值器
      1. 模型:实际表现为eval和apply的相互作用
        1. 子表达式及运算符组合
        2. 函数调用:构造对应的‘环境’
    5. p253 (define eval (exp env) (cond ((self-evaluating? exp) exp)
      ((variable? exp) (lookup-variable-value exp env))
      ((quoted? exp) (text-of-quotation exp))
      ...
    6. (define apply (procedure arguments) (cond
      ((primitive? procedure) (apply-primitive procedure arguments))
      ((compound? procedure) (eval-sequence
      (procedure-body procedure)
      (extend-environment (procedure-parameters procedure) arguments (procedure-environment procedure))))
  55. p255 list-of-values:总是从右向左(或相反)求值运算对象,无论基础的Lisp采用什么求值顺序?
  56. p259 这种用户定义变换称为宏,但引入了一个微妙的名字冲突问题 ...
  57. let*,命名let,。。。
  58. 运行求值器:setup-environment(恩,想起了v8里的runtime函数。。。)
    1. driver-loop:REPL
  59. 内部定义(对前面求值器实现局部变量的改进)
    1. 。。。为此只需在求值如何值表达式之前,在当前环境里建立起所有的局部变量
    2. lambda?
    3. p271 letrec:变量和约束都是同时建立的??这样也就允许了约束的递归
    4. p272 确实有可能不用letrec(甚至define)描述递归过程,但方式要微妙得多。。。
      1. 这里的例子是Y组合子吗?(lambda作用于lambda!)
  60. 将语法分析与执行分离(?中间代码?VM?):编译器
    1. eval:分为2个部分,analyze返回一个‘执行过程’(lambda对象)
  61. Scheme变形:惰性求值
    1. 正则序(Haskell)和应用序(Scheme)
    2. 严格与非严格:cons??
    3. 一个采用惰性求值的求值器:基本想法:延时参数不求值,转换为thunk对象
      1. 对thunk中表达式求值的过程:force
        1. 记忆第一次force的结果:按需调用;不记忆:按名调用
    4. p283 关于‘副作用’的复杂讨论:eval-sequence、for-each
    5. p284 ‘有了惰性求值后,流和表就完全一样了’
  62. Scheme变形2:非确定性计算(自动状态空间搜素?类似Prolog的声明式语言?)
    1. 或Python的list comprehension?
    2. (list (amb 1 2 3) (amb 'a 'b))
    3. p289 ‘深度优先搜索’or‘按照历史回溯’
    4. 脚注251:‘依赖导向的回溯’=>‘真值保持’
    5. 逻辑编程?
    6. 实现amb求值器:‘执行环境’和2个‘继续过程’(对应成功/失败分支,实现回溯的关键)
    7. p297 可能需要撤销(undo)副作用过程?
    8. p298 amb求值器中最复杂的问题,也就是那些将‘继续过程’在相互调用的执行过程之间传来传去的机制
  63. 逻辑程序设计
    1. p305 脚注262:合一算法和归结原理;Prolog的线性Horn子句
    2. e.g. Microshaft人事数据库(搞笑~):这有点像早期IBM的某个数据库;基于模式的查询系统
  64. p322 为数理逻辑提供过程性解释的问题:死循环~!
    1. not
    2. P(x) :- P(f(x))
  65. 寄存器机器里的计算
    1. 数据通路 & 控制器?
    2. GCD:remainder 不停地做减法?
    3. 子程序?continue寄存器:保存程序调用后的返回地址?
    4. 采用堆栈实现递归:save restore
    5. 控制器指令:(这已经是native compiler了吧?)
    6. 汇编程序
      1. extract-labels
        1. receive过程?
      2. update-insts!
    7. p366 3.2.3 为指令生成执行过程?(再重新用Scheme实现控制器指令的解释执行???靠)-->‘模拟’
      1. assign
      2. test、branch、goto
      3. make-perform ?
    8. 监视机器执行(ring0/kernel debugger?)
      1. make-stack
      2. make-register
  66. 存储分配和GC(靠,这书是台湾人翻译的?)
    1. 存储看作向量:vector-ref vector-set!
    2. 无穷存储的假象:
      1. 例:(accumulate + 0 (filter odd? (enumerate-interval 0 n)))
      2. p379 ‘停止并复制’
        1. root寄存器:working和free区域;将所有root可达对象从working复制到free,然后交换working/free?
      3. 脚注300 另一种方法:‘mark-and-sweep’
  67. 显式控制的求值器
    1. 一个堆栈和7个寄存器:exp env val continue proc argl unev
    2. eval-dispatch
    3. apply-dispatch
    4. 尾递归
    5. 求值器的执行:eceval 3层模拟???
      1. 错误处理,signal-error
  68. 编译
    1. p398 脚注319:实际上,这种编译器可以比解释器做得更简单。。。
    2. (define (compile exp target linkage) ...
    3. p403 脚注321:反引号
    4. p411 脚注325:... 事实上,复杂的Lisp编译器也可以用堆栈保存实参而又不破坏尾递归 ...
    5. 指令序列的组合:append-instruction-sequences
      1. preserving
      2. tack-on-instruction-sequence
    6. p428 在一种新机器上实现Lisp:修改代码生成器(后端),为新机器生成代码;然后编译这个编译器本身!
    7. p430 代码生成器的C语言后端 

你可能感兴趣的:(Scheme,lambda,SICP,compiler,编译器)