这门语言,只有两个保留字(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的基础上定义了一个关键的算子,
再加上*字符做到程序化地表示,
从而实现了最精简的程序语言这一目标。