讀過《Design and Evolution of C++》的人壹定知道 C++ 這個變態的 zero-bookkeeping 原則。任何 C++ 語言的高層概念,其實都已經在編譯階段被剝離掉了。從最後的目標代碼中妳很難再看出這是壹種高級語言。當然,其代價就是程序員必須理解為什麽 C++ 不能實現某些功能。而且必須從機器的角度去理解。
動態語言其實就是壹個不斷添加 bookkeeping 的過程。
比如說,C++ 中為了實現多態還是不得不有壹個中間機制,這就是虛表。但是妳很難說虛表就是壹個 bookkeeping 結構。因為它太簡單了。而 Objective-C 就大大增加了對成員函數調用的 bookkeeping 機制。因為如此,所以 Objective-C 對 action-message 的實現就簡單多了,因為妳可以判斷壹個成員函數是否存在。而且也可以在不確定對象類型的情況下,指定壹個方法作為回調函數。
C++ 的另壹個問題,內存管理,根本原因在於其對象引用采用 raw pointer 機制。Objective-C 並沒有改善這壹點。但是也並非全無改善,在 Objective-C 裏,壹個 pointer 幾乎永遠必須指向 NSObject,而這個東西是有引用基數的。當然,它並沒有完全解決 over-release 或者 use-after-release 的問題。到了 Java,Python,Lua 這樣的語言,raw pointer 就完全消失了。
而 C++ 的內存管理,除了 heap 就只有壹個借助 CPU stack 管理的棧。在動態語言裏,就要考慮 lexical scope 的表現,這就需要更多的 bookkeeping。這點 Objective-C 也並沒有實現。
語法的處理,在 C++ 中是完全在 runtime 之前進行。而在 Python,Lisp,Lua 這樣的語言中是有 eval 這樣的機制存在的。
所以,Objective-C 是比 C 和 C++ 擁有更多動態特性,而比 Lua,Lisp 缺乏壹些動態特性的語言。至於題目中進行比較的 Python,也只能說是個更少缺乏動態特性的語言。Python 缺乏 lexical scope,也缺乏對 continuation 的支持。它的 stack 借助 CPU stack(當然有壹個 stackless-Python,不過非官方),相比之下,Lua 為了支持 coroutine,Lisp 為了 full-continuation,都是自行維護 VM stack 的。Python 的 bookkeeping 與 Lua 和 Lisp 比起來也是不夠的。