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. 高通量计算框架HTCondor(二)——环境配置

    目录 1. 概述 2. 安装 3. 结果 4. 相关 1. 概述 HTCondor是开源跨平台的分布式计算框架,在其官网上直接提供了源代码和Windows.Linux以及MacOS的安装包.因为平台限 ...

  2. 【转】在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)

    原文:http://www.cyqdata.com/cnblogs/article-detail-35876# 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件 ...

  3. c#移位运算符("<<"及">>")

    C#是用<<(左移) 和 >>(右移) 运算符是用来执行移位运算. 左移 (<<) 将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0.  左移相当于乘. ...

  4. Spring事务梳理

    Spring事务传播行为 概述 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为 事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数 ...

  5. Linux 常用工具openssh之scp

    前言 scp命令用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器硬盘变为只读read  ...

  6. Springboot | Failed to execute goal org.springframework.boot:spring-boot-maven-plugin

    案例 今天搭建spring boot 环境时,使用mvn install ,出现Failed to execute goal org.springframework.boot:spring-boot- ...

  7. AS中使用真机调试时出现解析错误的问题

    时间:2019/12/8 今天使用usb调试程序时手机上出现了解析错误的问题,其实这个问题很简单,主要可能是你想要调试的程序的最低版本号大于你手机的安卓版本号的原因,只需要修改下面这个地方: buil ...

  8. 暑假第三周总结(学习HDFS操作方法)

    本周由于自己出去玩,以及家里的各种事也没好好看书,就对HDFS的一些常用的shell命令进行了学习与应用,观看了林子雨老师关于HDFS的视频,对HDFS的一些存储的原理.规则进行了一定的了解.对uba ...

  9. vue中如何在本地导入js文件

    import {setStore,setUser,getStore,removeStore} from "../../../public/localstory" 在导入js文件时, ...

  10. rep stos 指令(Intel汇编)

    今天读代码时,忽然跳出如下一条指令==>> 汇编代码: rep stos dword ptr es:[edi] 在网上查了相关资料显示: /************************ ...