回到未来: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。

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/
- 在 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)
- Common Lisp 在早期有 LOOPS 和 Flavors,后来演化成标准化的 Common Lisp Object System(CLOS)。
- Logtalk 为多种主流 Prolog 实现提供了面向对象的语言扩展。此外在一些商业 Prolog 实现如 SICStus 中也提供对象系统。
- 在这方面比较有影响力的一本书是 Object-Oriented Software Construction 。
- Smalltalk-80: The Language and It’s Implementation 一书中称 Smalltalk 对于管理软件复杂度(Managing complexity)所采用的方法是其主要贡献。
- “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
- Closures And Objects Are Equivalent http://wiki.c2.com/?ClosuresAndObjectsAreEquivalent
- 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
- FP, OO and relations. Does anyone trump the others? http://okmij.org/ftp/Scheme/oop-in-fp.txt
- Smalltalk 提供的图形化开发工具远不止这些,值得一提的还有代码仓库管理工具 Iceberg,版本管理系统 Monticello 等。
- 这方面的一个例子是 GNU Dr. Geo,一款基于 Pharo 的图形界面之上的几何软件。
- 一个例子是 ContextL,它基于 Common Lisp 对象系统的元类功能实现了一套 Context-oriented programming 扩展。
- Awesome Pharo 是一个列表,分类列举了大量与 Pharo 相关的项目。
回到未来:Smalltalk 编程系统的更多相关文章
- 温顾知新系列-JAVA网络编程系统(1)- 流
一.字节流 1. 输出流 Java的基本输出流类是java.io.OutputStream; public abstract calss OutputStream 此类常用的写入数据的基本方法如下: ...
- 成为编程大牛很简单,把这些书看个八成就OK
原文链接:http://lucida.me/blog/developer-reading-list/ 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍 ...
- C++模板元编程 - 3 逻辑结构,递归,一点列表的零碎,一点SFINAE
本来想把scanr,foldr什么的都写了的,一想太麻烦了,就算了,模板元编程差不多也该结束了,离开学还有10天,之前几天部门还要纳新什么的,写不了几天代码了,所以赶紧把这个结束掉,明天继续抄轮子叔的 ...
- Java的IO系统
Java IO系统 "对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务." 由于存在大量不同的设计方案,所以该任务的困难性是很容易证明的.其中最大的 ...
- Linux环境编程导引
计算机系统硬件组成 总线 贯穿整个系统的一组电子管道称为总线, 分为: 片内总线 系统总线 数据总线DB 地址总线AB 控制总线CB 外部总线 I/O设备 I/O设备是系统与外界联系的通道 键盘鼠标是 ...
- 逻辑编程入门--clojure.core.logic
此文已由作者张佃鹏授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1. 逻辑编程思维: 逻辑编程(逻辑程序设计)是种编程范型,它设置答案须匹配的规则来解决问题,而非设置步骤来 ...
- SERDES高速系统(一)
在目前主流厂商的高端FPGA 中都集成了SERDES(串并收发单元)硬核,如Altera的Stratix IV GX器件族内部集成的SERDES单通道支持600Mbit/s到8.5Gbit/s数据熟率 ...
- TensorFlow 编程基础
1.TensorFlow 安装:https://www.cnblogs.com/pam-sh/p/12239387.html https://www.cnblogs.com/pam-sh/p/1224 ...
- Serverless 在编程教育中的实践
说起Serverless这个词,我想大家应该都不陌生,那么Serverless这个词到底是什么意思?Serverless到底能解决什么问题?可能很多朋友还没有深刻的体会和体感,这篇文章我就和大家一起聊 ...
随机推荐
- [bzoj3938] [Uoj #88] Robot
Description 小 \(q\) 有 \(n\) 只机器人,一开始他把机器人放在了一条数轴上,第 \(i\) 只机器人在 \(a_i\) 的位置上静止,而自己站在原点.在这之后小 \(q\) 会 ...
- 创建自定义的RouteBase实现(Creating a Custom RouteBase Implementation) |定制路由系统 |
- Spring-事务(1)
一,注解的方式实现事务 1.Dao层 package com.atguigu.spring.tx; public interface BookShopDao { //根据书号获取书的单价 public ...
- python文件的打开与关闭
#文件的打开 #open(文件名,访问模式) f=open('test.txt','w') #文件的关闭 f.close() 访问模式 说明 r 以只读方式打开文件.文件的指针将会放在文件的开头.这是 ...
- Nacos 配置MySQL8.0持久化
问题描述 官网下载的Nacos mysql由于驱动过低只支持5.X版本,使用8.X版本的mysql时无法正常启动 解决办法 克隆nacos源码(branch 1.0.0-RC3) master等分支也 ...
- ubuntu19配置静态IP并开启SSH远程登陆
前言 从ubuntu从17.10开始,已经不再在/etc/network/interfaces里配置IP,即使配置了也不会生效,而是改成netplan方式 ,配置写在/etc/netplan/文件夹 ...
- OpenCV3入门(三)基本绘图函数
1.函数原型 /** @brief Draws a line segment connecting two points.*/ CV_EXPORTS_W void line(InputOutputAr ...
- Dubbox 环境搭建-新(Windows下)
分布式服务框架 dubbo/dubbox 入门示例 dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http:// ...
- Codeforces_711_B
http://codeforces.com/problemset/problem/711/B 比较简单,过程有点繁琐,先找一行包含那个0的行,得到和,以此填出0位置的值,然后判断这个矩阵是否符合条件. ...
- Element ui select 同时获取value和label的值
html <el-form-item label="单位名称" prop="checkInUnitName"> <el-select v-mo ...