簡體   English   中英

方案:繼續編譯

[英]Scheme: Compiling with continuations

我目前在 OCaml 中為方案的子集編寫編譯器,並且無法理解如何使用延續進行編譯。 我發現了一些很棒的資源,即:

使用 anormal-paper 中介紹的異常轉換,我現在有了代碼,其中 function 調用要么綁定到變量,要么返回。

例子:

(define (fib n)
  (if (<= n 1)
      n
      (+ (fib (- n 1)) 
         (fib (- n 2)))))

變成:

(define (fib n)
  (let ([c (<= n 1)])
    (if c
        n
        (let ([n-1 (- n 1)])
          (let ([v0 (fib n-1)])
             (let ([n-2 (- n 2)])
               (let ([v1 (fib n-2)])
                 (+ v0 v1)))))))

為了進行 cps 轉換,我現在必須:

  1. 為所有非原始函數添加 cont 參數
  2. 在尾部位置調用 cont 參數
  3. 轉換所有非原始 function 調用,使它們逃脫 let-binding 並成為一個額外的 lambda ,之前的 let-bound 變量作為唯一參數,之前的 let-body 作為主體

結果將如下所示:

(define (fib n k)
  (let ([c (<= n 1)])
    (if c
        (k n)
        (let ([n-1 (- n 1)])
          (fib n-1 
            (lambda (v0) 
              (let ([n-2 (- n 2)]) 
                (fib n-2
                  (lambda (v1) 
                    (k (+ v0 v1))))))))))

這個對嗎?

csmu 課程還討論了 CPS 中的程序如何不需要堆棧並且永不返回。 那是因為我們不需要保存要返回的地址,而閉包以及其他數據類型都存儲在堆上,並且使用閉包使引用保持活動狀態?

csmu 還談到了 call/cc 的脫糖:

(call/cc) => ((lambda (k f) (f k k)))

使用這種脫糖時,如何:

(+ 2 (call/cc (lambda (k) (k 2))))

在 MIT-Scheme 返回 4 中,因為當前的延續可能類似於顯示?

這個對嗎?

(define (fib n k)
  (let ([c (<= n 1)])
    (if c
        (k n)
        (let ([n-1 (- n 1)])
          (fib n-1 
            (lambda (v0) 
              (let ([n-2 (- n 2)]) 
                (fib n-2
                  (lambda (v1) 
                    (k (+ v0 v1))))))))))

你得到一個A+


csmu 課程還討論了 CPS 中的程序如何不需要堆棧並且永不返回。 那是因為我們不需要保存要返回的地址,而閉包以及其他數據類型都存儲在堆上,並且通過使用閉包來保持引用保持活動狀態?

確切地! 有關這種技術的深入閱讀,請參閱雞肉編譯過程


csmu 還談到了 call/cc 的脫糖:

 (call/cc) => ((lambda (kf) (fkk)))

那看起來不太對勁。 這是來自Matt Mightcall/cc的脫糖 -

call/cc => (lambda (f cc) (f (lambda (x k) (cc x)) cc))

使用延續編譯的想法的本質是,您希望對傳遞給每個 function 的 arguments 的評估下達命令,並在評估該參數后將其值發送給傳遞的延續。

以 CPS 形式重寫代碼的語言要求是尾遞歸的,否則它將堆疊空幀,然后僅返回。 如果實現語言不強制執行尾遞歸,則需要應用更復雜的方法來獲取 cps 代碼的非增長堆棧。

請注意,如果您這樣做,您還需要更改原語的簽名。 原語也將傳遞一個延續,但它們會立即在傳遞的延續中返回答案,它們不會創建其他延續。

關於理解如何使用延續進行編譯的最佳參考仍然是 Andrew W. Appel 的書,您不需要更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM