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 中文站用户讨论组参与我们的线上讨论。
评论