王垠
王垠[yín],四川大學97級本科畢業,保送到清華大學計算機系直博。期間曾在清華大學計算機系軟件工程專業就讀,主要進行集成電路布線算法的研究。在此期間,他因《完全用GNU/Linux工作》一文和對TeX的推廣等“非研究成果的業余東西”而出名。 在只剩一年就要博士畢業的時候,他申請退學,并將1萬7千余字的“退學申請書”(題為清華夢的粉碎)公布在網上,引起輿論界一時對教育體制、理想主義等的熱議。
王垠的40行代碼
![王垠的40行代碼是什么_王垠40行代碼專家解讀](http://file.elecfans.com/web1/M00/4E/F6/pIYBAFrN3RaANQIPAADedI7Jh6Q248.png)
![王垠的40行代碼是什么_王垠40行代碼專家解讀](http://file.elecfans.com/web1/M00/4E/F6/pIYBAFrN3SqAT0s7AAC-9DFwngs484.png)
![王垠的40行代碼是什么_王垠40行代碼專家解讀](http://file.elecfans.com/web1/M00/4E/F6/pIYBAFrN3T-AdHNYAACLPEl7hyI160.png)
40行代碼專家解讀
1. 背景知識
CPS: Continuation-Passing Style. 有一篇介紹 CPS 通俗易懂的文章(中文翻譯)。
簡單來講,CPS 是一種編程風格:
Javascript:
(原味)
function foo(x) {
return x ;
}
(CPS)
function cps_foo(x, return_point) {
return return_point (x) ;
}
CPS 多了一個參數 return_point,return_point 來自 caller ,是 caller 所在的“世界”,caller 將這個“世界” 傳遞給 callee (cps_foo),這樣 cps_foo 就無須利用額外的工具(比如堆棧)去查詢 caller 的世界在哪里,以便返回,而是直接進入這個世界:return_point (x)。 這便是 CPS 的初衷 —— 去掉層層嵌套的世界。行話講就是 desugar(脫糖)。Syntax sugar 是為了方便人類的表達和理解,給編程語言的核心套上的一層好吃好看的外衣,而對機器對程序的解釋,需要將其還原到最本質的結構,以便機械化處理和優化,這 就是脫糖的意義。
以函數式編程的觀點來看,return_point 是一個函數,以 C 觀點來看,你可以把它理解為程序地址,或者,以 Matrix 來看,它是 key-maker 打開門進入新世界的那把鑰匙。“世界”上只有一個巨大的程序(比如,你的程序不過是在 chrome 里面運行的一個小程序,而 chrome 又是在 OS 里面的一個小程序),return_point 將各種小程序竄連起來了。恩,差不多就是這個意思。只不過,在函數式程序里面(比如Scheme)里面,return_point 是函數,而在過程式程序(比如C)里面它更像是 0x4f36a0c4。
這段 40 多行代碼是給 Scheme 程序脫糖的程序,屬于解釋器的代碼,而不是應用代碼。對其的客觀評價顯然只有設計解釋器的人才能給出。對應用程序員的意義在于,發現每天上班時編寫的代碼多么無聊,此外并沒有任何實用價值。
2. 運行結果
‘x
’(lambda (x k) (k x))
‘(lambda (x k) (x 1 k))
’(f x (lambda (v0) (if v0 a b)))
‘(if x (f a (lambda (v0) v0)) b)
’(lambda (x k) (f x (lambda (v0) (if v0 (k a) (k b)))))
‘(lambda (x k) (let ((k (lambda (v0) (if v0 (k c) (k d))))) (if x (f a k) (k b))))
’(lambda (x k) (let ((k (lambda (v0) (if v0 (k c) (k d))))) (if x (k (zero? a)) (k b))))
‘(lambda (x k) (if t (if x (f a k) (k b)) (k c)))
’(lambda (x k) (let ((k (lambda (v0) (if v0 (k e) (k w))))) (if t (if x (f a k) (k b)) (k c))))
‘(lambda (x k) (let ((k (lambda (v0) (h v0 k)))) (if x (f a k) (k b))))
’(lambda (x k) (let ((k (lambda (v0) (v0 c k)))) (if x (f g k) (k h))))
‘(f a (lambda (v0) (g b (lambda (v1) (v0 v1 (lambda (v2) (f c (lambda (v3) (g d (lambda (v4) (v3 v4 (lambda (v5) (v2 v5 (lambda (v6) v6))))))))))))))
’(lambda (n k)
((lambda (fact k) (fact fact (lambda (v0) (v0 n k))))
(lambda (fact k)
(k
(lambda (n k)
(if (zero? n)
(k 1)
(fact
fact
(lambda (v1) (v1 (sub1 n) (lambda (v2) (k (* n v2))))))))))
k))
120
原代碼中最后一句 ((eval fact-cps ) 5 (lambda (v) v)) 在 racket 中要修改為:
((eval fact-cps (make-base-namespace)) 5 (lambda (v) v)) 才能通過算得 120。
3. 注釋
![王垠的40行代碼是什么_王垠40行代碼專家解讀](http://file.elecfans.com/web1/M00/4E/F6/pIYBAFrN3ceAY8sdAAnA7NaLG98750.png)
4. 要點
ctx: 函數在執行(apply)時候的上下文環境,可理解為 C 程序中運行時的棧。
整 個 cps 的(主要)過程就是 if 分支在不斷制造新的 ctx, 而 apply 分支(最后一個分支)不斷在新的 ctx 中 ‘計算’ (實際上是生成 cps 函數的代碼,而不是真的計算),并返回結果(到上一層 ctx)的過程。這個過程就是 scheme 的基本 eval-apply 過程。(參見SICP第四章)
這是一個解釋器(解釋成為 CPS 風格的代碼),同時也是一個CPS轉換器,正所謂 Compiling with Continuations. 另外,Scheme 這種代碼即數據(字符串列表)的特性,使得編寫生成代碼的代碼相對容易和簡潔。
至于代碼為何有 k 這個命名。呵呵,你可以叫它 kontinuation 或者 klosure.
5. 結論
以自然語言寫作比喻,編寫自解釋器級別的代碼,就像你在寫一本小說,而小說的主角也在寫一本小說,這位主角在描寫你,對你的刻畫會影響到你,你受到影響之后又會改變小說中的主角,從而影響到他對你的描寫。你倆要相安無事,情節合符邏輯地發展,直到最后圓滿的結尾。這比寫一本普通小說可難多了。
網友評價:
看來網友們關注的重點,都在王垠說的話上,很多網友都認為他在吹牛。但是也有網友為他說話的,覺得這40行代碼,確實很厲害,有些網友還悄悄的跑去運行了一下。
網友一:這40行代碼的價值,開始我是不以為然的。因為根本不懂它是干嘛用。直到自己水平的提升,又對這些代碼有研究,才發現,這40行代碼的價值。
網友二:這40行代碼的價值既然不在于實現了CPS的算法,也不在于這段代碼寫得有多么精簡和巧妙。而是:獨立思考。
網友三:這段代碼的功能是自動把普通遞歸轉換為尾遞歸。
網友四:不懂js的人,就算是簡單的js代碼也看不懂的。 很多人看不懂不代表沒有人看得懂。
-
計算機
+關注
關注
19文章
7549瀏覽量
88737 -
代碼
+關注
關注
30文章
4837瀏覽量
69128
發布評論請先 登錄
相關推薦
北汽集團戰略投資小馬智行7035萬美元
自動駕駛企業小馬智行登陸納斯達克
小馬智行納斯達克掛牌上市
如何安全有效的刪代碼?
軟通動力領導一行訪問福州大學
海南大學副校長一行到訪芯原海南
ensp啟動失敗,錯誤代碼40怎么回事
中國汽研董事長周玉林一行蒞臨國芯科技調研交流
賽思快訊 | 熱烈歡迎嘉興市政協一行領導蒞臨賽思總部調研指導工作!
![賽思快訊 | 熱烈歡迎嘉興市政協一<b class='flag-5'>行</b>領導蒞臨賽思總部調研指導工作!](https://file1.elecfans.com/web2/M00/E6/5F/wKgZomZG6aOATA33AADrJGPYih4229.png)
在uCGUI的回調函數里加了行代碼,stm32無法啟動怎么解決?
百度首席技術官王海峰解讀文心大模型的關鍵技術和最新進展
![百度首席技術官<b class='flag-5'>王</b>海峰<b class='flag-5'>解讀</b>文心大模型的關鍵技術和最新進展](https://file1.elecfans.com/web2/M00/CD/1C/wKgaomYgddKAG-uTAAAOKd5w0Gw262.jpg)
賈揚清的500行代碼,掀翻了Perplexity5.2億的桌子?
![賈揚清的500<b class='flag-5'>行</b><b class='flag-5'>代碼</b>,掀翻了Perplexity5.2億的桌子?](https://file.elecfans.com/web2/M00/43/7B/pYYBAGJ-B6aAHuNPAAAf8J1Ebk4778.jpg)
贛江新區黨工委副書記王萬征一行,蒞臨我司調研半導體產業發展情況!
![贛江新區黨工委副書記<b class='flag-5'>王</b>萬征一<b class='flag-5'>行</b>,蒞臨我司調研半導體產業發展情況!](https://file1.elecfans.com/web2/M00/C8/D1/wKgaomYXX-2AC755AABNhUMDhL0605.png)
湖南大學校長、王耀南院士一行赴中科億海微調研指導
![湖南大學校長、<b class='flag-5'>王</b>耀南院士一<b class='flag-5'>行</b>赴中科億海微調研指導](https://file.elecfans.com/web2/M00/25/DF/poYBAGG4Qq-Acg_lAAAU6_gxx6g420.jpg)
評論