To iterate is human, to recurse divine.

金皆

Scheme on Prolog (4):运行时环境

现在,我们已经用Prolog实现了范例Scheme语言的源代码读取词法分析语法分析的部分,并且获得了AST。最后,我们要实现一个Scheme的运行时来消费AST,生成最终的计算结果。

当解析器生成了抽象语法树(AST)后,运行时环境可以对它进行处理,计算语法树表达的数值。如果代码只是如下简单的四则运算,

1
2
(- 3 1)
(+ (* 3 5) 2)

Scheme on Prolog (3):文法分析

上一篇文章中,我们完成了词法分析,从源代码文件中获得了词法单元的序列。接下来,这些词法单元会被送到文法分析器中做进一步处理。我们知道,形式文法是由一组文法生成式组成的。一个生成式可能是这样子的,

1
IfStat -> 'if' '(' Expr ')' StateBlock

这是常见的描述if语句的生成式,它表达了这样的含义:如果匹配了‘if’,并且匹配了’(‘,并且匹配了Expr,并且匹配了’)’,并且遇到了StateBlock,那么就匹配了一个完整的IfStat。这里我故意使用了“如果”、“并且”、“那么”,目的是想说明文法生成式和Prolog语句是有着惊人的相似的。每一个生成式实际上就是一个命题。因此,相对于命令式语言,用Prolog进行文法解析是一件比较简单的工作。下面,我们开始用Prolog实现简单Scheme的文法分析部分。

Scheme on Prolog (2):词法分析

在上一篇“读取源文件”的文章中,我们实现了readFile谓词,利用它可以读取源文件的内容,并把字节流保存在一个整数的列表中。接下来我们将消费这些数据,通过它们创建词法单元。因此,本节将讲述如何构造一个词法分析器来完成这件事。

词法分析

就像在第一节已经指出的,本文处理的只是Scheme的子集,它的词法规则如下:

  • +, -, *, /, (, ),Whitespace
  • ‘define’
  • identifier number

Scheme on Prolog (1):读取源文件

在接下来的一系列文章里,我将详细讲述如何利用Prolog,从零开始构造一个Scheme子集的运行时环境。这个运行时环境可以解释执行如下四则运算的Scheme代码:

1
2
(+ 1 2)
(+ (- 5 3) (* 2 3))

另外,它还可以通过“define”定义变量,

1
2
3
4
(define a 1)
(define b 2)
(+ a b)
...

选择Scheme的原因在于它足够简单而且有趣。另外,通过实现这个简单的运行时环境,我们也可以领略Prolog的独特之处。Prolog作为应用最广泛的逻辑式程序设计语言,在描述文法生成式时具有很多语言无可比拟的优势;另外作为声明式语言,Prolog不必描述运算的细节(甚至语句执行的顺序),因此程序的可读性比命令式语言要好很多。

HTTPS背后的加密算法

当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信。InfoQ的这篇文章对此有非常详细的描述。这些复杂的步骤的第一步,就是浏览器与服务器之间协商一个在后续通信中使用的密钥算法。这个过程简单来说是这样的:

  1. 浏览器把自身支持的一系列Cipher Suite(密钥算法套件,后文简称Cipher)[C1,C2,C3, …]发给服务器;
  2. 服务器接收到浏览器的所有Cipher后,与自己支持的套件作对比,如果找到双方都支持的Cipher,则告知浏览器;
  3. 浏览器与服务器使用匹配的Cipher进行后续通信。

展望2014,马上持续交付

写这篇博客的时候,农历马年的步伐已经进入倒计时了。很多人都许了愿,“马上有钱”,“马上有对象”。那么,作为处在IT交付核心的我们,还应该再加一个愿望:马上持续交付。

在快速变化的IT行业里,四年是个相当长的时期,很多技术都在这段时间里走完了它的生命周期。从“持续交付”第一次走入行业的视野,到今天大概也就4年的样子,然而它不但没有褪色,反而逐渐受到越来越多的关注了。我们看到,不但越来越多的互联网企业开始实施了持续交付,很多传统行业,比如金融、保险、电信等等,也都踏入了持续交付之路。我们都知道,持续交付涉及到软件交付的整个生命周期,那么,我们不妨来看一看,哪些因素让持续交付在今后几年里将会得到越来越多的关注。

市场竞争带来业务驱动力,精益创业引爆持续变革

如果找一个发展持续交付的“root cause”,市场这只看不见的手绝对当知无愧。两年前开始流行的“精益创业”告诉我们,快速地提供满足最终用户需求的产品,是企业生存之道。对于初创公司,能够比竞争对手提早进入市场,将会获得更大的优势,取得更好的发展前景。传统行业也没有什么可幸运的。它们也面对同样的竞争压力,还要承受自身改变的阻力。我们正在帮助一家跨国金融企业实施持续交付,将它们新产品的发布周期从六个月降低到两周。我们也有来自其他领域的客户,比如保险、电信,为了赢得市场上的竞争,获得更大的生存空间,都在不同程度上迈向了持续交付。

文本化的幻灯片 - 实用技术

不久前在博客上发了一篇使用Slideshow创建幻灯片的文章,不过这篇博文却是在两年多前写的。这两年多里,我在公司内部的演讲幻灯片几乎都是用Slideshow做的,外部演讲也用过几次了,比如Lisp社区的。在这个过程中,我对Slideshow的强大功能与高效率越来越有信心了。这篇文章分享一些我总结的经验。

1. 关于使用

Slideshow本身要求使用者编写scheme代码来创建幻灯片,不过这部分不设计代码,而是一些方便使用的技巧。

显示下一页预览

在幻灯片演示的过程中,按住Alt-c(或者Cmd-c)可以开启、关闭下一页幻灯片的预览。图1显示了启动预览时的效果。 下一页预览 图1

显示注释

在幻灯片演示的过程中,按住Alt-d(或者Cmd-d)可以显示、隐藏注释内容。至于在幻灯片里添加注释的内容,需要调用comment函数,

1
2
3
4
(slide
    (t "Hello World!")
    (comment "this is a comment")
)

文本化的幻灯片 - Slideshow

作为一名体面的程序员,作为一名被Unix文化侵染的程序员,作为一名希望世界是由简单的纯文本构成的程序员,生活中充满太多无奈。二进制的格式无处不在,后缀名将文件分出了三六九等。这其中,有两种文件我最无奈,图像和幻灯片,它们总和我的工作生活密切相关。

不过,现在光来了!HuKai在一篇blog里介绍了一个很酷的工具——Dot,它提供了一种可以基于文本描述图形的简洁的DSL。利用这个DSL,可以绘制出相当复杂的图案。激动之余,我开始寻找文本化幻灯片的方法。于是,我发现了DrRacket(它的前身就是大名鼎鼎的DrScheme)。DrRacket是MIT开发的Scheme的运行时,其中包含一个制作幻灯片的组件,名曰Slideshow。

很明显,Slideshow要求使用者用scheme来编写幻灯片,这就满足了像我这样的语言控的怪癖。我也因此放弃了一些其他类似的工具,比如SliTex。在Slideshow中,最核心的概念是pict和slide。slide自然表示一张幻灯片,它是由一个或多个pict按照不同的顺序排列组成的。slideshow的源代码以rkt为后缀名。下面是Slideshow的Hello World(hello.rkt):

1
2
3
#lang slideshow

(slide (t Hello World))

Chocolatey, 我爱你

巧克力在很多文化里都代表了美好的事物。如果你是Windows的使用者,可能Windows复杂、丑陋的包管理正在把你折腾的很惨。*NIX平台上的各种优雅的包管理工具这时让人非常眼馋。直到有一天Chocolatey出现了,让我看到了Windows平台上的包管理朝着正确的方向前进了。看来,和巧克力沾边的东西都能让人产生幸福的感觉。

1. 安装

Chocolatey的安装过程简单至极,在Chocolatey.org上最醒目的地方有一行命令,把它复制到命令行中运行,只要一分钟左右,安装就完成了。在命令下键入

1
chocolatey help

可以验证安装是否成功。

关于理想

理想这个东西,刚刚带上总会让人受伤。

但是时间长了以后,它却像鸦片一样,成为你生命里离不开的东西。你每天就为了它而奔波。

你懂的。