Smalltalk 是19世紀70年代由 Alan Kay 設計的,第一個以面向對象(Object-Orientation)為主要範式的編程語言 1。Smalltalk 具有大量首創的特性,深刻影響了其之後的編程語言、開發環境和軟體過程。 ...
Smalltalk 是19世紀70年代由 Alan Kay 設計的,第一個以面向對象(Object-Orientation)為主要範式的編程語言 1。Smalltalk 具有大量首創的特性,深刻影響了其之後的編程語言、開發環境和軟體過程。
由 Smalltalk 開始的面向對象的設計思想影響了後來出現的 C++,Objective-C,Python,Java,Ruby,C# 等眾多編程語言,甚至在以函數式著稱的 Lisp 和邏輯編程語言 Prolog 當中也演化出了功能強大的對象系統23。在所有編程範式當中,面向對象的編程範式毫無疑問取得了突出的成功。究其原因,一方面在於面向對象的設計一般易於描述和理解,而針對對象系統的建模、分析和可視化工具也得到長足的發展;其次,面向對象的諸多實踐4如模塊化(Modulariry)、復用(Reusability)等優化了軟體行業的經濟效益(Economic benefits)5。這些原因使得面向對象的設計方法和軟體系統得到了從個人到企業的廣泛採用(Adoption)。
面向對象的核心思想之一是封裝(Encapsulation),與之類似的一個概念是閉包(Closure),後者在提供一階函數(First-class function)的編程語言內普遍存在。在對閉包與對象的比較上有很多精彩的爭論67,將閉包作為底層機制來實現對象系統在函數式編程語言中屢見不鮮89,而早期的面向對象的編程語言也在發展過程中不斷吸收函數式編程的諸多要素。值得一提的是,Smalltalk 從誕生之初就有塊(Block)的概念,其本質就是一種語法閉包,這使得在 Smalltalk 中可以優雅地實現需要用到類似高階函數(Higher-order function)的功能。
Smalltalk 起源於施樂帕羅奧多研究中心(Xerox PARC)的一項研究項目,旨在讓人們更高效、更愉快地使用電腦系統。在這個願景下,Smalltalk 使用一套互動式圖形界面(Interactive graphical interface)作為其開發環境,它包含系統瀏覽器(System browser)、調試器(Debugger)、檢視器(Inspector)、分析器(Profiler)等等一系列圖形化的開發工具10。這也導致了 Smalltalk 的另一個重要貢獻——推動了圖形用戶界面的發展,並且催生出了現在所謂的集成開發環境(Integrated development environment, IDE)。與今天的集成開發環境不同的是,Smalltalk 的開發環境完全由其系統自身的功能來構建,開發人員可以接觸和定製開發環境的方方面面,甚至把它作為最終軟體產品的一部分用來交付11。
得益於元類(Metaclass)和反射(Reflection)機制的存在,相較於其他編程語言中的對象系統,Smalltalk 具有十分出色的元編程(Metaprogramming)能力。由於“一切皆對象”的設計思想,在 Smalltalk 中不僅實例(Instance)具有動態特征,類(Class)和元類也可以被動態地創建和修改,這使得程式的行為可以在多個不同的層面得到調控。元類被廣泛應用於對象的持久化存儲(Object persistence)和對象關係映射(Object-relational mapping, ORM)等方面,它為對象系統提供了在用戶層面(User-space)進行拓展的能力,為對象系統升級和演化提供了一個視窗,一些比較前沿的編程範式如 Context-oriented programming 和 Aspect-oriented programming 也可以通過元類成為現有對象系統的擴展12。
Smalltalk 是少數使用鏡像(Image)的編程系統之一。與基於鏡像的開發方式相對的是基於源代碼(Source-based)的開發方式,這也是今天絕大部分編程系統所採用的開發方式。在基於鏡像的開發過程中,源代碼的作用只是用來改變鏡像的狀態,在開發階段完成後,鏡像作為一段記憶體區域被持久化轉存(Dump)到鏡像文件(Image file)中。到了部署階段,鏡像文件再被恢復到記憶體當中,然後以轉存之前的狀態繼續運行。與基於源代碼的方式相比,一個重要的優勢在於開發人員可以將任意程式狀態封裝進最終交付的鏡像中,而前者必須經歷一個自舉(Bootstrap)過程來達到特定狀態,或者將這些狀態定位於外部資源。基於鏡像的編程系統通常具有天然的熱部署(Hot deployment)能力並且非常看重運行時環境(Run time)的健壯性,這使得他們成為開髮長運行(Long-running)的應用程式的理想選擇。
時至今日,以 Pharo 為代表的新興 Smalltalk 平臺一直處在高速的發展之中,很多早期的 Smalltalk 項目得到維護和升級,Smalltalk 編程系統的優勢也得到了發揮和繼承13。舉例來說,Moose 構建了一個強大的可視化數據分析平臺;Glamorous Toolkit 將 Smalltalk 圖形開發環境更進一步,提出了 “moldable development environment” 的概念,如果你認為可視化編程(Visual programming)代表了未來的方向,那麼 Smalltalk 始終走在它的前列。
文章鏈接:https://xh.coobii.com/2019/06/16/back-to-the-future-with-smalltalk/
- 在 Smalltalk 之前有 Simula,首次實現了面向對象中的關鍵思想,包括類(Class)、對象(Object)、繼承(Inheritance)和動態綁定(Dynamic binding)等,Smalltalk 的貢獻在於其介紹了一種新的設計模式。”Though it has noble ancestors indeed, Smalltalk’s contribution is a new design paradigm—which I called object-oriented—for attacking large problems of the professional programmer, and making small ones possible for the novice user.” (Alan Kay, The Early History Of Smalltalk)
- Common Lisp 在早期有 LOOPS 和 Flavors,後來演化成標準化的 Common Lisp Object System(CLOS)。
- Logtalk 為多種主流 Prolog 實現提供了面向對象的語言擴展。此外在一些商業 Prolog 實現如 SICStus 中也提供對象系統。
- 在這方面比較有影響力的一本書是 Object-Oriented Software Construction 。
- Smalltalk-80: The Language and It’s Implementation 一書中稱 Smalltalk 對於管理軟體複雜度(Managing complexity)所採用的方法是其主要貢獻。
- “A closure is a poor man’s object; an object is a poor man’s closure” https://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg03277.html
- Closures And Objects Are Equivalent http://wiki.c2.com/?ClosuresAndObjectsAreEquivalent
- Modularity, Objects, and State (Structure and Interpretation of Computer Programs, Chapter 3) https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-19.html#%_chap_3
- FP, OO and relations. Does anyone trump the others? http://okmij.org/ftp/Scheme/oop-in-fp.txt
- Smalltalk 提供的圖形化開發工具遠不止這些,值得一提的還有代碼倉庫管理工具 Iceberg,版本管理系統 Monticello 等。
- 這方面的一個例子是 GNU Dr. Geo,一款基於 Pharo 的圖形界面之上的幾何軟體。
- 一個例子是 ContextL,它基於 Common Lisp 對象系統的元類功能實現了一套 Context-oriented programming 擴展。
- Awesome Pharo 是一個列表,分類列舉了大量與 Pharo 相關的項目。