将 Javascript 作为编译目标:Clamato、GWT Smalltalk、Python、Scheme

  • Werner Schuster
  • 丁雪丰

2009 年 10 月 16 日

话题:RubyJavaScriptPython架构Android语言 & 开发

尽管 Javascript 无处不在,但还是很难让人喜欢它。在类似 Google V8、Apple/WebKit 的 Nitro/SquirrelFish Extreme 和 Firefox 的 TraceMonkey 这样的 VM 出现之前,Javascript 的性能并不理想。多个浏览器间互不兼容的实现也让开发十分痛苦。jQuery 和其他一些类库提供了方便好用的抽象,可以用同一种 API 进行编程,甚至消除不兼容性。

解决该问题的另一种方法是彻底隐藏 Javascript,将其作为编译目标。Google 的GWT就是一个很成熟的例子,它接受 Java 代码(用 Java API 的一个子集写的),并将它编译为针对浏览器的 Javascript。现实中 GWT 的真实案例之一就是 Google Wave 客户端。最近,一些其他语言的实现也加入了这一行列。

Avi Bryant,Smalltalk Seaside Web 框架的作者,开发了Clamato,这是一种能编译为常见 Javascript 的 Smalltalk 方言。Avi 在FutureRuby 时 InfoQ 对他的采访中描述了 Clamato 的设计原则。

Clamato 的指南页面允许你在浏览器中打开一个 Clamato(Smalltalk)类浏览器,查看并编辑 Clamato 源代码。要查找类的话,就使用类浏览器左上角的文本框。比较有意思的是那个自托管的基于 PEG 的 Clamato 解析器(在文本框中键入“PP”可以看到解析器和各种组合程序的类)。从 Seaside 风格的 HTML 构造器(Clamato 浏览器中的 HTMLCanvas 类)中我们可以看到 Seaside 的影子。可视化组件能用它来构造 GUI,例如,指南中的计数器组件:

renderOn: html
  html h3 with: @counter.
  html button
    with: '+';
    onClick: [@counter := @counter + 1. self reload].
  html button
    with: '-';
    onClick: [@counter := @counter - 1. self reload].

renderOn: html 这一行定义了一个新的方法,范例的其他部分是方法体,它构建了带一个页眉和两个按钮的 HTML,两个按钮配置了事件处理器。无独有偶,最近还出现了另一个基于浏览器的 Smalltalk——GWT Smalltalk。它的作者 Peter Fisk 之前创造了 Vista Smalltalk,它可以基于.Net,也可以基于 ActionScript。GWT Smalltalk 使用了 GWT 来生成运行在浏览器中的 Jaavscript。

GWT Smalltalk 刚处于起步阶段,但发展很快。目前已经支持使用 XMPP,这让它能方便地与 Google Wave 进行交互(XMPP 是 Google Wave 极其重要的一部分)。你可以从Industry Misinterpretations 对 Peter Fisk 的采访播客GWT Smalltalk 的博客上获得更多细节。

讲完了 Smalltalk,再来看看 Python,它也有自己的 Javascript 编译器——pyjamas

pyjamas 是一个独立的 Python 到 Javascript 的编译器、一个 AJAX 框架 / 类库和一种 Widget 集 API

作为入门,最好的去处是在线 pyjamas 图书

另一种能编译为 Javascript 的语言是Moby Scheme。让它如此引人注目的是它针对移动设备(目前是 Android)的方式——将代码编译为 Javascript。这一做法是可行的,因为有PhoneGap,而且 Android 里那个基于 WebKit 的浏览器自带了一个高效的 Javascript VM。PhoneGap 是一个允许 Javascript 访问本地设备功能的类库,这设备可以是加速度计、GPS、摄像头,也可以是类似通讯簿之类的东西。 PhoneGap 的作者用它建起了沟通不同智能电话设备间的桥梁,它们可以有不同的编程环境,只要都有 WebKit 和快速的 Javascript VM 就可以了。通过让 Javascript 访问设备功能,就能为智能电话开发跨平台的应用。详见InfoQ 对 PhoneGap 作者关于 PhoneGap 概览的采访

查看英文原文:Javascript as Compiler Target: Clamato, GWT Smalltalk, Python, Scheme

译者介绍:丁雪丰,网名 DigitalSonic,满江红开放技术研究组织核心成员,Spring Framework 2.0 & 2.5 文档翻译项目负责人,也参与了 Hibernate、Seam 等多份文档的翻译及校对工作。平时积极投身开源项目,是著名 SFTP/SCP 软件 WinSCP的简体中文汉化者。参与翻译及编著的书籍有《Spring 攻略》《JRuby 实战》等。InfoQ 中文站内容团队,尤其是架构、SOA 和 Ruby 社区需要您的参与,有意者请邮件至editors【AT】cn.infoq.com

RubyJavaScriptPython架构Android语言 & 开发