Smalltalk 的 Live Programming 是怎樣實現的?

我不清楚具體的表述, 但導出都有關於 Smalltalk Live Coding 環境的說法

Everything is live, code changes are live, applications dont start, theyre simply always running.

http://onsmalltalk.com/why-smalltalk

這事情具體是怎麼樣的, 是的話, 那是怎麼實現的? 為什麼我們現在反而做不到了?


首先經典smalltalk環境與我們現在通常的編程與應用概念是不同的。

我們現在習慣的通常的編程概念是分成開發環境與應用執行兩部分的。程序由一個個文件組成,不管是在IDE還是文本編輯器里,總歸是編輯源程序文本。執行時是解釋或者編譯後運行,都與開發環境分離了。如下圖所示:

而smalltalk的開發與運行是完全不一樣的。它的開發環境與運行環境是融為一體的。這個運行環境包括一個vm虛擬機,以及一個image。image里包含了一切,全部都是對象,包含了開發環境,程序庫,用戶定義的類,以及各種對象,以及對象的狀態。用戶開發應用時,就是在這個環境里創建自己的類,生成需要的對象,把對象的狀態調整好。然後就保存一個image。這個image發給別人去運行時,給你保存時的狀態是一樣的。

可以說smalltalk里並沒有app的概念,全部是對象。

上面這個圖裡Image中的那些黃色的橢圓表示對象,各種類型的對象:開發工具、調試器、代碼管理工具、瀏覽器。。。。當然,也包括你開發出來的「應用」。

現在對Live programming就好理解了,你在smalltalk環境中,邊寫程序,邊創建幾個自己應用的對象,可以直接操作這些對象。修改了對象的代碼後,對象的執行會立刻改變。

=============

下面作為演示的都是 Squeak 系統,Squeak基本可以認為是現在的標準Smalltalk環境了。

下圖就是Squeak 環境,所有的編程開發與運行都在這個窗口中。裡面有幾個小窗口:System Browser 就是用來編輯查看Smalltalk類的結構及代碼的地方。下面的 Workspace 是一個可以輸入代碼執行的地方。中間那個綠色的 「00」 的小窗口,就是執行:

m := LedTimerMorph new openInWorld.

的結果。LedTimerMorph 是一個 Morph的子類,它的對象可以顯示在屏幕上,有自己的狀態和動作。這個生成的對象賦值給 m 。

下面給 m 這個對象一個 start 消息,然後上面綠色的小窗口數字就開始定時變化了。

我們給這個對象換個顏色:

打開一個 inspect 窗口,可以看到這個對象的所有信息:

我們可以隨意修改類的源代碼,看下面的例子:

CrossMorph 是一個 Morph的子類,它的 drawOn: 方法里繪製一個橫杆和一個豎杠,形成一個十字:

如果我們把代碼中繪製橫杆的哪一行注釋掉,剛才創建的那個對象也就變了:

=====================

總結,Live Programming,字面意義理解就是對象是活的,這更像是在搭建一個樂高積木,搭出來的部分立刻就能用了。而普通的開發更像是在畫一個施工圖紙。


smalltalk不熟,只是簡單看過一些入門的文章。

《Design Principles Behind Smalltalk》不知道你看過沒有?

Design Principles Behind Smalltalk

我覺得裡面的 Operating System 一節就回答了你的問題。

smalltalk直接把OS(當然包括IDE)的事情都做了,甚至是直接賣smalltalk machine。

之前王垠也發博文說了編程語言把OS吃掉的好處(原文他已經刪掉了),然後在網上也引發了很多討論。後來他本人也又發了一片博文來稍微糾正了一下。 為什麼一種程序語言是不夠用的

簡單的來說就是將語言和OS耦合在一起之後就不夠靈活了。

而且兩塊本身都是非常大的工作量,再耦合在一起。。。很難完全掌控。

更重要的一點是OS和編程語言的初衷其實是不一樣的,可以說是不在一條線上。

編程語言是為了方便描述問題;OS是為了屏蔽底層硬體差異。

硬讓一個吃了另一個本質上不會省多少事兒,反而讓情況更複雜。


Live Programming, 編寫代碼並運行的時候就是在修改當前運行的程序(workspace),在當前的程序中運行的。


類似swift的playground


程序可以操作自己就可以,lisp就可以。沒什麼不能做的。只是意義可能不是像原本想像的那麼大。現在聲音大的都是些無腦堆砌複雜度的體力碼農和急功近利製造假象的商業,真正的正確思路已經隱藏的太深了。真正的編程是哲學和強AI問題,數學和科學級選手沒有一點希望的。


推薦閱讀:

面向對象在數值計算中如何應用,有哪些具體例子,相較普通函數能夠多大程度提高計算效率?
面向對象(一)|面向對象概念及優點(以py為例)
MATLAB高級數據結構連載5: table 2
MATLAB App Desinger教程連載2:詳解App Designer生成的代碼

TAG:編程語言 | 面向對象編程 | Smalltalk |