天天看點

《程式設計導論(Java)·0.2.2 操作符和操作數》first-class

最簡單的代碼“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的λ表達式是函數,如同讓程式員認為人妖是女人。