回到未来: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 生态系统
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 相关的项目。

原文地址:https://www.cnblogs.com/hexiangyu/p/back-to-the-future-with-smalltalk.html

时间: 2024-07-29 20:20:36

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

Linux高性能服务器编程——系统检测工具

系统检测工具 tcpdump tcpdump是一款经典的转包工具,tcpdump给使用者提供了大量的选项,泳衣过滤数据报或者定制输出格式. lsof lsof是一个列出当前系统打开的文件描述符的工具.通过它我们可以了解感兴趣的进程打开了哪些文件描述符,或者我们感兴趣的文件描述符被哪些进程打卡了. nc nc命令主要被用来快速构建网络连接.我们可以让它以服务器方式运行,监听某个端口并接收客户连接,因此它可用来调试客户端程序.我们也可以使之以客户端方式运行,向服务器发起连接并收发数据,因此它可以用来

软件程序编程系统编程产品编程系统产品之间的关系和区别

程序-->编程产品--编程产品的概念 编程产品(Programming Product)可以被任何人运行.测试. 修复和扩展的程序. 它可以运行在多种操作系统平台上, 供多套数据使用. 程序-->编程产品--要求 程序必须按照普遍认可的风格来编写,特别是输入的范围和形式必须扩展,以适用于所有可以合理使用的基本算法. 对程序进行彻底测试, 确保它的稳定性和可靠性, 使其值得信赖. 这就意味着必须准备. 运行和记录详尽的测试用例库, 用来检查输入的边界和范围. 需要有完备的文档, 每个人都可以加以

36 Python - 系统编程 系统工具

01系统工具 背景介绍,系统工具就是用于管理系统的工具.如window的命令行工具,linux下的shell脚本,Mac系统叫终端. Python中提供了模块可以直接操作各系统的系统工具,具体模块有很多,主要讲sys和os,其中os支持跨平台,且os.path提供文件及目录工具 原文地址:https://www.cnblogs.com/yijiexi/p/11165406.html

Python编程系统下的大数据处理(微信公众号的预测评价)

import sqlite3 import xlrd def read_excel(): c = [] # 打开文件 workbook = xlrd.open_workbook(r'F:/期中作业/dataWx_org.xlsx') # 获取所有sheet sheet_name = workbook.sheet_names()[0] sheet = workbook.sheet_by_name(sheet_name) #获取一行的内容 for i in range(1,sheet.nrows):

019 python面相对象编程--系统整理

一:self的意思 1.说明 2.程序 1 #-*-encoding=utf-8-*- 2 class Bail: 3 def setName(self,name): 4 self.name=name 5 def lick(self): 6 print("%s..."%self.name) 7 8 a=Bail() 9 a.setName("tom A") 10 a.lick() 11 12 ### __init__ 13 class BailB: 14 def _

编程珠玑番外篇

1.Plan 9 的八卦 在 Windows 下喜欢用 FTP 的同学抱怨 Linux 下面没有如 LeapFTP 那样的方便的工具. 在苹果下面用惯了 Cyberduck 的同学可能也会抱怨 Linux 下面使用 FTP 和 SFTP 是一件麻烦的事情. 其实一点都不麻烦, 因为在 LINUX 系统上压根就不需要用 FTP. 为什么呢? 因为一行简单的配置之后, 你就可以像使用本机文件一样使用远程的任何文件. 无论是想编辑, 查看还是删除重命名, 都和本机文件一样的用. 这么神奇的功能到底如何

Linux环境编程导引

计算机系统硬件组成 总线 贯穿整个系统的一组电子管道称为总线, 分为: 片内总线 系统总线 数据总线DB 地址总线AB 控制总线CB 外部总线 I/O设备 I/O设备是系统与外界联系的通道 键盘鼠标是输入设备,显式器是输出设备,磁盘既是输入设备也是输出设备,输入输出是相对于内存来说的. 内存 内存是一个重要的部件,它是与CPU进行沟通的桥梁.它用来存放程序以及程序要处理的数据,磁盘中的程序要加载到内存才能运行. 处理器 中央处理器(CPU),简称处理器. CPU主要有运算器.控制器.寄存器构成

机器码农:深度学习自动编程

转自原文机器码农:深度学习自动编程 作者简介:张俊林,中科院软件所博士,曾担任阿里巴巴.百度.新浪微博资深技术专家,目前是用友畅捷通工智能相关业务负责人,关注深度学习在自然语言处理方面的应用. 责编:何永灿,欢迎人工智能领域技术投稿.约稿.给文章纠错,请发送邮件至[email protected] 本文为<程序员>原创文章,未经允许不得转载,更多精彩文章请订阅2017年<程序员> 机器自动编程是人工智能一直以来期望攻克的重要应用领域,随着深度学习的逐步流行,最近在自动编程方向获得了

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

本来想把scanr,foldr什么的都写了的,一想太麻烦了,就算了,模板元编程差不多也该结束了,离开学还有10天,之前几天部门还要纳新什么的,写不了几天代码了,所以赶紧把这个结束掉,明天继续抄轮子叔的Win32库去. 逻辑结构和递归说白了就是做了一个If,一个For_N,If就和Excel里的If一样,For_N是把一个模板结构迭代N遍,为了所谓的方便,把If做成了宏,写起来还挺有意思的 1 template<typename TTest, typename TTrue, typename TF