简介现在,针对移动设备——像智能手机和平板电脑——的应用开发很流行。Apple公司的AppStore(针对iPhone、iPod和iPad)拥有超过350,000种应用,而Android的marketplace也快速追赶上来,现在已经拥有超过200,000种应用。然而,Android和iOS并非是仅有的两种移动平台。BlackBerry也是有力的竞争者,此外还有Nokia。最近Microsoft发布了Windows Phone 7,HP也发布了新的WebOS设备。这样,对于用户来说有了多种选择,但对我们这些开发者来说却是个噩梦。我们应该针对哪种平台来开发应用程序呢? 相关厂商内容在移动平台之间共享代码极度困难。每种平台都选择了自己的开发框架,还有自己的语言和API。对于iOS开发,你需要使用Objective-C和 CocoaTouch API;对于Android开发,你要使用Java和Android API;对于Windows Phone 7,你需要使用.NET和Silverlight API。 然而,我们还是拥有一种解决方案:web开发,特别是:Webkit。 我们会看到,所有主要的移动平台供应商(除了Microsoft之外)都在Webkit之上构建了他们的移动浏览器,而Webkit是当前最新的、速度最 快的开源浏览器引擎。Webkit支持多种移动应用所需要的HTML5 特性,包括侦测触摸手势(轻击、强击和缩放)、定位API(确定用户的位置),并且支持本地数据库(浏览器中的SQLite数据库,用于在本地缓存数 据)。当前,在Android、iOS、WebOS以及BlackBerry OS的六款浏览器中,都对这些特性提供了本地支持。对于不包含基于Webkit的浏览器的设备,我们还可以使用PhoneGap。PhoneGap让我们可以使用web技术(包括HTML5)开发本地应用程序,并把应用程序包装成为本地应用程序,那样就可以分发给用户了(例如,通过平台的应用程序市场)。如果平台还没有内建的WebKit浏览器,那么PhoneGap就会为其提供。PhoneGap应用程序可以在六种不同的移动平台上运行。 JavaScript框架厂商注意到了这是个机会,于是就构建了多种能够在移动web上运行的框架。jQuery Mobile和Sencha Touch都是比较典型的例子。这些框架很容易给人留下深刻的印象,因为对于当前的开发者来说,使用它们来为移动网络开发应用程序是一种不错的方式。然而,它们还都是基于JavaScript、HTML和CSS的,它们的目的都不是要开发应用程序,而是要开发包含超链接文档的网络应用。各种框架试图对这些语言进行调整,从而适合他们的新角色,但是这会引起你的思考,专门为开发移动应用程序 而设计的语言应该是什么样子的呢? 如果我们想要设计这样的一种语言,需要解决什么样的问题呢?
我们的研究小组(软件工程研究小组,位于荷兰代尔夫特理工大学)专注于编程的转换与实现。当前,我们主要专注于领域特定语言。对于当前移动领域的开发,我们觉得有一个很好的机会,可以为移动web开发出一种领域特定语言。我们自问:如果从头开始的话,一门专注于开发移动web应用程序的语言,应该是什么样子的呢? 结论就是mobl。 mobl:从10,000英尺高处俯瞰mobl是一种文本式的、静态类型、编译的语言,主要是通过它的Eclipse插 件应用。这个插件提供了语法高亮显示、内嵌的错误突出显示、引用解析以及代码自动完成。mobl编译器(集成在IDE中)会在每次保存的时候把mobl模 块编译成HTML、JavaScript和CSS的组合。mobl应用程序不依赖于任何特定的服务端技术,而只会处理应用程序的客户端部分。我们可以使用 AJAX的方式调用(JSON)web服务。 mobl语言有大量特性,目的都是为了提高移动开发者的生产率:
简单的To-do列表为了真正了解mobl是什么样子的,我会在这个部分演示如何实现一个简单的to-do列表管理器。 首先我们要在Eclipse中创建一个新的mobl项目,这样会得到mobl项目的基本框架,其中有唯一的应用程序文件,我们把它命名为 application todo import mobl::ui::generic screen root() { header("todo") } 这个mobl模块的第一行定义这是一个application模块。mobl有三种不同类型的模块:
application和regular模块包含任意数量的定义:用户界面、数据模型、样式、web服务接口和函数等等。 首先,让我们来使用 entity Task { name : String (searchable) done : Bool } 对于每个属性我们都会指定名称和类型,并有选择地加上一个或者多个注解。mobl支持两种类型的注解: 接下来,我们对 下面是我们的
最初时,数据库是空的,从而在我们的列表中不会显示任何任务。我们怎样才能添加任务呢? 为了这个目的,我们定义了
使用
然而,尽管我们定义了 header("Tasks") { button("Add", onclick={ addTask(); }) } 正如你所看到的,对屏幕的调用和对一般函数的调用类似,事实上,和函数一样,屏幕也能够返回值。 现在我们的应用程序的功能已经基本完备。我们还要添加最后一个特性:搜索。在我们的数据模型中,我们对 我们需要把
我们向屏幕中添加了新的本地变量 现在我们已经完成了包含搜索功能的基本to-do列表应用程序的构建工作,接下来可以部署了。当我们保存mobl模块的时候,同时也会把它们编译成JavaScript、HTML和CSS,这些文件位于Eclipse项目的 To-do列表之外当然,to-do列表只是个玩具一样的例子,它只使用了一些简单的控件,像 除了定义用户界面、数据模型以及应用程序逻辑的语言结构之外,mobl还拥有以下结构:
想要了解这些特性,你可以查看mobl站点上的教程。 使用DSL还是不使用DSL我们可以把mobl描述为一种领域特定语言(DSL),也就是一种针对特定应用程序领域的语言。在传统上,DSL的领域很有限。例 如,HTML是一种定义结构化web页面的DSL。SQL是用来解释数据库查询的DSL。移动应用程序的领域比上述要大得多。事实上,它非常大,以至于需 要大量你通常只能在一般目的的语言或者GPL——像Java、Python和Ruby——中才能够找到的特性。这些典型的GPL特性包括面向对象编程、 if指令和for循环等等。既然mobl拥有GPL特性,那么它还是一种DSL吗? 我们觉得是,因为它拥有语言结构,这些结构都特别地适合数据驱动的移动web应用程序领域。例如,如果我们使用一种带有样式支持的一般目的语言,编写的是用于处理科学计算的程序,那么就不太合理了。而把 mobl不仅仅是针对移动开发的DSL。类似的还包括Applause和由此衍生的Applitude。然而,这些DSL的灵活性都有限。它们都拥有一系列的内建控件、内建函数,一旦这些都无法满足你的需求,你就需要重新使用Objective-C或者Java来编码了。mobl的目标就是,既要灵活,又要具备较强的表达能力。 为了达到这个目的,我们让这门语言尽可能小,并且通过使用mobl本身编写库来增加功能。例如,我们用来构建to-do列表应用程序的控件都没有内 建在语言之中。相反,它们都是从mobl库导入的,而这个库本身又是使用mobl定义的。在最低层级上,对控件的实现使用了低级的HTML标签和CSS样 式。一般用户只会使用高级别的概念控件,像标题或者按钮等等,而专家级的开发者能够通过调整库中的底层HTML代码来精确地设计按钮的显示样式。 mobl除了能够在库中定义控件之外,它还拥有暴露了大量HTML5 API的库,包括集合定位、使用Canvas进行2D绘图以及WebSockets等等。这些库只是封装了已存在的JavaScript API,而mobl API使用mobl的本地接口,这使得它能够调用“本地”JavaScript代码。这样,mobl就可以通过库机制进行扩展,这让用户可以扩展平台,而不需要扩展语言和编译器本身。 在特定的情况下,mobl会为特定的库添加句法的特性。例如,对于查询,mobl暴露了 var doneTasks = Task.all().filter("done", "=", true) .order("date", false).limit(10); 很明显,这些语法有些麻烦。因此,mobl为查询添加了句法特性,让我们可以把上面的查询写成这样: var doneTasks = Task.all() where done == true order by date desc limit 10; 这不仅更加简洁,而且现在IDE可以检查事实上 结论mobl没有在已存在的语言基础之上构建框架,而是从头开始,构建了一种外部DSL。这种方法有优点也有缺点。缺点在于用户需要学习新语言、新库以 及新的工具。优点在于,选择这种语言来进行设计,可以显著减少开发者所要编写的代码。在mobl中,我们保持它的语法与语义与JavaScript类似, 从而让开发者觉得这种语言很熟悉。此外,mobl能够集成到现有的Eclipse IDE和外围工具中,提供在输入时检测错误、引用解析、代码自动完成和保存时编译等功能。 mobl还是一种很年轻的语言。第一次公开发布是在2011年1月。它的编译器、工具和文档还在逐步完善中。尽管如此,我们觉得它已经显示出在移动领域使用DSL的潜力。 关于作者Zef Hemel现在是荷兰代尔夫特理工大学的博士生,他在那里研究对领域特定语言的设计和实现。他对web技术格外感兴趣。之前他曾经开发过WebDSL和PIL 。他经常在博客上发表博文,并在twitter账号上发推。 |
|