一直以来,iPhone 平台上活跃的语言就只有 Javascript 和 Objective-C。不过最近开始有其他语言加入这一队伍。利用 Mono 的预编译,.net 的应用程序也可以编译通过并在 iPhone 上运行了。四月 RhoMobile 发布了 Rhodes ,Rhodes 支持构建包括 iPhone 及其他系统上的 smartphone 应用。
我们对John M McIntosh进行了采访,就如何在 iPhone 上运行 Squeak,以及使用什么样的编程模型进行了探讨。
InfoQ: 据说您现在正在使用 Squeak 实现一个基于 HTML/Javascript 的 GUI,可以跑在 iPhone 的浏览器控件上,是这样的吗?
实际上要复杂得多,绝不仅仅是使用 Webview。例如,WikiServer 的 Wiki 入口需要展示一个多行文本框,然后是标准键盘和键盘控件条,用于输入特殊字符以及取消或确定指令。虽然 Wiki 信息是通过 Webview 方式来展现的,我们却需要通过 UIKit 来管理四种不同的屏幕。由于不得不使用定制的 Objective-C 类来做这件事以及编译 VM,所以你可以选择一部分工作使用 Smalltalk 来做,而另一部分交给 Objective-C。技术上来说,你可以用 Smalltalk 做任何工作,但实际上会存在性能问题,所以没有什么实质上的收益。 由于 UI 在 iPhone 的唯一性,所以需要将可视层与领域模型剥离开来,这也是基本的 MVC 逻辑。事实上,WikiServer 最初是一个自带控制屏的蹩脚应用,有人就质疑:难道我们就不能直接在设备上编辑内容么?不过,后来我们也没有采用构建通用 UI 层启用平台特定实现的方法,因为那样的工作量要大得多。这里我要提一下 http://news.squeak.org/2009/01/08/squeak-goes-to-mars,Esteban Lorenzano 已经实现了一个 Cocoa UI 框架,旨在 iPhone 应用。此外我也注意到其他诸如 Cincom 的 Visualworks 这样的 Smalltalk 系统,它使用的是原生窗口部件,不过启用这个系统还是很费劲的,现在我们还不想做此努力。
InfoQ: 你用什么来实现 web 应用?Seaside 吗?
Seaside 用于提供网页,然后是 UIWebView,这是一种用 Mobile Safari 渲染网页的 UIView。理论上讲,任何大小适中的 seaside 应用都可以跑在 iPhone 上。
InfoQ: 你能在 iPhone 上使用 Squeak 映像么?在其他系统上是否能够修改并且保存呢?比如说,桌面系统上也可以么?
有了 isqueak.org 上提供的基本软件,iphone 开发者就可以选择自己想要的映像来构建一个 squeak。更新一下映像,就可以引入 multi-touch 逻辑以及 Objectiv-C 的接口。通过触摸与 Squeak 桌面的交互,你也可以选择保存映像。 我们的 Swirl 应用 http://www.mobilewikiserver.com/Swirl.html 就展示了 Squeak 桌面,其中触摸功能禁用了。我们使用 UIKit 的 Alert 对话框来获取信息。
我们的 Fration 应用 http://www.mobilewikiserver.com/Fraction.html 很像 WikiServer,它包括两个 UIKit 屏幕,通过触摸交互将计算请求发送给计算引擎,这个计算引擎是不知道 UI 存在的,它只是接受击键并更新文本串。
InfoQ: 目前的应用大小大概是 16/7MB,有可能进一步优化大小么?
SqueakDocs 和 ST80Docs 比这个数大多了,因为他们是压缩过的,而且包括四月份左右发布的基于 Web 的 Squeak 和 Pharo 开发映像的源代码。一旦安装到 iPhone 上他们就需要 54MB 的闪存空间。这个数字和 RAM 的大小不是一回事:大约 10MB 的 RAM 用来装载 VM 和 Mobile Safari(如果没有 safari 会少几 MB),然后是映像,所以他们一共需要大概 35MB 的随机内存。 WikiServer 所需的随机内存要小得多,14MB,不过这可是精心调优后的结果。
InfoQ: Pharo 和 Squeak 版本的差异是什么?
Squeak 版本是基于 Web 开发的开发者映像,通过 squeak.org 就可以获取。我们从 WikiServer 中补充了一些功能进来,包括支持 web view,状态以及信息屏等。除了我们提供的补充和少量的一些加快启动速度的小改动之外,和你下载下来的映像没有什么差异了。Pharo 版本是 Pharo 团队的产品,他们想让这个映像更商业化,而不是为了提供开发学习,所以很多 Morphic 和 eToys 都已经裁剪掉了。而且他们有更加活跃的更新流以及积极主动的方法去及时修正 bug。
InfoQ: 是否有可能通过精简映像元素来减小映像大小?还是这已经是精简后的版本了?
我会在 http://www.esug.org/Conferences/2009/Current+List+of+Talks/Smalltalk+on+iPhone 中详细探讨这个问题。 基本的 Pharo 映像大约是 22MB,我们删除了其中 12MB 的代码,这样 WikiServer 所用到的差不多是 10.5MB。Swirl 不包括 Seaside,大约是 6MB。这还有进一步降低的可能,我们会利用 Craig Latta 在小型映像上所做的工作 http://netjam.org/projects/spoon/,我们也利用 iPhone 上的虚存管理器,做到只有当网页确实被请求执行时才交换到 RAM。对于 WikiServer 而言,差不多 4M 的映像数据在应用执行是完全不需要的。
Apple AppStore 上已经有基于 Squeak 的商用应用提供,包括 WikiServer (注:ITunes 链接,另外还有一个 Mobile Wiki Server 站点)、 SqueakDocs using Squeak (注:ITunes 链接)以及 SqueakDoc using Pharo (注:ITunes 链接)等。
评论