最近比较闲,打算整理一下之前学习的关于程序语言的知识.主要的内容其实就是一边设计程序语言一边写解释器实现它.这些知识基本上来自Programming Languages and Lambda Calculi和Essentials of Programming Languages这两本书. 我还记得高中奥数竞赛培训时的老师这样说过:“解题时一定要抓住定义.” 编程和解题一样,也要抓住定义. 所以在写解释器前,得先定义好这门要解释的程序语言. 这门程序语言基于Lambda演算. 从\(\lambda…
这一篇接在第一篇lambda演算的后面.讲讲一些数学知识. 经常有些看似很容易理解的东西,一旦要描述得准确无误,就会变得极为麻烦. 软件工程里也有类似情况:20%的代码实现了核心功能,剩下80%的代码处理边界情况. 于是,所谓的准确描述里的大部分文字都在说明边界情况,核心概念只有寥寥几字——好比一件打满补丁的衣服,完全看不出原来的样子. 出现这种现象要么是人类的大脑有缺陷,难以严谨而又准确的理解概念,也就是说人类太笨: 要么就是语言系统有问题,难以简洁地表达概念,而发明不出新的语言系统的人类还是…
这个系列有个显著的特点,那就是标题越来越长.忽然发现今天是读书节,读书节多读书. ==下面是没有意义的一段话================================================ 我是一个喜欢从学习知识中获得乐趣并乐于分享这种乐趣的人.我认为大部分知识只要花点时间都是能学会的.几年前,我迷上微分几何.我对每个朋友说这东西很有意思花点时间精力就能学会.他们回答说唉没时间时间不知去哪儿了.后来,我迷上量子力学.我对每个朋友说这东西值得一学,只要花点时间精力.他们回答说唉烦心…
let表达式 let表达式用来声明一个变量. 比如我们正在写一个模拟掷骰子游戏的程序. 一个骰子有6个面. 所以这个程序多次用到了6这个数字. 有一天,我们忽然改变主意,要玩12个面的骰子. 于是我们不得不仔细查找源代码,把里面的6改成12. 对于一个较大的程序,这是灾难的开始. 有时我们会漏掉几个6,有时我们会把几个指的不是骰子面数的6误改成12. 这种灾难被称作“魔术数字”. 避免魔术数字的方法一般是声明一个变量——比如说变量\(a\)——让这个变量等于6(\(a=6\)). 这个例子的le…
或许在加入continuation之前要先讲讲费这么大劲做这个有什么意义. 毕竟用不用continuation的计算结果都是一样的. 不过,这是一个兴趣使然的系列,学习这些知识应该完全出于好奇与好玩的想法. 所以我才不会告诉你们通过控制continuation可以实现call-with-current-continuation和异常处理等功能呢. 我先简要描述一下加入continuation后解释器是怎么工作的. 加入continuation后的解释器是以迭代的方式工作的. 迭代的状态量有两个,…
当我写到这里的时候,我自己都吃了一惊. 环境.存储这些比较让人耳熟的还没讲到,continuation先出来了. 维基百科里对continuation的翻译是“延续性”. 这翻译看着总有些违和感而且那个条目也令人不忍直视. 总之continuation似乎没有好的中文翻译,仿佛中国的计算机科学里没有continuation这个概念似的. Continuation这个概念相当于过程式语言里的函数调用栈. 它是用于保存“现在没空处理,待会再处理的事”的数据结构. 这样说有点抽象,举个例子,函数应用那…
递归.哦,递归. 递归在计算机科学中的重要性不言而喻. 递归就像女人,即令人烦恼,又无法抛弃. 先上个例子,这个例子里的函数double输入一个非负整数$n$,输出$2n$. \[ {double} = \lambda n.({if} \; ({iszero} \; n) \; 0 \; (+ \; 2 \; ({double} \; (- \; n \; 1)))) \] 现在的问题是,这个递归函数在我们的语言里没法直接定义. 我说的直接定义是指像这个用let表达式: \[ ({let} \;…
一.什么是RPC 1.简介: RPC:Remote Procedure Call,远程过程调用.简单来说就是两个进程之间的数据交互. 正常服务端的接口服务是提供给用户端(在Web开发中就是浏览器)或者自身调用的,也就是本地过程调用. 和本地过程调用相对的就是:假如两个服务端不在一个进程内怎么进行数据交互?使用RPC. 尤其是现在微服务的大量实践,服务与服务之间的调用不可避免,RPC更显得尤为重要. 2.原理: 计算机的世界中不管使用哪种技术,核心都是对数据的操作.RPC不过是将数据的操作垮了一个…
在C语言入门系列中,我们使用Visual studio 2013 Professional作为开发工具.本篇详细介绍如何安装Visualstudio 2013 Professional并写出我们第一个C程序. 1.工具准备 开发机环境:Win7或以上版本操作系统,Internet Explorer 10(IE10)或以上版本. 建议安装IE11.在线安装包下载地址: http://windows.microsoft.com/zh-cn/internet-explorer/download-ie…
1.3程序语言简介 我们经常会听到一些名词:低级语言.高级语言.编译型.解释型.面向过程.面向对象等.这些到底是啥意思呢?在正式进入Java世界前,笔者也尝试简单的聊一聊这块东西. 1.3.1低级语言和高级语言 我们中国人之间,想要沟通,一般就是通过汉语.那么想要和计算机沟通用啥呢?我们都知道,计算机内部存储的是0和1组成的二进制数字串,计算机指令也是0和1组成的二进制数字串,因此想让计算机干活,只能编写由0和1组成的程序.我们把由二进制代码组成的程序叫做机器语言程序,把由0和1表示的语言叫做机…