回到未來: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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...