最简单的代码“MOV AX,1234H”刻画出程序的最为底层的构造单元:指令和数据。
本文对《编程导论(Java)·0.2.2 操作符和操作数》进行扩展。
1.操作符和操作数的区别
首先,操作符和操作数是两个东西。1+2、或(+ 2 3)中+是操作符、数字是操作数。
注意,操作符、函数或执行代码,这里都视为操作符。
2.操作符和操作数的统一
冯•诺伊曼体系结构(von Neumann architecture)计算机,程序和数据能够以相似的方式来表示并存储到相同的内存储器中。这就是存储-程序(the stored program)概念。
那么,我们希望操作符和操作数在某种程度上统一。统一的方向是什么呢?
(1)操作数作为操作符?将表示信息的实体(操作数)作为操作符,通常不是好主意;或者说,“完全可以没有数,仅仅对函数做各类操作”,不是好主意。虽然函数编程语言中的一切元素,归根结底都是λ表达式(丘奇的λ运算),但是在函数编程语言中,还是需要操作数!
(2)操作符作为操作数。函数作为数据!这才是我们的统一方向。操作符、函数或执行代码或程序,和数据能够以相似的方式来表示并存储到相同的内存储器中,我们如何像对待数据那样处理函数呢?
在《2.2.2 Java数据类型》中介绍到,值将被保存在变量中、被作为参数传递、被方法返回以及被操作符操作。于是,我们也需要考虑,如何将函数
- 保存在变量中
- 作为参数传递
- 由方法返回
- 被操作符操作(这可以归结为2和3)[可以包含在数据结构中——SICP]
上面4点,很重要!!具有这个特点的程序元素被称为 first-class 元素—— 第一级/一阶元素或头等元素, first-class Java citizens。
- 函数被作为参数传递、被方法返回,这就是所谓的高阶函数;
- 函数保存到变量中,这就需要编程语言提供一种类型来表示函数。在Scheme语言中,所有函数属于 procedure?类型,C语言中通过函数指针来指向函数,而Java 8目前没有提供函数类型、也没有提供函数引用或函数指针,在这种情况下,我们只能够说Java的λ表达式是似、仿或伪函数。Java8 的目的,是让程序员认为Java的λ表达式是函数,如同让程序员认为人妖是女人。