美文网首页
Positioning SICP 5: Computing wi

Positioning SICP 5: Computing wi

作者: 牛头酋长 | 来源:发表于2020-11-14 10:03 被阅读0次

作者:何岩,recreating.org出品,谢绝转载。
阅读SICP,站在Lisp发明者的上帝视角来思考:“我为什么要这么设计Lisp?”

0.前言

1)本章开始,进入硬件层面,如何用硬件来模拟Lisp解释器,本质上等价于,如何用硬件来模拟Lambda演算。只有连接到物理世界,计算才可能真正发生。
2)首先用寄存器系统来模拟简单计算过程
3)发明一种寄存器语言来描述寄存器系统的物理现实。
3)再用lisp语言来模拟寄存器语言,就等于是用lisp来模拟寄存器系统的运行,这样的目的是可以用文字来表达寄存器系统,否则用图像来表达真实的寄存器系统的设计成本太高。
4)再用寄存器语言构建出lisp解释器。就等于有一个硬件可以解释器lisp语言。就等于计算可以自动的发生在物理世界。
5)当然,本书缺少的一部分是,更底层的寄存器是如何用继电器来实现的。这部分可以看这本书《编码的奥秘》,探索到最底层,可以知道,所有的一切都由电磁效应这个物理规律所承载,但是电磁感应如何成立呢?
6)电磁感应就是光的解释器。

Chapter 5.1 Designing Register machines

1.目的:用机器来模拟计算

例如:模拟gcd

(define (gcd a b)
    (if (= b 0)
        a
        (gcd b (remainder a b))))

用画图来表示寄存器机器,分为两个部分
1.Data path


image.png

2.Controller


image.png

这两个部分都是硬件,尤其是控制部分,也是由硬件的组合来表达。

2.用一种机器语言来描述寄存器机器

(controller
    test-b
        (test (op =) (reg b) (const 0))
        (branch (label gcd-done))
        (assign t (op rem) (reg a) (reg b))
        (assign a (reg b))
        (assign b (reg t))
        (goto (label test-b))
    gcd-done)

Chapter 5.2 A Register-Machine Simulator

1.目的:用lisp来模拟寄存器机器语言

启发:如果可以用机器语言来描述一个机器,再用lisp编程语言来描述机器语言,就等于用计算机实现了对现实的模拟。
Why?为什么不直接用Lisp描述机器呢?为什么中间多了一个计算机语言?
因为计算机语言更接近机器的运行逻辑。
这就是分层思维,当然,lisp语言可以之间描述机器行为,但是会比较复杂。
这也是DLS的意义,领域语言。一个业务领域,对应一个领域语言。Lisp是实现领域语言的最佳选择。

2.效果演示如下:

(define gcd-machine
    (make-machine
        '(a b t)
        (list (list 'rem remainder) (list '= =))
        '(test (op =) (reg b) (const 0))
        (branch (label gcd-done))
        (assign t (op rem) (reg a) (reg b))
        (assign a (reg b))
        (assign b (reg t))
        (goto (label test-b))
    gcd-done)))

(set-register-contents! gcd-machine 'a 206)
done

(set-register-contents! gcd-machine 'b 40)
done

(start gcd-machine)
done

(get-register-contents gcd-machine 'a)
2

3.如何实现Machine Language

(define (make-machine register-names ops controller-text)
    (let ((machine (make-new-machine)))
        (for-each (lambda (register-name)
                    ((machine 'allocate-register) register-name))
                    register-names)
        ((machine 'install-operations) ops)
        ((machine 'install-instruction-sequence)
         (assemble controller-text machine))
        machine))

registers

(define (make-register name)
    (let ((contents '*unassigned*))
        (define (dispatch message)
            (cond 
                ((eq? message 'get) contents)
                ((eq? message 'set)
                    (lambda (value) (set! contents value)))
                (else
                    (error "Unknown request -- REGISTER" message))))
        dispatch))

(define (get-contents register)
    (register 'get))

(define (set-contents! register value)
    ((register 'set) value))

The stack

(define (make-stack)
    (let ((s '()))
        (define (push x)
            (set! s (cons x s)))
        (define (pop)
            (if (null? s)
                (error "Empty stack -- POP")
                (let ((top (car s)))
                    (set! s (cdr s))
                    top)))
        (define (initialize)
            (set! s '())
            'done)
        (define (dispatch message)
            (cond
                ((eq? message 'push) push)
                ((eq? message 'pop) (pop))
                ((eq? message 'initialize) (initialize))
                (else (error "Unknown request -- STACK" message))))
        dispatch))

(define (pop stack)
    (stack 'pop))

(define (push stack value)
    ((stack 'puch) value))

The basic machine

(define (make-new-machine)
    (let ((pc (make-register 'pc))
            (flag (make-register 'flag))
            (stack (make-stack))
            (the-instruction-sequence '()))
...

Chapter 5.4 The Explicit-Control Evaluator

用硬件来实现Lisp的解释器

eval-dispatch
    (test (op self-evaluating?) (reg exp))
    (branch (label ev-self-eval))
    (test (op variable?) (reg exp))
    (branch (label ev-variable))
    (test (op quoted?) (reg exp))
    (branch (label ev-quoted))
    (test (op assignment?) (reg exp))
    (branch (label ev-assignment))
    (test (op definition?) (reg exp))
    (branch (label ev-definition))
    (test (op if?) (reg exp))
    (branch (label ev-if))
    (test (op lambda?) (reg exp))
    (branch (op lambda?) (reg exp))
    (test (op begin?) (reg exp))
    (branch (label ev-begin))
    (test (op application?) (reg exp))
    (branch (label ev-application))
    (goto (label unknown-expression-type))

相关文章

网友评论

      本文标题:Positioning SICP 5: Computing wi

      本文链接:https://www.haomeiwen.com/subject/sybibktx.html