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. 演示共享布局 Demonstrating Shared Layouts 精通ASP-NET-MVC-5-弗瑞曼 Listing 5-10

  2. c#数字图像处理(十一)图像旋转

    如果平面上的点绕原点逆时针旋转θº,则其坐标变换公式为: x'=xcosθ+ysinθ   y=-xsinθ+ycosθ 其中,(x, y)为原图坐标,(x’, y’)为旋转后的坐标.它的逆变换公式为 ...

  3. MyBatis-Plus学习笔记(1):环境搭建以及基本的CRUD操作

    MyBatis-Plus是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,使用MyBatis-Plus时,不会影响原来Mybatis方式的使用. SpringBoot+M ...

  4. 线程池技术之:ThreadPoolExecutor 源码解析

    java中的所说的线程池,一般都是围绕着 ThreadPoolExecutor 来展开的.其他的实现基本都是基于它,或者模仿它的.所以只要理解 ThreadPoolExecutor, 就相当于完全理解 ...

  5. Mybatis框架配置讲解以及使用

    1.什么是Mybatis MyBatis 是一款优秀的持久层框架, 它支持定制化 SQL.存储过程以及高级映射. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.·MyB ...

  6. web自动化环境配置

    1.下载chrome浏览器对应版本的驱动 下载地址:https://npm.taobao.org/mirrors/chromedriver 2.下载后将chromedriver放到python安装路径 ...

  7. 我的一个react路由之旅(步骤及详图)

    今天开始react一个重要部分的xiao~习,路由~(过程截图,最后附代码) 以下代码只能骗糊涂蛋子,没错,就是我自己,不要打算让我敲出多高级的东西~ 理论性知识几乎没有,请不要打算让我给你说原理啥的 ...

  8. ros机器人之动作(二)

    前面我们实现了动作的定义,接下来实现动作的功能 实现一个基本的动作服务器 准备好所需的动作定义后就可以开始编写代码了.动作和话题一样,都是使用回调机制,即回调函数会在收到消息时被唤醒和调用. 例:si ...

  9. MSVC下快速Unicode I/O

    http://blog.kingsamchen.com/archives/863 如果需要往console输出包含非ASCII字符的宽字符串,一个比较快速的方法是使用WriteConsoleW这个AP ...

  10. 大数据篇:HDFS

    HDFS HDFS是什么? Hadoop分布式文件系统(HDFS)是指被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统(Distributed File Syste ...