Smalltalk 簡介
Smalltalk 被公認為歷史上第二個面向對象的程序設計語言和第一個真正的集成開發環境 (IDE)。由Alan Kay, Dan Ingalls, Ted Kaehler,Adele Goldberg等于70年代初在Xerox PARC開發。Smalltalk對其它眾多的程序設計語言的產生起到了極大的推動作用,主要有:Objective-C,Actor, Java 和Ruby等。90年代的許多軟件開發思想得益于Smalltalk,例如Design Patterns, Extreme Programming(XP)和Refactoring等。
什么是 Smalltalk ?
Smalltalk和許多程序設計語言不同,它不僅僅是一門語言。
一種面向對象的程序設計語言:它是一種面向對象的語言,包含語言的語法和語義。一些編譯器可以通過Smalltalk源程序產生可執行文件。這些編譯器通常產生一種能在虛擬機上運行的二進制代碼。Smalltalk語言本身非常精煉。
一種程序設計環境:這里指的是一種提供許多對象的系統,而不是某種特殊的開發環境。和許多語言不同(包括C++),Smalltalk附帶有一個巨大的、相當標準的類庫。這些類使得開發Smalltalk程序的效率非常高。在其它語言(例如 Ada , C 和 Pascal )中通常被作為語言的一部分的功能(例如條件判斷,循環等),在Smalltalk由特定的類提供。
一個應用開發環境(ADE):由于Smalltalk的歷史原因,它具有一個非常優秀的高度集成、開放的應用開發環境。由于開發環境中的瀏覽器、監視器以及調試器都由同樣的源程序衍生出來的,不同的版本之間也具有相當好的兼容性。此外,這些工具的源程序都可以在ADE直接存取。
Smalltalk中的對象
在Smalltalk中所有的東西都是對象,或者應該被當作對象處理。
例如下面的表達式:
2 + 3
應當被理解為:向對象2發送消息+,參數為對象3。
純面向對象使得Smalltalk在語言結構方面有許多與其他語言不同的特點,例如在Smalltalk語言中沒有條件語句,取而代之的是一些發送給對象true或者false的消息,因此它們不屬于語言部分,而屬于Smalltalk的類庫;也沒有循環重復語句(C語言中的for while),Smalltalk用向數字對象或塊對象發送消息來實現重復執行。
Smalltalk的歷史
最早的Smalltalk原型由Alan Kay于70年代初提出。類(來自Simula-67)、海龜繪圖(來自MIT的 LOGO )以及圖形界面等概念的有機組合,構成了Smalltalk的最初的藍圖。
在1971年到1975年之間,Kay在Xerox PARC的小組設計并實現了第一個真正的Smalltalk語言系統。這個系統具有以下幾個技術創新:
語言完全基于Simula的類和消息的概念。
語言沒有固定的語法,語法分析由類本身完成。
開發環境的革新相當迅速。
雖然當時的位圖顯示器十分昂貴,但是Kay卻說服了PARC讓他使用這些位圖顯示器,這使得Kay和他的小組能夠實現不同大小和字體的文字,使用多窗口環境,以及一些對圖像處理的高端支持。
1975-76年間,Kay小組認識到應當對執行效率和規模進行優化。于是他們在許多重要方面重新設計了Smalltalk系統,在語言上:
引入了繼承和子類的概念。
確定了語言的語法,這使得編譯器能夠產生高效、可執行、精煉的二進制代碼。
Larry Tesler設計了瀏覽器,這極大地提高了Smalltalk程序員的編程效率。
前述的所有Smalltalk系統都是在特殊的硬件上實現的,直到1977-78年,Bruce Horn 和 Ted Kaehler 把Smalltalk-76移植到由Intel 8086處理器和自定顯示器所組成的硬件環境(被稱為NoteTaker)上。雖然這種硬件環境只生產了10臺,但是它證明了在通常的處理器上實現Smalltalk的可能性。
Smalltalk-80
在1979-80年,部分受NoteTaker項目的影響,Smalltalk小組的注意力轉移到Smalltalk的銷售可行性上。小組設計并實現了新一代的Smalltalk系統,這次修改的目標著重于在標準硬件上的移植性等方面,包括:
采取 ASCII 碼集,摒棄了原先在Smalltalk-72和-76中使用的特殊字符。
取消了原始(primitive)方法直接存取內存的能力。取而代之的是引入一系列的原始方法提供相應的功能。
引入了元類的概念。
引入MVC(Model-View-Controller)系統以方便交互式應用軟件的開發。
程序實例
數學計算:
(15 * 19) + (37 squared)
可以理解為:向15發送消息'*',參數為19;向37發送消息squared; 最后向15*19的結果發送消息'+',參數為37 squared的結果。
Smalltalk 的五大基本特征
Alan Kay 總結了Smalltalk 的五大基本特征。這是第一種成功的面向對象程序設計語言,也是Java 的基礎語言。通過這些特征,我們可理解“純粹”的面向對象程序設計方法是什么樣的:
(1) 所有東西都是對象。可將對象想象成一種新型變量;它保存著數據,但可要求它對自身進行操作。理論上講,可從要解決的問題身上提出所有概念性的組件,然后在程序中將其表達為一個對象。
(2) 程序是一大堆對象的組合。通過消息傳遞,各對象知道自己該做些什么。為了向對象發出請求,需向那個對象“發送一條消息”。更具體地講,可將消息想象為一個調用請求,它調用的是從屬于目標對象的一個子例程或函數。
(3) 每個對象都有自己的存儲空間,可容納其他對象。或者說,通過封裝現有對象,可制作出新型對象。所以,盡管對象的概念非常簡單,但在程序中卻可達到任意高的復雜程度。
(4) 每個對象都有一種類型。根據語法,每個對象都是某個“類”的一個“實例”。其中,“類”(Class)是“類型”(Type)的同義詞。一個類最重要的特征就是“能將什么消息發給它?”。
(5) 同一類所有對象都能接收相同的消息。這實際是別有含義的一種說法,大家不久便能理解。由于類型為“圓”(Circle)的一個對象也屬于類型為“形狀”(Shape)的一個對象,所以一個圓完全能接收形狀消息。這意味著可讓程序代碼統一指揮“形狀”,令其自動控制所有符合“形狀”描述的對象,其中自然包括“圓”。這一特性稱為對象的“可替換性”,是OOP最重要的概念之一。