写点什么

Randal Schwartz 访谈:Ruby 之根——Smalltalk 王者归来

2008 年 12 月 01 日

Gartner 的分析师 Mark Drivezr在近日的一篇blog 中提到近来人们对于Smalltalk 日益关注。这一现象背后的原因很多,其中的一个重要的因素就是诸如Ruby、Python 这些动态语言的流行。Smalltalk 早在上世纪七八十年代就已经开始流行,并对于Ruby 这些后来的动态语言产生了深远的影响。许多Smalltalk 虚拟机都已经历经时间的考验,非常成熟。

Seaside

Smalltalk 之所以引人关注还得归功于基于 Smalltalk 的 web 框架——Seaside,而 Seaside 之于 Smalltalk 正如 Ruby on Rails 之于 Ruby。 Seaside 已经推出了一段时间,也引起了广泛的关注。Avi Bryant 正是基于 Seaside 开发了在线数据库 DabbleDB(InfoQ 曾做过 Avi Bryant 的访谈,其中涉及了 DabbleDB 如何利用 Smalltalk 的 image 概念来做持久化,以及 Squeak 的伸缩性问题)。

虽然 Seaside 是构建于 Squeak 之上,但近来还是有很多其它 Smalltalk 厂商也开始支持 Seaside 本身。 Cincom Smalltalk 不仅支持 Seaside,并为其提供了一个浏览器中的 GUI 工具 WebVelocity(您可以观看短版本的介绍,也可以在Google Video 观看长版本的演示)。提供持久化和集群特性的Smalltalk 分支 GemStone/S ,其出品厂商 GemStone 同样支持 Seaside,比如他们的 GLASS 产品(这一产品也有免费版)。

Ruby 和 Smalltalk

Smalltalk 曾经对 Ruby 产生过深远的影响,而且还将持续的影响着 ruby 的发展。例如 Rubinius 已经使用 Squeak Smalltalk 作为实现其虚拟机的参考模型,而 GemStone 的 Maglev 更是直接构建于 Smalltalk 虚拟机之上。

虽然 Ruby 的语法比起 Smalltalk 要复杂的多,但还是可以看出许多 Smalltalk 的影响。例如 Named parameters(对应于 Smalltalk 中的“keyword messages”),在 Ruby 中并不直接提供,需要使用 literal hash 来模仿。而 literal hash 这一特性在 Smalltalk 中早已存在了。

Ruby:

复制代码
def foo(arghash)
# ... do something with arguments
42
end
foo( :name => "foo", :size => 42)

注意:Ruby 1.9提供了更为简洁的 literal hash 语法,可以减少一些不需要的字符。

而使用 Smalltalk 的 keyword message 机制来做(注意方法名由所有 keyword argument 组成):

复制代码
:name name :size size
"this is a comment ... do something with arguments"
^42.
receiver name: 'foo' size: 42.

诸如 Objective-C 这样的语言也有 Smalltalk 风格的 keyword message 特性。

在最近加入新的“stabby lambda”语法(-> {})后,Ruby 中 Lambdas、Procs 和 Blocks 之间区分变得更加复杂。Smalltalk 规避了这一点。在 Smalltalk 中,创建 block 的方法只有一种:像[:argument| ^42]这样,接收一个参数,并且返回 42。

Smalltalk 和 Ruby 另外一个区别在于可用的工具和 IDE。相对于 Ruby IDE 的短暂历史,Smalltalk 则很早就被紧密的集成到了 IDE 中(当然,诸如 GemStone/S 和 GNU Smalltalk 这样的 Smalltalk 分支并没有特定的 IDE)。Ruby IDE 与 Smalltalk IDE 很大区别在于:所有的 Ruby IDE 都是用非 Ruby 语言编写的。例如 Aptana (RDT)、3rd Rail (DLTK)、Netbeans 和 IntelliJ 是由 Java 编写,SapphireSteel 的 Ruby In Steel 则是基于 Visual Studio。唯一的特例是 FreeRIDE,虽然它是基于 Ruby 的,但其开发工作似乎已经停滞。

Ruby IDEs 提供了静态分析,类型推断,以及其它一些用于分析和修改 Ruby 代码的逻辑——但实现这些逻辑的代码都是用 Java 或 C#编写,并且依赖于 JRuby 或 RubyInSteel 的抽象语法树(AST)。这一情况随着最近 Ryan Davis 的 ruby_parser 的出现而改观。ruby_parser 可以返回 Ruby 代码的 AST(使用 UnifiedRuby 格式),并且包含完整的注释和代码行。

Smalltalk 的 IDE则采用 Smalltalk 编写,同时提供了静态分析工具和重构工具(史上的第一个重构工具其实正是 Smalltalk 的 Refactoring Browser )。

Randal L. Schwartz 访谈

为了了解从脚本语言(Perl)转向 Smalltalk 的感受,我们采访了Randal L. Schwartz。Randal 是 Perl 领域多本畅销书和专栏的作者。最近他开始积极地使用并推广 Smalltalk,提出了“Smalltalk 时代”的口号。他同时还是 Squeak团队的领导之一。

InfoQ:Seaside 使用 continuation 机制来维护状态,这一做法已广为人知。Avi Bryant 最近提到他正在研发的产品 DabbleDB 已经移除了 continuation 的使用,因为 AJAX 提供了另一种应用模型。您对此有何看法?Seaside 的优势体现在哪些方面?

continuation 让我可以创建抽象控制流,和创建 layout view 的方式类似。我可以编写一个诸如“显示此表单直到验证结束”的抽象,continuation 库就可以在页面尚未完整时,返回 web 表单直至验证结束,看起来就像是在一次调用中显式的包含了该规则一样。如果没有 continuation 机制,我就得依仗一些顶级的 recognizer 来表达 “ok,这是现在需要的对表单输入的 response”,我会因此失去本地状态。

InfoQ:你在你的 Smalltalk 和 Seaside 应用中使用了什么方法来做持久化?你在使用关系数据库吗?Smalltalk 的 ORM 库情况如何?

对于遗留接口,Glorp 是对象 - 关系映射的不二选择。Glorp 正在开发当中,目标是为 Glorp 也增加一个“Active-Record”风格的层。
对于新应用来说,我强烈推荐 GemStone 的产品,该产品将虚拟机完全放在了一个可持久化的环境中。对象可以自然的持久化,因而不需要再被拆成 SQL 来与传统数据库交互。

InfoQ:你使用哪个版本的 Smalltalk——你用过那些版本?它们都差不多——还是某些更适合特定的问题领域?

我是 Squeak 领导小组的成员,并且从最初发布到现在一直在密切关注它。只是最近才开始尝试 Cincom VisualWorks,所以还在边用边学。我认为 GNU Smalltalk 很有意思,但作为 Squeak 的贡献者,因为许可证问题我看不到源码。(GPL 代码不能被导入到使用 MIT 许可的发布版中)。

InfoQ:Ruby 1.9 加入了 Fiber——一种进行系统性协同程序的机制。一些 Smalltalk 版本也使用了 Fiber,而不使用重型的内核线程。对此你怎么看?对于那些只有用户空间线程的 Smalltalk 版本来说,是否有使用内核线程的考虑?

我个人对线程没有什么好印象。在 UNIX 中,线程被拼写为“f o r k”,这是有原因的。我认为共享应该是选择性的加入,而不是选择性的退出。而线程的默认机制恰恰是错误的。

InfoQ:你已经积极推动 Smalltalk 一段时间了。关于 Smalltalk,你最常遇到的质疑是什么?请列举两个。

“Smalltalk,这语言不是已经退休了吗?”当然不是!
“如果用 Smalltalk 的话,还能用我最喜欢的编辑器吗?”基本上不可以,而且我觉得当你意识到你只是在编辑 5 到 10 行代码时,你不会对你最喜欢的编辑器有多少留恋,而是会很想要一个对于当前环境非常敏感的编辑器。内建的编辑器可以很好满足这一点。

要想在像 Eclipse 这样的 IDE 下来完成 Smalltalk 的编程任务,可以使用 STDT 。它基于 Eclipse 并将 Smalltalk 的代码对应到文件和资源。播客“Industry Misinterpretation”曾对STDT 的开发者之一进行过一次很长时间的访谈。 此外,Eclipse 和Smalltalk 本就应该紧密结合,因为 Rick DeNatale 表示 Eclipse 实际上起源于 IBM 在 Smalltalk 方面的投入

InfoQ:用最简要的语言来描述一下 Smalltalk 吧! 比如你会如何跟 perl 社区的朋友介绍它?

Smalltalk——我可以在 20 分钟内给你讲完所有的语法。它是完全面向对象的,debugger 允许“现场”调试,甚至是在一个 web 环境中。Smalltalk 包含内建的源代码管理,而且可以直接与系统中的任何库交互,或通过 FFI 进行交互。Smalltalk 可以与文件、设备和 socket 交互,其能力丝毫不逊于任何 Perl 程序。而且,Smalltalk 已经历经长时间的检验。你与系统交互的任何一部分都是开放的,可编辑的,可订制的,包括你的开发工具在内。

InfoQ:现在 Squeak 背后的团队组成是什么样的?开发工作是如何推进的?

Squeak 领导小组(我是其中一员)代表整个社区负责这个项目。我们还有 Web 小组、发布小组、新闻小组等团队来处理各方面的事务。( http://www.squeak.org/Community/Teams/)

InfoQ:你认为 Perl 中的哪些特性或语言概念是你非常喜欢,但在 Smalltalk 中无法找到的?

我仍然在使用 Perl 来编写命令行脚本。Smalltalk 可并不是编写这些小程序的好选择:)

InfoQ:你对 Ruby 的 Open Classe(Monkey Patching)有何看法?你使用过 Squeak 的 Trait 吗?

Ruby 增加了这个包以后,就可以像 seaside 这样能够让每个对象在页面上“渲染自己”,并且提供类路由机制来做出合适的选择,非常不错。如果没有这种路由,你就得在用户代码级别来建立类似功能的类,这肯定是不合适的。

InfoQ:Ruby 最近推出了很多新的实现—— Smalltalk 已经有了来自不同厂商的各种运行时。你觉得这些各种各样的实现是问题还是财富?

我现在使用的两个主要(Squeak 和 VisualWorks)的 Smalltalk 实际上来自于共同的起源(最初的 Xerox Parc image),所以差异性不是个大问题。不过像 Seaside 这样的项目确实让我们确信,实际上商们在产品特性方面走得很近,这是件好事。

更多关于 Randal 对 Smalltalk 的评论信息,可以参见他在Industry Misinterpretation 的访谈podcast ,他还共同主持 FLOSS 每周 podcast 。其中有一集可能对 Smalltalk 的爱好者来说尤为有趣: FLOSS 29:Dan Ingalls 访谈。在 1970 年代早期,Dan 根据 Alan Kay 制定的语言规约编写了第一个 Smalltalk 运行时,并随后在 PARC 编写了很多的 Smalltalk 版本,包括 Squeak 。此外,Randal 还撰写关于Smalltalk 的blog

想要了解关于Smalltalk 的更多信息以及Smalltalk 开发者如何进行软件开发,可以关注Cincom 公司的 James Robertson,他撰写关于 Smalltalk 的 blog,此外每天发布一部 screencast,每周发布一部 podcast
GemStone 有一个专注于GLASS 的blog 。GLASS 是GemStone/Linux/Apache/Smalltalk/Seaside 软件栈的缩写。

最后,你可以在网上获得 Smalltalk 的免费图书

阅读英文原文: Ruby’s Roots: Smalltalk Comeback and Randal Schwartz on Smalltalk


志愿参与 InfoQ 中文站内容建设,请邮件至 editors@cn.infoq.com 。也欢迎大家到 InfoQ 中文站用户讨论组参与我们的线上讨论。

2008 年 12 月 01 日 21:372150
用户头像

发布了 24 篇内容, 共 19981 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

和 lvgo 一起学习设计模式.PDF

lvgo

Java 设计模式 23种设计模式

第十三周 作业

熊桂平

极客大学架构师训练营

Linux安装MySQL标准教程

Simon

MySQL centos 安装 七日更

RPC 核心,万变不离其宗

yes的练级攻略

Java 微服务 后端 RPC

【STL 源码剖析】浅谈 STL 迭代器与 traits 编程技法

herongwei

c++ 后端 迭代器模式 源码剖析 stl

突破某度云盘下载限速,提速30倍!想学?我教你啊

Silently9527

百度云 HTTP

Win10环境前后端分离项目基于Vue.js+Django+Python3实现微信(wechat)扫码支付流程(2021年最新攻略)

刘悦的技术博客

django Vue 微信支付 python3 请求数据 扫码

数字货币量化交易所系统开发案例

系统开发咨询:I76-883I-5I52 邓森

盘点2020 | 云上建站流程全解,教你如何节约成本

老魚

云服务器 建站 盘点2020 web全栈

架构师 3 期 3 班 -week5- 总结

zbest

总结 week5

生产环境全链路压测建设历程 16:淘宝网高可用历程的总结

数列科技杨德华

全链路压测 七日更

十日谈:我的 2020

escray

2020 日更挑战 十日谈

公安重点人员管控系统开发方案,合成作战平台建设

WX13823153201

公安重点人员管控系统开发

智慧平安小区搭建,智慧社区综合服务平台开发

t13823115967

智慧城市 智慧社区管理平台开发

架构的业务属性

soolaugust

架构 设计 架构师 七日更

第十三周 学习总结

熊桂平

极客大学架构师训练营

vivo 商城架构升级-SSR 实战篇

vivo互联网技术

前端 服务端 Node SSR

Flutter动态创建UI实现方案

FisherJoe

区块链钱包软件系统开发及费用

系统开发咨询:I76-883I-5I52 邓森

智慧公安防控管理,重点人员管控系统建设方案

t13823115967

智慧公安 情报研判系统建设

阿里不允许使用 Executors 创建线程池!那怎么使用,怎么监控?

小傅哥

Java JVMTI 线程池 七日更 Executors

数字货币持币生息钱包系统开发案例

系统开发咨询:I76-883I-5I52 邓森

数字资产交易所系统开发交易平台APP

系统开发咨询:I76-883I-5I52 邓森

什么是定点数?

Kaito

计算机基础

全球第一个 Serverless Redis 服务:Lambda Store 免费用

donghui2020

redis Serverless Lambda Store

区块链交易所系统开发,合约交易模式软件方案

系统开发咨询:I76-883I-5I52 邓森

架构师 3 期 3 班 -week5- 作业

zbest

作业 week5

文件写入的6种方法,这种方法性能最好

王磊

Java io 文件读写 文件操作 文件写入

FGC青蛙钱包系统开发|FGC青蛙钱包软件APP开发

开發I852946OIIO

系统开发

数字货币交易所币币OTC交易系统开发

系统开发咨询:I76-883I-5I52 邓森

量化交易模式系统开发app案例

系统开发咨询:I76-883I-5I52 邓森

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

Randal Schwartz访谈:Ruby之根——Smalltalk王者归来-InfoQ