网站大量收购独家精品文档,联系QQ:2885784924

7行代码,3分钟:从无到有实现一门编程语言.pdf

7行代码,3分钟:从无到有实现一门编程语言.pdf

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
7行代码,3分钟:从无到有实现一门编程语言

7行代码,3分钟:从无到有实现一门编程语言 实现一门编程语言对任何程序员来说都是值得拥有 经验,因为它能加深你对计算原理 理解,并且还很有趣。 在这篇文章中,我已经让整个过程回归到它 本质:为一种函数式 (图灵等价)编程语言设 计7行代码 解释器。大概只需要3分钟就能实现 这个7行代码 解释器展示了在众多解释器中同时存在 一个可升级 体系结构–eval/apply设 计模式。 《Structure and Interpretation of Computer Programs》这本书提到过该模式。 在这篇文章中总计有三门语言 实现: 一个是scheme语言 7行,3分钟实现 解释器一个是Racket语言 重实现最后一个 是1 行、“1-afternoon”解释器,它实现了高级绑定形式、显示递归、额外作用、高阶函数式等等 对于掌握一门更丰富 语言来说,最后一个解释器是一个好起点 一个小型(图灵机等价)语言 最容易实现 一门编程语言是一个叫做λ运算 极简单、高阶函数式编程语言 λ运算实际上存在于所有主要 功能性语言 内核中:Haskell, Scheme、 ML,但是它也存 在于JavaScript、Python、Ruby 中。它甚至隐藏在Java 中,如果你知道到哪里去找它。 历史简介 1929年Alonzo Church开发出λ演算 在那时,lambda calculus不被叫做编程语言因为没有计算机,所以没有编程 概念。 它仅仅是一个推演函数 数学标记。 幸运 是,Alonzo Church有一个叫作艾伦·图灵 哲学博士。 艾伦·图灵定义了图灵机,图灵机成了第一个被接受 通用计算机定义 不久后发现lambda calculus和图灵机是等价 :任何用λ演算描述 功能可以在图灵机上 实现;并且在图灵机上实现 任何功能可以用λ演算描述 值得注意 是在lambda calculus 中仅有三种表达式:变量引用,匿名函数、函数调用 匿名函数: 匿名函数以”λ-.”标记开始,所以 (λ v . e)函数用来接收一个参数v并返回值e 。 函数调用: 函数调用用两个临近 表达式表示:(f e) Examples æ´å¤ç²¾å½©æ»ç¥è®¿é® 1 我们可以将这个恒等函数应用到一个恒等函数上: ((λ x . x) (λ a . a)) (仅返回这个恒等函数本身) 这儿有一个更有趣 程序: 你能弄清楚它是干嘛 ? 等一下!见鬼,这怎么算一门编程语言? 乍一看,这门简单语言好像缺乏递归和迭代,更不用说数字、布尔值、条件语句、数据结构 和剩余其他 。这样 语言怎么可能成为通用 呢? λ演算实现图灵机-等价 方式是通过两种最酷 方式: 邱奇编码 (Church encoding )和Y combinator (美国著名企业孵化器) 我已经写了两篇关于Y combinator和邱奇编码 文章。 但是,你如果不想读它们 话,我可以明确 告诉你比起你期望 仅一个((λ f . (f f)) (λ f . (f f))) 程序来说 有更多 lambda calculus知识。 表面上开始 程序叫做Ω,如果你尝试运行它 话,它不会终止 (想一下你是否明白其中 原因) 实现λ演算 下面是基于Scheme语言标准(R5RS) 7行、3分钟λ演算解释器。在术语中,它是一个依赖 环境 指示解释器 代码将从文件中读入程序、分析、求值最后打印值(这是一段没有注释和空白行 7行代码) Schema语言的read函数使得词法分析和语法分析简单化。只要你想处于语法“平衡圆 括号” (符号式)世界 。 (如果不想的话,你必须钻研语法分析,你可以从我写的一篇语法分析文章开始)在Scheme 语言中,read函数从文件获取加括号的输入并把它分析然后生成树函数eval 和 apply构成了解释 器 内核。即使我们使用 是Scheme语言,我们仍给出了函数概念上 “签名” eval函数将一个表达式和环境变量赋给一个值。表达式可以是一个变量、λ术语或者是一个 应用。 一个环境值是从变量到值 映射,用来

文档评论(0)

hhuiws1482 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档