尽管 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 。
评论