回到未來:Smalltalk 編程系統

来源:https://www.cnblogs.com/hexiangyu/archive/2020/01/12/back-to-the-future-with-smalltalk.html
-Advertisement-
Play Games

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-76 右:Pharo

Smalltalk 起源於施樂帕羅奧多研究中心(Xerox PARC)的一項研究項目,旨在讓人們更高效、更愉快地使用電腦系統。在這個願景下,Smalltalk 使用一套互動式圖形界面(Interactive graphical interface)作為其開發環境,它包含系統瀏覽器(System browser)、調試器(Debugger)、檢視器(Inspector)、分析器(Profiler)等等一系列圖形化的開發工具10。這也導致了 Smalltalk 的另一個重要貢獻——推動了圖形用戶界面的發展,並且催生出了現在所謂的集成開發環境(Integrated development environment, IDE)。與今天的集成開發環境不同的是,Smalltalk 的開發環境完全由其系統自身的功能來構建,開發人員可以接觸和定製開發環境的方方面面,甚至把它作為最終軟體產品的一部分用來交付11

GNU Dr. Geo 是一款幾何軟體,它直接基於 Pharo 的圖形界面進行開發

得益於元類(Metaclass)和反射(Reflection)機制的存在,相較於其他編程語言中的對象系統,Smalltalk 具有十分出色的元編程(Metaprogramming)能力。由於“一切皆對象”的設計思想,在 Smalltalk 中不僅實例(Instance)具有動態特征,類(Class)和元類也可以被動態地創建和修改,這使得程式的行為可以在多個不同的層面得到調控。元類被廣泛應用於對象的持久化存儲(Object persistence)和對象關係映射(Object-relational mapping, ORM)等方面,它為對象系統提供了在用戶層面(User-space)進行拓展的能力,為對象系統升級和演化提供了一個視窗,一些比較前沿的編程範式如 Context-oriented programming 和 Aspect-oriented programming 也可以通過元類成為現有對象系統的擴展12

Yesterday's Computer of Tomorrow: The Xerox Alto │Smalltalk-76 Demo

Daniel H. H. Ingalls’ demonstration of Smalltalk-76 on the Xerox Alto
https://www.youtube.com/watch?v=NqKyHEJe9_w

Smalltalk 是少數使用鏡像(Image)的編程系統之一。與基於鏡像的開發方式相對的是基於源代碼(Source-based)的開發方式,這也是今天絕大部分編程系統所採用的開發方式。在基於鏡像的開發過程中,源代碼的作用只是用來改變鏡像的狀態,在開發階段完成後,鏡像作為一段記憶體區域被持久化轉存(Dump)到鏡像文件(Image file)中。到了部署階段,鏡像文件再被恢復到記憶體當中,然後以轉存之前的狀態繼續運行。與基於源代碼的方式相比,一個重要的優勢在於開發人員可以將任意程式狀態封裝進最終交付的鏡像中,而前者必須經歷一個自舉(Bootstrap)過程來達到特定狀態,或者將這些狀態定位於外部資源。基於鏡像的編程系統通常具有天然的熱部署(Hot deployment)能力並且非常看重運行時環境(Run time)的健壯性,這使得他們成為開髮長運行(Long-running)的應用程式的理想選擇。

Pharo 生態系統
https://files.pharo.org/media/pharo-family1.pdf

時至今日,以 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/

  1. 在 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)
  2. Common Lisp 在早期有 LOOPSFlavors,後來演化成標準化的 Common Lisp Object System(CLOS)
  3. Logtalk 為多種主流 Prolog 實現提供了面向對象的語言擴展。此外在一些商業 Prolog 實現如 SICStus 中也提供對象系統。
  4. 在這方面比較有影響力的一本書是 Object-Oriented Software Construction
  5. Smalltalk-80: The Language and It’s Implementation 一書中稱 Smalltalk 對於管理軟體複雜度(Managing complexity)所採用的方法是其主要貢獻。
  6. “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
  7. Closures And Objects Are Equivalent http://wiki.c2.com/?ClosuresAndObjectsAreEquivalent
  8. 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
  9. FP, OO and relations. Does anyone trump the others? http://okmij.org/ftp/Scheme/oop-in-fp.txt
  10. Smalltalk 提供的圖形化開發工具遠不止這些,值得一提的還有代碼倉庫管理工具 Iceberg,版本管理系統 Monticello 等。
  11. 這方面的一個例子是 GNU Dr. Geo,一款基於 Pharo 的圖形界面之上的幾何軟體。
  12. 一個例子是 ContextL,它基於 Common Lisp 對象系統的元類功能實現了一套 Context-oriented programming 擴展。
  13. Awesome Pharo 是一個列表,分類列舉了大量與 Pharo 相關的項目。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前租用的功能變數名稱空間經常被服務商莫名其妙的搞掛了,不是訪問不了就是資料庫連接出問題,一氣之下功能變數名稱和空間都不用了。 由於功能變數名稱沒有保留下來,導致了一個比較尷尬的事情。之前寫的文章、代碼中有地方引用了以前的功能變數名稱,這些文章被一些朋友轉走了,導致大家訪問文章里的網址會跳轉到莫名其妙的頁面,給朋友們造成了一些困擾 ...
  • $("#pic").click(function(){ location.href='newpage.html'; }); 上面的相當於<a href="newpage.html" target="_self"><img src="img.jpg" /></a> $("#pic").click(fu ...
  • ![](https://img2018.cnblogs.com/blog/1920879/202001/1920879-20200112203037860-1294141842.png) ...
  • 這是我第一次寫博客,現如今我得了病,時間也就愈發多了。遂決定開始我的寫博客計劃,以此來使黑暗中的人喝到一劑打發時光的良藥。 大體學完HTML後,接下來就要學習css,css對於我自己來講就是對HTML進一步的處理。 css樣式分為外鏈樣式 簡單地說就是再創建一個css文件。創建好了以後呢,再在<he ...
  • prototype見上一節,馬克-to-win:prototype作用就是給某個類增加一個實例方法。例 3.6.2<head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/></head><script> /* ...
  • Layui彈層layer中select沒CSS樣式或渲染失效的解決方法 ...
  • 米娜桑,哦哈喲~ 個人製作,該文章主要講解最近基於 "uni app" 框架編寫的集圖文拖拽等多方位編輯、油墨電子簽名、開放式海報於一體的小程式的製作思路和實現代碼。 目錄 1、完整源碼鏈接 2、實現思路 3、核心代碼 3 1、圖文多方位編輯 3 2、油墨電子簽名 3 3、開放式海報 3 4、小結 ...
  • 簡單工廠模式 定義:封裝改變,既然要封裝改變,自然也就要找到需要更改的代碼,然後將需要更改的代碼用類來封裝,這樣的思路就是我們簡單工廠模式的實現方式了 下麵我們通過一則小故事來簡述一下我們在項目中為什麼要使用簡單工廠模式 背景 橙子同學正在興高采烈的逛著博客園,學習著大佬的一些操作,突然發現微信閃動 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...