0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

王垠的40行代码是什么_王垠40行代码专家解读

汽车玩家 来源:电子发烧友网 2018-04-11 18:01 次阅读

王垠

王垠[yín],四川大学97级本科毕业,保送到清华大学计算机系直博。期间曾在清华大学计算机系软件工程专业就读,主要进行集成电路布线算法的研究。在此期间,他因《完全用GNU/Linux工作》一文和对TeX的推广等“非研究成果的业余东西”而出名。 在只剩一年就要博士毕业的时候,他申请退学,并将1万7千余字的“退学申请书”(题为清华梦的粉碎)公布在网上,引起舆论界一时对教育体制、理想主义等的热议。

王垠的40行代码

王垠的40行代码是什么_王垠40行代码专家解读
王垠的40行代码是什么_王垠40行代码专家解读
王垠的40行代码是什么_王垠40行代码专家解读

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行代码专家解读

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

    文章

    7409

    浏览量

    87690
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68323
收藏 人收藏

    评论

    相关推荐

    软通动力领导一访问福州大学

    软通动力高级副总裁晓良、杨念农,软通教育总裁林涛及福建新东湖集团有限公司董事长陈国平一来访福州大学。校党委陈国龙书记在行政南楼会见了客人并座谈交流,郭文忠副校长陪同会见。
    的头像 发表于 10-10 10:43 356次阅读

    BQ40Z80量产校准代码示例

    电子发烧友网站提供《BQ40Z80量产校准代码示例.pdf》资料免费下载
    发表于 09-27 09:34 0次下载
    BQ<b class='flag-5'>40</b>Z80量产校准<b class='flag-5'>代码</b>示例

    ensp启动失败,错误代码40怎么回事

    ENSP(Enterprise Network Simulation Platform)启动失败并显示错误代码40,通常是由多种原因引起的。以下是一些可能的原因及相应的解决方法: 一、可能的原因
    的头像 发表于 08-30 14:29 7871次阅读

    中国汽研董事长周玉林一莅临国芯科技调研交流

    日前,中国汽车工程研究院股份有限公司(以下简称: 中国汽研 ,股票代码: 601965 )董事长周玉林及副总经理红钢一莅临苏州国芯科技股份有限公司(以下简称“ 国芯科技 ”,股票代码
    的头像 发表于 08-13 09:54 511次阅读

    在uCGUI的回调函数里加了代码,stm32无法启动怎么解决?

    我是一个初学者。最近在写一个uCGUI上的小应用的时候遇到了这样的问题,我在MULTIEDIT控件的回调函数里加了一代码,运行我自己写的一个用于计算的函数,在没有加这一代码的时候运
    发表于 04-24 07:06

    百度首席技术官海峰解读文心大模型的关键技术和最新进展

    4月16日,以“创造未来”为主题的Create 2024百度AI开发者大会在深圳国际会展中心成功举办。百度首席技术官海峰以“技术筑基,星河璀璨”为题,发表演讲,解读了智能体、代码、多模型等多项文心大模型的关键技术和最新进展。
    的头像 发表于 04-18 09:20 663次阅读
    百度首席技术官<b class='flag-5'>王</b>海峰<b class='flag-5'>解读</b>文心大模型的关键技术和最新进展

    贾扬清的500代码,掀翻了Perplexity5.2亿的桌子?

    500代码VS估值5亿1月25日,自从宣布创业后就备受社区瞩目的贾扬清,在推特上展示了一个对话式搜索引擎的demo。这个demo基于他创办的LeptonAI提供的框架,“只用500python
    的头像 发表于 04-17 08:05 128次阅读
    贾扬清的500<b class='flag-5'>行</b><b class='flag-5'>代码</b>,掀翻了Perplexity5.2亿的桌子?

    湖南大学校长、耀南院士一赴中科亿海微调研指导

    近日,湖南大学校长、耀南院士带队赴中科亿海微电子科技(苏州)有限公司(简称中科亿海微)北京研究院调研指导,魏育成总裁率队接待。段校长及院士一参观了企业展厅,并详细了解了中科亿海微业务领域
    的头像 发表于 02-19 12:17 794次阅读
    湖南大学校长、<b class='flag-5'>王</b>耀南院士一<b class='flag-5'>行</b>赴中科亿海微调研指导

    NTG40S240-VFQFPN 5.0 x 5.0 x 0.75 mm机身包装外形图包装代码

    电子发烧友网站提供《NTG40S240-VFQFPN 5.0 x 5.0 x 0.75 mm机身包装外形图包装代码.pdf》资料免费下载
    发表于 01-05 10:44 0次下载
    NTG<b class='flag-5'>40</b>S240-VFQFPN 5.0 x 5.0 x 0.75 mm机身包装外形图包装<b class='flag-5'>代码</b>

    ad7656串输出代码

    ad7656串输出代码是一段常见的嵌入式系统开发代码,用于控制外部设备进行串行通信。本文将详细介绍该代码的功能、结构、使用方法以及注意事项。 首先,了解ad7656是什么。 AD76
    的头像 发表于 12-28 10:38 834次阅读

    扬州市科技局局长友芳一莅临扬杰中央研究院调研指导!

    12月20日上午,扬州市科技局局长友芳、副局长卞加林、办公室主任张志军一莅临扬杰中央研究院, 就企业申报、研发投入等工作进行专题调研。 扬杰科技董事长梁勤、研发中心总监周理明等热情接待。 友芳
    的头像 发表于 12-20 20:55 4626次阅读
    扬州市科技局局长<b class='flag-5'>王</b>友芳一<b class='flag-5'>行</b>莅临扬杰中央研究院调研指导!

    keil中的代码格式化插件Astyle介绍

    在keil中一的缩进自己的代码,虽然注重代码的格式是一个好的习惯,不过这样代码比较多的话,整理起来效率太低,推荐Astyle这个工具,
    的头像 发表于 11-28 12:29 3333次阅读
    keil中的<b class='flag-5'>代码</b>格式化插件Astyle介绍

    深开鸿成录博士一到访深圳技师学院参观交流

    近日,深圳开鸿数字产业发展有限公司(简称:深开鸿)CEO成录博士带队到访深圳技师学院(简称:深技师)参观交流。深圳技师学院校党委书记罗德超,党委委员、副校长籍东晓,教务处处长文平,信息处处长陈园
    的头像 发表于 11-25 08:33 824次阅读
    深开鸿<b class='flag-5'>王</b>成录博士一<b class='flag-5'>行</b>到访深圳技师学院参观交流

    python如何换行而不运行代码

    在Python中,换行是一种用来增加代码的可读性和组织性的方式。当你在编写Python代码时,换行通常用于分隔不同的代码或块,使其更易于阅读和理解。然而,并非所有的换行都会运行
    的头像 发表于 11-22 10:52 2543次阅读

    c语言怎么把代码全部注释掉

    要将C语言代码全部注释掉,即不让代码被编译和执行,可以使用注释语句来实现。C语言提供两种注释方式:单行注释和多行注释。 单行注释:使用双斜杠(//)来注释一代码。 示例: // 这是
    的头像 发表于 11-22 10:21 6685次阅读