这门语言,只有两个保留字(reserved keyword)

各种语言的reserved keyword

今天逛SO的时候发现了这样一个问题: Reserved keywords count by programming language?

各语言的保留字数目按从大到小的量大概如下:

ANSI COBOL 85 357
JavaScript 180
C# 102
Java 50
Python 3.x 33
C 32
Go 25
Brainfuck 8
iota 2

嗯,Python的保留字果然是少, 怪不得有个笑话是说Python其实是“可执行的伪代码”

python is executable pseudocode, while perl is executable line noise.

不过等等,这个iota是什么语言? 居然只要两个保留字就可以实现图灵完备了?

Iota 程序语言

虽然这里我们说Iota是程序语言, 但其实真要用Iota写可执行的脚本程序还是没那么简单的。 这里的“程序语言”更大意义上是计算机科学里的图灵完备的解决可计算问题的概念, 那么首先我们来看Iota的设计概念:

Iota on wikipedia

呃,上面那个页面其实是希腊字母里的Iota ι 下面这才是iota程序语言:

Iota and Jot

wiki上很好地介绍了iota,大概意思(也就是我消化过以后): 相对于知名的lambda calculusSKI combinator calculus来说, Iota和Jot是非常精简的Formal System, 它们的设计初衷就是用尽量少的算子来完成图灵完备的语言。 简单来说iota只有两个保留字,一个是 *, 一个是i*会结合后面两个iota表达式,而i会接受表达式x,返回xSK

看完上面一大段可能已经有点晕乎了, 那么换个角度,我们想象一下iota是怎么被创造出来的吧。

一群人聚在一起, 当时已经有了图灵理论, 有了lambda算子, 有了functional programming, 于是有人提了个问题: 最精简的图灵完备的语言是什么? 于是Chris Barker站在一系列已有理论的基础上, 发明了iota这门语言。

SKI 算子

SKI就是iota发明路上一个很重要的巨人肩膀。 SKI一共定义了三个算子,分别是S, K, I :) 这名字听起来十分简单粗暴,我很喜欢。 规则如下:

  • SKI以带括号表达式的形式呈现,可以把xy = z简单理解为函数x接受参数y返回值z
  • I接受一个参数,并返回它,即有Ix = x
  • K接受两个参数,并返回第一个参数,即有Kxy = x
  • S接受三个参数,返回一三参数对二三参数的操作结果,即有Sxyz = xz(yz)

根据以上玄妙的定义,神奇的事情发生了 :) SKI实际上只需要SK算子,I算子可以用SKK表示 :

  SKKx
= Kx(Kx)      # 根据Sxyz = xz(yz)
= x           # 根据Kxy  = x

而通过SKI,我们可以做很多的事情:

  • 递归
  • 取反
  • 布尔逻辑

以上例子可以去维基看原文: SKI combinator calculus

回到iota

在SKI之后,Chris Barker提出了iota算子, 有 ix = xSK

所以可以推出:

  ii
= iSK
= SSKK
= SK(KK)
= SKK <=> I

  i(iI)
= i(ISK)
= i(SK)
= SKSK
= KK(SK)
= K

  iK
= KSK
= S

:) 瞧,这就是逻辑的魅力。 我们通过定义一系列很小的基石, 就能处理整个大厦。

总而言之,iota在SKI的基础上定义了一个关键的算子, 再加上*字符做到程序化地表示, 从而实现了最精简的程序语言这一目标。