王垠
王垠[yín],四川大學(xué)97級本科畢業(yè),保送到清華大學(xué)計(jì)算機(jī)系直博。期間曾在清華大學(xué)計(jì)算機(jī)系軟件工程專業(yè)就讀,主要進(jìn)行集成電路布線算法的研究。在此期間,他因《完全用GNU/Linux工作》一文和對TeX的推廣等“非研究成果的業(yè)余東西”而出名。 在只剩一年就要博士畢業(yè)的時(shí)候,他申請退學(xué),并將1萬7千余字的“退學(xué)申請書”(題為清華夢的粉碎)公布在網(wǎng)上,引起輿論界一時(shí)對教育體制、理想主義等的熱議。
王垠的40行代碼



40行代碼專家解讀
1. 背景知識
CPS: Continuation-Passing Style. 有一篇介紹 CPS 通俗易懂的文章(中文翻譯)。
簡單來講,CPS 是一種編程風(fēng)格:
Javascript:
(原味)
function foo(x) {
return x ;
}
(CPS)
function cps_foo(x, return_point) {
return return_point (x) ;
}
CPS 多了一個(gè)參數(shù) return_point,return_point 來自 caller ,是 caller 所在的“世界”,caller 將這個(gè)“世界” 傳遞給 callee (cps_foo),這樣 cps_foo 就無須利用額外的工具(比如堆棧)去查詢 caller 的世界在哪里,以便返回,而是直接進(jìn)入這個(gè)世界:return_point (x)。 這便是 CPS 的初衷 —— 去掉層層嵌套的世界。行話講就是 desugar(脫糖)。Syntax sugar 是為了方便人類的表達(dá)和理解,給編程語言的核心套上的一層好吃好看的外衣,而對機(jī)器對程序的解釋,需要將其還原到最本質(zhì)的結(jié)構(gòu),以便機(jī)械化處理和優(yōu)化,這 就是脫糖的意義。
以函數(shù)式編程的觀點(diǎn)來看,return_point 是一個(gè)函數(shù),以 C 觀點(diǎn)來看,你可以把它理解為程序地址,或者,以 Matrix 來看,它是 key-maker 打開門進(jìn)入新世界的那把鑰匙?!笆澜纭鄙现挥幸粋€(gè)巨大的程序(比如,你的程序不過是在 chrome 里面運(yùn)行的一個(gè)小程序,而 chrome 又是在 OS 里面的一個(gè)小程序),return_point 將各種小程序竄連起來了。恩,差不多就是這個(gè)意思。只不過,在函數(shù)式程序里面(比如Scheme)里面,return_point 是函數(shù),而在過程式程序(比如C)里面它更像是 0x4f36a0c4。
這段 40 多行代碼是給 Scheme 程序脫糖的程序,屬于解釋器的代碼,而不是應(yīng)用代碼。對其的客觀評價(jià)顯然只有設(shè)計(jì)解釋器的人才能給出。對應(yīng)用程序員的意義在于,發(fā)現(xiàn)每天上班時(shí)編寫的代碼多么無聊,此外并沒有任何實(shí)用價(jià)值。
2. 運(yùn)行結(jié)果
‘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. 注釋

4. 要點(diǎn)
ctx: 函數(shù)在執(zhí)行(apply)時(shí)候的上下文環(huán)境,可理解為 C 程序中運(yùn)行時(shí)的棧。
整 個(gè) cps 的(主要)過程就是 if 分支在不斷制造新的 ctx, 而 apply 分支(最后一個(gè)分支)不斷在新的 ctx 中 ‘計(jì)算’ (實(shí)際上是生成 cps 函數(shù)的代碼,而不是真的計(jì)算),并返回結(jié)果(到上一層 ctx)的過程。這個(gè)過程就是 scheme 的基本 eval-apply 過程。(參見SICP第四章)
這是一個(gè)解釋器(解釋成為 CPS 風(fēng)格的代碼),同時(shí)也是一個(gè)CPS轉(zhuǎn)換器,正所謂 Compiling with Continuations. 另外,Scheme 這種代碼即數(shù)據(jù)(字符串列表)的特性,使得編寫生成代碼的代碼相對容易和簡潔。
至于代碼為何有 k 這個(gè)命名。呵呵,你可以叫它 kontinuation 或者 klosure.
5. 結(jié)論
以自然語言寫作比喻,編寫自解釋器級別的代碼,就像你在寫一本小說,而小說的主角也在寫一本小說,這位主角在描寫你,對你的刻畫會(huì)影響到你,你受到影響之后又會(huì)改變小說中的主角,從而影響到他對你的描寫。你倆要相安無事,情節(jié)合符邏輯地發(fā)展,直到最后圓滿的結(jié)尾。這比寫一本普通小說可難多了。
網(wǎng)友評價(jià):
看來網(wǎng)友們關(guān)注的重點(diǎn),都在王垠說的話上,很多網(wǎng)友都認(rèn)為他在吹牛。但是也有網(wǎng)友為他說話的,覺得這40行代碼,確實(shí)很厲害,有些網(wǎng)友還悄悄的跑去運(yùn)行了一下。
網(wǎng)友一:這40行代碼的價(jià)值,開始我是不以為然的。因?yàn)楦静欢歉陕镉谩V钡阶约核降奶嵘?,又對這些代碼有研究,才發(fā)現(xiàn),這40行代碼的價(jià)值。
網(wǎng)友二:這40行代碼的價(jià)值既然不在于實(shí)現(xiàn)了CPS的算法,也不在于這段代碼寫得有多么精簡和巧妙。而是:獨(dú)立思考。
網(wǎng)友三:這段代碼的功能是自動(dòng)把普通遞歸轉(zhuǎn)換為尾遞歸。
網(wǎng)友四:不懂js的人,就算是簡單的js代碼也看不懂的。 很多人看不懂不代表沒有人看得懂。
-
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7660瀏覽量
90752 -
代碼
+關(guān)注
關(guān)注
30文章
4900瀏覽量
70697
發(fā)布評論請先 登錄
AI眼鏡中國行調(diào)研團(tuán)走進(jìn)谷東智能
上海雷克薩斯一行到訪中汽中心
浩辰CAD看圖王:攜手鴻蒙,CAD技術(shù)創(chuàng)新驅(qū)動(dòng)企業(yè)數(shù)字化轉(zhuǎn)型

保隆科技與均聯(lián)智行簽署戰(zhàn)略合作協(xié)議
煙臺市發(fā)改委領(lǐng)導(dǎo)蒞臨華礪智行調(diào)研
沐渥科技:氮?dú)夤窆收?b class='flag-5'>代碼解讀及處理建議

DeepSeek扔的第二枚開源王炸是什么

15行代碼引發(fā)1800多行編譯錯(cuò)誤:問題排查挑戰(zhàn)
北汽集團(tuán)戰(zhàn)略投資小馬智行7035萬美元
自動(dòng)駕駛企業(yè)小馬智行登陸納斯達(dá)克
小馬智行納斯達(dá)克掛牌上市
軟通動(dòng)力領(lǐng)導(dǎo)一行訪問福州大學(xué)
BQ40Z80量產(chǎn)校準(zhǔn)代碼示例

評論