Can you summarize the following document?
        
  Self語言把概念上的精簡作為設計原則。它取消了類的概念,只有物件的概念,同時把訊息作為最基本的操作。把物件的屬性理解為獲取或更改屬性這兩種方法,從而把屬性的概念簡化為方法;取消了變數和賦值,並以通過訊息來讀槽和寫槽的方式代之。在發展Self的過程中,Self的設計研究人員也探索了Self的程式設計。他們提出了特質的概念,用物件實現了名字(物件名或方法名)的管理,用實現了。  儘管Self系統一次執行在一個程序中,但Self系統實際上可以分成兩個部分:Self虛擬機器和Self世界(Self world)。Self世界是一個Self物件庫,Self程式就是Self世界裡的物件,Self虛擬機器用來執行這些Self程式。當Self程式從終端、檔案或者圖形使用者介面輸入到系統中來時,Self系統把源程式解析轉化為Self物件。Self物件包括資料物件和方法物件,方法物件的程式碼部分是用一種指令非常簡單的位元組碼(bytecode)表示的,位元組碼由虛擬機器來解釋。  動態自適應編譯技術的採用提高了Self程式碼的執行效率。對經常執行的方法,虛擬機器將進一步把位元組碼轉化為本機程式碼。Self虛擬機器還提供了一些可供呼叫的,用來實現算術運算、物件複製、輸入輸出等。  Self也擁有一個圖形使用者介面Morphic,Self的程式設計環境也是基於Morphic來實現的。Self在精簡語言概念的同時也把大量的工作轉交給環境來處理。如可見性,模組與程式碼的管理都是由環境來處理的,語言中的反射機制也同環境密切相關。

  傳統的基於類的面嚮物件語言,基於了根深蒂固的二元性:  例如,假設類codice_1(車輛)的物件有一個“名字”,和進行各種動作的能力,比如“開車上班”和“運送建材”。codice_2是類codice_1的特定物件(例項),它的“名字”是“Bob's car”。在理論上,你可以向codice_2傳送訊息,告訴它去“運送建材”。  這個例子展示了這種方式的一個問題:codice_2,恰巧是一個運動車,(在任何意義上)不能裝載和運送建材,但這是建模codice_1所必須擁有的能力。通過使用子類來建立特殊化的codice_1,可產生一個更有用的模型;例如codice_8(運動車)和codice_9(平板卡車)。只有類codice_9的物件需要提供“運送建材”的機能;運動車,不適合這種工作,它只需要“快速行駛”。但是,這種深入建模在設計期間需要更多的洞察力,洞察那些可能只在引起了問題時才顯現出的事情。  這個問題是在原型(prototype)這個概念背後的動機因素之一。除非你能必然性的預測出一組物件和類在遙遠未來時所要有的品質,你不能恰當的設計好一個類的層級。程式最終需要增加行為實在是太頻繁了,而系統的很多節段將需要重新設計(或重新構建)來以不同的方式迸發出物件。早期的面嚮物件語言如Smalltalk的實驗,顯示出這種問題反反覆覆的出現。系統趨向與增長到一定程度後就變得非常僵化,因為在程式設計者的程式碼下的深層的基本類,逐漸成為一個簡單的“錯誤”。 沒有變更起初的類的容易方式,嚴重的問題就會出現。  動態語言如Smalltalk,允許通過周知的按照類的方法進行這種變更;即通過改變類,基於它的物件就可以改變它們的行為。但是,進行這種變更必須非常小心,因為基於相同類的其他物件可能把它當作“錯誤行為”:“錯誤”經常是依賴於場景的。這是問題的一種形式。進一步的說,在語言如C++中,這裡的子類可以從超類分別的編譯,對超類的變更實際上可以破壞預編譯的子類方法。這是脆弱基類問題的另一種形式,也是的一種形式。  在Self和其他基於原型的程式語言中,消除了在類和物件之間的這種二元性。  不再有基於某種“類”的一個物件“例項”,在Self中,你可以複製一個現存的物件,並改變它。所以codice_2可以通過製作現存的codice_1物件的副本來建立,並增加“快速行駛”方法,建模它恰好是一輛保時捷911的事實。主要用來製作副本的基本物件叫做“原型”。這種技術被稱為是一種非常簡化的機制。如果一個現存的物件(或物件的集合)被證明是個不適當的模型,程式設計者可以簡單的建立有正確行為的一個修改的物件,並轉而使用它。使用現存物件的程式碼不會改變。

  下面簡要描述Self的語法語義。

  Self物件是“槽”(slot)的集合(collection)。槽是返回值的訪問器(accessor)方法,它是名字-值對,包含到其他物件的引用。例如,一個叫做codice_13的槽: myPerson name 返回在codice_13中的值。通過在“資料槽”的相同名字之後放置一個冒號來設定值,下例: myPerson name:'foo' 設定它的值,這個槽叫做“賦值槽”。codice_15表示初始化讀寫變數,codice_16指示一個只讀槽。  注意在Self中在欄位(field)和方法之間沒有區分:所有東西都是槽。因為通過訊息訪問槽形成了Self語法的絕大部分,很多訊息被髮送給“self”,“self”可以去掉(語言因而得名)。

  物件文字用圓括號來界定。在圓括號內,物件描述構成自豎槓codice_17界定的一個槽的列表,隨後是在這個物件被求值時要執行的程式碼。例如: 一個真正的空物件指示為codice_18或簡單的codice_19,它根本不接收任何訊息。  Self就像Smalltalk,使用“塊”用於控制流程和其他義務。塊物件的寫法類似於其他物件,除了用方括號替代了圓括號之外。方法是除了槽(引數槽和區域性槽)之外還包含程式碼的物件,並可以被放置入Self槽中如同任何其他物件一樣,比如數。在其各種情況下語法都保持相同。  在表示式於提示符下鍵入的情況下,帶領使用者進入Self世界的這個物件叫做“大廳”(lobby)。它向使用者提供三類物件:特質(trait)物件,封裝共享行為的物件,典型的每個原型物件都有一個關聯的同名特質物件來描述它的行為的共享部分;全域性物件,即原型物件和獨一無二物件(oddball);混入物件,即小的無父物件的行為束(bundle),設計用於混合入一些其他物件之中。

  訪問槽的語法類似於Smalltalk。有三類訊息可以獲得:  所有訊息都返回結果,所以接收者(如果有的話)和引數自身可以是其他訊息的結果。下列跟隨著句號的訊息,意味著Self將丟棄返回的值。例如:  'Hello, World!' print.  這是Self版本的hello world程式。codice_23語法指示文字串物件。其他文字(literal)物件包括數、塊和一般物件。  組合可以通過使用圓括號來強制。在缺乏明確組合的情況下,一元訊息被認為有最高優先順序,其次是二元訊息(組合是從左至右的),而關鍵字訊息最低。在賦值中使用關鍵字訊息將導致一些額外的圓括號,這裡的表示式也有關鍵字訊息,為了避免如此Self要求關鍵字訊息的第一部分開始於小寫字母,而後續部分開始於大寫字母。  valid: base bottom between: ligature bottom + height And: base top / scale factor.  可以被無歧義的分析,其含義同於:  valid: ((base bottom) between: ((ligature bottom) + height) And: ((base top) / (scale factor))).  在Smalltalk-80中,相同的表示式將寫為: valid := self base bottom between: self ligature bottom + self height and: self base top / self scale factor.  假定codice_24、codice_25、codice_26和codice_27不是codice_28的例項變數,而事實上是方法。

  考慮一個稍微複雜些的例子:  labelWidget copy label: 'Hello, World!'.  通過codice_29訊息製作codice_30物件的一個副本(這時沒有快捷方式),接著向它傳送一個訊息,將codice_31放入叫做codice_32的槽中。現在用它做點事情:  (desktop activeWindow) draw: (labelWidget copy label: 'Hello, World!').  在這個案例中codice_33首先進行,從codice_34物件所知道的一個視窗列表中返回codice_35。接著(從內向外從左至右讀)前面研究過的程式碼返回codice_30。最後這個元件被髮送到活動視窗的codice_37槽中。

  在理論上,所有Self物件都是獨立實體。Self既沒有類也沒有元類。對任何特定物件的變更都不影響任何其他物件,但是在某些情況下卻需要它們這樣。一個物件正常的只可以理解對應於它的區域性槽的訊息,但擁有一個或更多的指示“父”物件的槽,物件可以將任何自身不理解的訊息委託(delegate)給父物件。任何槽都可以通過增加星號字尾來製作父指標。採用這種方式Self處理在基於類的語言中使用繼承來擔負的責任。委託還可以用來實現一些特徵比如名字空間和詞法轄域。  例如,假定在一個簡單的賬簿應用中,定義了一個物件叫做“銀行帳號”(bank account)。通常建立的這個物件,具有內部的方法,比如說“存款”(deposit)和“取款”(withdraw),和任何它所需要的資料槽,比如說“餘額”(balance)。這只是一個原型,它只在使用方式上特殊,因為它恰好是一個全功能的銀行帳號。

  為“Bob的賬戶”製作銀行帳號物件的複本(clone)將建立一個新物件,它起步時完全同於原型。在這種情況下將複製包括方法和任何資料的槽。但更常用的解決方案是首先建立一個簡單物件叫做特質物件,它包含通常與一個類有關的專案。  在這個例子中“銀行賬戶”將沒有存款和取款方法,而是將有一個父物件來做這些。採用這種方式可以製作銀行帳號物件的很多副本,但是我們仍可以通過改變在根物件中的槽來改變全部它們的行為。  這與傳統的類有任何不同嗎?我們考慮如下例子的含義:  myObject parent: someOtherObject.  這個摘句通過改變與codice_38槽關聯的值,星號是槽名字的一部分,但不是對應訊息名字的一部分,它在執行時間改變codice_39的“類”。不同於繼承或詞法轄域,委託物件可以在執行時間修改。

  在Self中的物件可以通過包括新加的槽來修改。這可以通過使用圖形程式設計環境來做,或者使用原語codice_40。原語與正常關鍵字訊息有相同的語法,但他它的名字開始於下劃線字元。codice_41原語應當避免使用,因為它是早期實現的遺留物。但是我們仍在這個例子中展示它,因為它能使程式碼更短。  下面是關於重新構建一個叫做“車輛”的簡單類的早期例子,用來使得在轎車和卡車之間有可區分的行為。在Self中,可以如下這樣完成:  _AddSlots: (| vehicle <- (|parent* = traits clonable|) |).  因為codice_40原語未指定接收者,那就是發給“self”。給codice_40的引數是它的槽將被複制來到接收者的物件。在這個例項中它是就只有一個槽的文字物件。這個槽的名字是codice_44而它的值是另一個文字物件。有第二個槽叫做codice_45,它可以用來改變第一個槽的值。這裡的codice_38沒有相應的codice_47。成為codice_44物件初始值的文字物件包括一個單一的槽,所以它可以理解與複製關的訊息。  vehicle _AddSlots: (| name <- 'automobile'|).  這裡的接收者是前面的物件,它現在除了codice_38還將包括codice_13和codice_51槽。  _AddSlots: (| sportsCar <- vehicle copy |). sportsCar _AddSlots: (| driveToWork = ("some code, this is a method") |).  儘管此前codice_44和codice_53是完全類同的,現在後者包括了具有最初時沒有的方法的一個新槽。方法只能包括在只讀槽中。  _AddSlots: (| porsche911 <- sportsCar copy |). porsche911 name:'Bobs Porsche'.  新的物件codice_54起步時完全類同於codice_53,但是最後的訊息改變了它的codice_13槽的值。注意二者仍有著完全相同的槽,儘管其中之一有著不同的值。

  Self的一個特徵是它是基於了早期Smalltalk系統所用的某種虛擬機器系統。就是說,程式不是像C語言中那樣的獨立實體,而是需要它們的整體記憶體環境來執行。這要求應用程式被裝載入儲存記憶體的大塊(chunk)之中,這叫做“快照”或。這種方式的缺點是映像有時很大並且笨重;但是除錯一個映像經常被除錯一個傳統程式要簡單,因為執行時狀態更容易檢查和修改。(在基於原始碼和基於映像的開發之間的不同是類似於在面向類的和麵向原型的物件導向程式設計之間的區別。  此外,環境是為了讓在系統之中的物件能快速和可持續的變更而定製的。重新構建一個“類”設計就像從現存的祖先拖動出來方法放入新造的之中一樣容易。簡單任務像測試方法可以通過製作副本來處理,拖動方法進入這個副本,接著變更它。不同於傳統系統,只有變更了的物件有新程式碼,不需要重建任何東西來測試它。如果這個方法有效,可以簡單的把它拖動回祖先之中。

  Self的VM實現的效能在某些測試之中大約是優化的C程式速度的一半。  這是通過即時編譯技術達到的,它是在Self研究中首創並改進的,能夠使高階語言表現得這麼好。

  Self的垃圾收集器使用世代垃圾回收,它按年齡分離物件。通過使用記憶體管理系統記錄頁面寫,可以維護一個寫屏障。這個技術給出了卓越的效能,儘管在執行一些時間之後,出現完全的垃圾收集,要花相當可觀的時間。

  執行系統選擇性的扁平化呼叫結構。這給出適當的自身提速,但允許了對不同呼叫者型別的型別資訊和多版本的程式碼的大量快取。這去除了對做很多方法查詢的需要並允許條件分支語句和硬編碼呼叫被插入,這經常能給出類似C語言的效能而又不失去語言層面的通用性,但要建立在完全的垃圾收集系統之上。

  Self語言的最初設計是由David Ungar和Randy Smith於1986年在施樂帕洛阿託研究中心提出的,並在1987年的OOPSLA'87的論文SELF: The Power of Simplicity上給出了描述。  1987年初Craig Chambers, Elgin Lee和Martin Rinard在Smalltalk上給出了Self的第一個實驗性直譯器。  1987年夏Self專案在Stanford大學正式開始,1988年夏給出了第一個有效率的實現,併發布了1.0和1.1兩個版本。在第一個版本中包括記憶體管理系統和編譯器。  1991年初Self專案移至Sun Microsystems Laboratories Inc.,並且在1992年釋出了2.0版。在第二個版本中採用了新的編譯技術,並引入了多重繼承。  1993年1月Self 3.0版釋出。在這個版本中包括了一個實驗性的圖形使用者介面,簡化了上個版本中多重繼承的設計,引入了可見性概念,並採用了更新的編譯技術。  1995年7月Self 4.0版釋出。在這個版本中包括了一個全新的圖形使用者環境Morphic,提供了工具transporter用於儲存物件,改進了虛擬機器,改善了記憶體管理,在環境的層次上引入了模組的概念,取消了語言層次上的可見性概念。  1995年之後Self的發展基本已經停滯,但在發展Self過程中探索出的一些技術在別的系統中得到了應用。在Self的實現中採用的各種編譯優化技術直接導致了Java Hotspot虛擬機器的產生;在Smalltalk的一個實現Squeak中採用了Self圖形使用者介面Morphic的設計方案,放棄了標準Smalltalk中採用的MVC的方案。
Self語言,是一種基於原型的物件導向的程式設計語言,於1986年由施樂帕洛阿爾託研究中心的David Ungar和Randy Smith給出了最初的設計。Self語言是在Smalltalk的基礎上發展而來,沿用了Smalltalk中一切都是物件的風格。在實現Self系統的過程中,設計研究人員發展出了一種動態自適應編譯技術。Self同Smalltalk一樣既是一個程式語言,也是一個整合開發環境和執行環境。