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

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 为代表的新兴 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 相关的项目。

回到未来:Smalltalk 编程系统的更多相关文章

  1. 温顾知新系列-JAVA网络编程系统(1)- 流

    一.字节流 1. 输出流 Java的基本输出流类是java.io.OutputStream; public abstract calss OutputStream 此类常用的写入数据的基本方法如下: ...

  2. 成为编程大牛很简单,把这些书看个八成就OK

    原文链接:http://lucida.me/blog/developer-reading-list/ 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍 ...

  3. C++模板元编程 - 3 逻辑结构,递归,一点列表的零碎,一点SFINAE

    本来想把scanr,foldr什么的都写了的,一想太麻烦了,就算了,模板元编程差不多也该结束了,离开学还有10天,之前几天部门还要纳新什么的,写不了几天代码了,所以赶紧把这个结束掉,明天继续抄轮子叔的 ...

  4. Java的IO系统

     Java IO系统     "对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务."     由于存在大量不同的设计方案,所以该任务的困难性是很容易证明的.其中最大的 ...

  5. Linux环境编程导引

    计算机系统硬件组成 总线 贯穿整个系统的一组电子管道称为总线, 分为: 片内总线 系统总线 数据总线DB 地址总线AB 控制总线CB 外部总线 I/O设备 I/O设备是系统与外界联系的通道 键盘鼠标是 ...

  6. 逻辑编程入门--clojure.core.logic

    此文已由作者张佃鹏授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1. 逻辑编程思维: 逻辑编程(逻辑程序设计)是种编程范型,它设置答案须匹配的规则来解决问题,而非设置步骤来 ...

  7. SERDES高速系统(一)

    在目前主流厂商的高端FPGA 中都集成了SERDES(串并收发单元)硬核,如Altera的Stratix IV GX器件族内部集成的SERDES单通道支持600Mbit/s到8.5Gbit/s数据熟率 ...

  8. TensorFlow 编程基础

    1.TensorFlow 安装:https://www.cnblogs.com/pam-sh/p/12239387.html https://www.cnblogs.com/pam-sh/p/1224 ...

  9. Serverless 在编程教育中的实践

    说起Serverless这个词,我想大家应该都不陌生,那么Serverless这个词到底是什么意思?Serverless到底能解决什么问题?可能很多朋友还没有深刻的体会和体感,这篇文章我就和大家一起聊 ...

随机推荐

  1. 力扣337——打家劫舍 III

    这一篇也是基于"打家劫舍"的扩展,需要针对特殊情况特殊考虑,当然其本质还是动态规划,优化时需要考虑数据结构. 原题 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃 ...

  2. equals()和hashCode()必须同时覆盖的原因

    我们在用JAVA创建自己的类的时候,一种比较常见的覆盖就是覆盖Object中的equals()方法和hashCode()方法.如果不这样做的话,就很可能违反Object.hashCode()的通用约定 ...

  3. c#数字图像处理(十)图像缩放

    图像几何变换(缩放.旋转)中的常用的插值算法 在图像几何变换的过程中,常用的插值方法有最邻近插值(近邻取样法).双线性内插值和三次卷积法. 最邻近插值: 这是一种最为简单的插值方法,在图像中最小的单位 ...

  4. BBOTSTRAP

    Bootstrap 第一步:下载 第二步: 解压缩 第三步:引入(head内部  link引入) Bootstrap 全局样式 移动设备优先:<meta name="viewport& ...

  5. openlayer3 坐标系转换

    'EPSG:4326'-经纬度坐标-WGS84'EPSG:3857'- xy坐标-web墨卡托 ol3默认的坐标系为3857,即在创建ol.map的时候,若不指定projection,则默认为EPSG ...

  6. centos7下oracle11g详细的安装与建表操作

    一.oracle的安装,在官网下载oracle11g R2 1.在桌面单击右键,选择“在终端中打开”,进入终端 输入命令:su 输入ROOT密码: 创建用户组oinstall:groupadd oin ...

  7. (.text+0x18): undefined reference to `main'

    在将VS中的程序移植到ubuntu中出现的一个问题,主要原因是在vs中默认的主函数写成int _tmain(), 而在gcc编译时要找的是int main().改过来就可以了.

  8. AcWing 786.第k个数

    AcWing 786.第k个数 题目描述 给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少. 输入格式 第一行包含两个整数 n 和 k. 第二行包含 n 个整数( ...

  9. 024.Python模块OS模块

    一 OS模块 对系统进行操作 1.1 popen 可以把运行的结果,这个字符串转化成utf-8这样的编码格式在进行输出 import os res = os.popen("ifconfig& ...

  10. java加解密算法--DES

    ECB import sun.misc.BASE64Decoder; import javax.crypto.*; import javax.crypto.spec.DESKeySpec; impor ...