簡(jiǎn)介現(xiàn)在,針對(duì)移動(dòng)設(shè)備——像智能手機(jī)和平板電腦——的應(yīng)用開(kāi)發(fā)很流行。Apple公司的AppStore(針對(duì)iPhone、iPod和iPad)擁有超過(guò)350,000種應(yīng)用,而Android的marketplace也快速追趕上來(lái),現(xiàn)在已經(jīng)擁有超過(guò)200,000種應(yīng)用。然而,Android和iOS并非是僅有的兩種移動(dòng)平臺(tái)。BlackBerry也是有力的競(jìng)爭(zhēng)者,此外還有Nokia。最近Microsoft發(fā)布了Windows Phone 7,HP也發(fā)布了新的WebOS設(shè)備。這樣,對(duì)于用戶來(lái)說(shuō)有了多種選擇,但對(duì)我們這些開(kāi)發(fā)者來(lái)說(shuō)卻是個(gè)噩夢(mèng)。我們應(yīng)該針對(duì)哪種平臺(tái)來(lái)開(kāi)發(fā)應(yīng)用程序呢? 相關(guān)廠商內(nèi)容在移動(dòng)平臺(tái)之間共享代碼極度困難。每種平臺(tái)都選擇了自己的開(kāi)發(fā)框架,還有自己的語(yǔ)言和API。對(duì)于iOS開(kāi)發(fā),你需要使用Objective-C和 CocoaTouch API;對(duì)于Android開(kāi)發(fā),你要使用Java和Android API;對(duì)于Windows Phone 7,你需要使用.NET和Silverlight API。 然而,我們還是擁有一種解決方案:web開(kāi)發(fā),特別是:Webkit。 我們會(huì)看到,所有主要的移動(dòng)平臺(tái)供應(yīng)商(除了Microsoft之外)都在Webkit之上構(gòu)建了他們的移動(dòng)瀏覽器,而Webkit是當(dāng)前最新的、速度最 快的開(kāi)源瀏覽器引擎。Webkit支持多種移動(dòng)應(yīng)用所需要的HTML5 特性,包括偵測(cè)觸摸手勢(shì)(輕擊、強(qiáng)擊和縮放)、定位API(確定用戶的位置),并且支持本地?cái)?shù)據(jù)庫(kù)(瀏覽器中的SQLite數(shù)據(jù)庫(kù),用于在本地緩存數(shù) 據(jù))。當(dāng)前,在Android、iOS、WebOS以及BlackBerry OS的六款瀏覽器中,都對(duì)這些特性提供了本地支持。對(duì)于不包含基于Webkit的瀏覽器的設(shè)備,我們還可以使用PhoneGap。PhoneGap讓我們可以使用web技術(shù)(包括HTML5)開(kāi)發(fā)本地應(yīng)用程序,并把應(yīng)用程序包裝成為本地應(yīng)用程序,那樣就可以分發(fā)給用戶了(例如,通過(guò)平臺(tái)的應(yīng)用程序市場(chǎng))。如果平臺(tái)還沒(méi)有內(nèi)建的WebKit瀏覽器,那么PhoneGap就會(huì)為其提供。PhoneGap應(yīng)用程序可以在六種不同的移動(dòng)平臺(tái)上運(yùn)行。 JavaScript框架廠商注意到了這是個(gè)機(jī)會(huì),于是就構(gòu)建了多種能夠在移動(dòng)web上運(yùn)行的框架。jQuery Mobile和Sencha Touch都是比較典型的例子。這些框架很容易給人留下深刻的印象,因?yàn)閷?duì)于當(dāng)前的開(kāi)發(fā)者來(lái)說(shuō),使用它們來(lái)為移動(dòng)網(wǎng)絡(luò)開(kāi)發(fā)應(yīng)用程序是一種不錯(cuò)的方式。然而,它們還都是基于JavaScript、HTML和CSS的,它們的目的都不是要開(kāi)發(fā)應(yīng)用程序,而是要開(kāi)發(fā)包含超鏈接文檔的網(wǎng)絡(luò)應(yīng)用。各種框架試圖對(duì)這些語(yǔ)言進(jìn)行調(diào)整,從而適合他們的新角色,但是這會(huì)引起你的思考,專門(mén)為開(kāi)發(fā)移動(dòng)應(yīng)用程序 而設(shè)計(jì)的語(yǔ)言應(yīng)該是什么樣子的呢? 如果我們想要設(shè)計(jì)這樣的一種語(yǔ)言,需要解決什么樣的問(wèn)題呢?
我們的研究小組(軟件工程研究小組,位于荷蘭代爾夫特理工大學(xué))專注于編程的轉(zhuǎn)換與實(shí)現(xiàn)。當(dāng)前,我們主要專注于領(lǐng)域特定語(yǔ)言。對(duì)于當(dāng)前移動(dòng)領(lǐng)域的開(kāi)發(fā),我們覺(jué)得有一個(gè)很好的機(jī)會(huì),可以為移動(dòng)web開(kāi)發(fā)出一種領(lǐng)域特定語(yǔ)言。我們自問(wèn):如果從頭開(kāi)始的話,一門(mén)專注于開(kāi)發(fā)移動(dòng)web應(yīng)用程序的語(yǔ)言,應(yīng)該是什么樣子的呢? 結(jié)論就是mobl。 mobl:從10,000英尺高處俯瞰mobl是一種文本式的、靜態(tài)類型、編譯的語(yǔ)言,主要是通過(guò)它的Eclipse插 件應(yīng)用。這個(gè)插件提供了語(yǔ)法高亮顯示、內(nèi)嵌的錯(cuò)誤突出顯示、引用解析以及代碼自動(dòng)完成。mobl編譯器(集成在IDE中)會(huì)在每次保存的時(shí)候把mobl模 塊編譯成HTML、JavaScript和CSS的組合。mobl應(yīng)用程序不依賴于任何特定的服務(wù)端技術(shù),而只會(huì)處理應(yīng)用程序的客戶端部分。我們可以使用 AJAX的方式調(diào)用(JSON)web服務(wù)。 mobl語(yǔ)言有大量特性,目的都是為了提高移動(dòng)開(kāi)發(fā)者的生產(chǎn)率:
簡(jiǎn)單的To-do列表為了真正了解mobl是什么樣子的,我會(huì)在這個(gè)部分演示如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的to-do列表管理器。 首先我們要在Eclipse中創(chuàng)建一個(gè)新的mobl項(xiàng)目,這樣會(huì)得到mobl項(xiàng)目的基本框架,其中有唯一的應(yīng)用程序文件,我們把它命名為 application todo import mobl::ui::generic screen root() { header("todo") } 這個(gè)mobl模塊的第一行定義這是一個(gè)application模塊。mobl有三種不同類型的模塊:
application和regular模塊包含任意數(shù)量的定義:用戶界面、數(shù)據(jù)模型、樣式、web服務(wù)接口和函數(shù)等等。 首先,讓我們來(lái)使用 entity Task { name : String (searchable) done : Bool } 對(duì)于每個(gè)屬性我們都會(huì)指定名稱和類型,并有選擇地加上一個(gè)或者多個(gè)注解。mobl支持兩種類型的注解: 接下來(lái),我們對(duì) 下面是我們的
最初時(shí),數(shù)據(jù)庫(kù)是空的,從而在我們的列表中不會(huì)顯示任何任務(wù)。我們?cè)鯓硬拍芴砑尤蝿?wù)呢? 為了這個(gè)目的,我們定義了
使用
然而,盡管我們定義了 header("Tasks") { button("Add", onclick={ addTask(); }) } 正如你所看到的,對(duì)屏幕的調(diào)用和對(duì)一般函數(shù)的調(diào)用類似,事實(shí)上,和函數(shù)一樣,屏幕也能夠返回值。 現(xiàn)在我們的應(yīng)用程序的功能已經(jīng)基本完備。我們還要添加最后一個(gè)特性:搜索。在我們的數(shù)據(jù)模型中,我們對(duì) 我們需要把
我們向屏幕中添加了新的本地變量 現(xiàn)在我們已經(jīng)完成了包含搜索功能的基本to-do列表應(yīng)用程序的構(gòu)建工作,接下來(lái)可以部署了。當(dāng)我們保存mobl模塊的時(shí)候,同時(shí)也會(huì)把它們編譯成JavaScript、HTML和CSS,這些文件位于Eclipse項(xiàng)目的 To-do列表之外當(dāng)然,to-do列表只是個(gè)玩具一樣的例子,它只使用了一些簡(jiǎn)單的控件,像 除了定義用戶界面、數(shù)據(jù)模型以及應(yīng)用程序邏輯的語(yǔ)言結(jié)構(gòu)之外,mobl還擁有以下結(jié)構(gòu):
想要了解這些特性,你可以查看mobl站點(diǎn)上的教程。 使用DSL還是不使用DSL我們可以把mobl描述為一種領(lǐng)域特定語(yǔ)言(DSL),也就是一種針對(duì)特定應(yīng)用程序領(lǐng)域的語(yǔ)言。在傳統(tǒng)上,DSL的領(lǐng)域很有限。例 如,HTML是一種定義結(jié)構(gòu)化web頁(yè)面的DSL。SQL是用來(lái)解釋數(shù)據(jù)庫(kù)查詢的DSL。移動(dòng)應(yīng)用程序的領(lǐng)域比上述要大得多。事實(shí)上,它非常大,以至于需 要大量你通常只能在一般目的的語(yǔ)言或者GPL——像Java、Python和Ruby——中才能夠找到的特性。這些典型的GPL特性包括面向?qū)ο缶幊獭? if指令和for循環(huán)等等。既然mobl擁有GPL特性,那么它還是一種DSL嗎? 我們覺(jué)得是,因?yàn)樗鼡碛姓Z(yǔ)言結(jié)構(gòu),這些結(jié)構(gòu)都特別地適合數(shù)據(jù)驅(qū)動(dòng)的移動(dòng)web應(yīng)用程序領(lǐng)域。例如,如果我們使用一種帶有樣式支持的一般目的語(yǔ)言,編寫(xiě)的是用于處理科學(xué)計(jì)算的程序,那么就不太合理了。而把 mobl不僅僅是針對(duì)移動(dòng)開(kāi)發(fā)的DSL。類似的還包括Applause和由此衍生的Applitude。然而,這些DSL的靈活性都有限。它們都擁有一系列的內(nèi)建控件、內(nèi)建函數(shù),一旦這些都無(wú)法滿足你的需求,你就需要重新使用Objective-C或者Java來(lái)編碼了。mobl的目標(biāo)就是,既要靈活,又要具備較強(qiáng)的表達(dá)能力。 為了達(dá)到這個(gè)目的,我們讓這門(mén)語(yǔ)言盡可能小,并且通過(guò)使用mobl本身編寫(xiě)庫(kù)來(lái)增加功能。例如,我們用來(lái)構(gòu)建to-do列表應(yīng)用程序的控件都沒(méi)有內(nèi) 建在語(yǔ)言之中。相反,它們都是從mobl庫(kù)導(dǎo)入的,而這個(gè)庫(kù)本身又是使用mobl定義的。在最低層級(jí)上,對(duì)控件的實(shí)現(xiàn)使用了低級(jí)的HTML標(biāo)簽和CSS樣 式。一般用戶只會(huì)使用高級(jí)別的概念控件,像標(biāo)題或者按鈕等等,而專家級(jí)的開(kāi)發(fā)者能夠通過(guò)調(diào)整庫(kù)中的底層HTML代碼來(lái)精確地設(shè)計(jì)按鈕的顯示樣式。 mobl除了能夠在庫(kù)中定義控件之外,它還擁有暴露了大量HTML5 API的庫(kù),包括集合定位、使用Canvas進(jìn)行2D繪圖以及WebSockets等等。這些庫(kù)只是封裝了已存在的JavaScript API,而mobl API使用mobl的本地接口,這使得它能夠調(diào)用“本地”JavaScript代碼。這樣,mobl就可以通過(guò)庫(kù)機(jī)制進(jìn)行擴(kuò)展,這讓用戶可以擴(kuò)展平臺(tái),而不需要擴(kuò)展語(yǔ)言和編譯器本身。 在特定的情況下,mobl會(huì)為特定的庫(kù)添加句法的特性。例如,對(duì)于查詢,mobl暴露了 var doneTasks = Task.all().filter("done", "=", true) .order("date", false).limit(10); 很明顯,這些語(yǔ)法有些麻煩。因此,mobl為查詢添加了句法特性,讓我們可以把上面的查詢寫(xiě)成這樣: var doneTasks = Task.all() where done == true order by date desc limit 10; 這不僅更加簡(jiǎn)潔,而且現(xiàn)在IDE可以檢查事實(shí)上 結(jié)論mobl沒(méi)有在已存在的語(yǔ)言基礎(chǔ)之上構(gòu)建框架,而是從頭開(kāi)始,構(gòu)建了一種外部DSL。這種方法有優(yōu)點(diǎn)也有缺點(diǎn)。缺點(diǎn)在于用戶需要學(xué)習(xí)新語(yǔ)言、新庫(kù)以 及新的工具。優(yōu)點(diǎn)在于,選擇這種語(yǔ)言來(lái)進(jìn)行設(shè)計(jì),可以顯著減少開(kāi)發(fā)者所要編寫(xiě)的代碼。在mobl中,我們保持它的語(yǔ)法與語(yǔ)義與JavaScript類似, 從而讓開(kāi)發(fā)者覺(jué)得這種語(yǔ)言很熟悉。此外,mobl能夠集成到現(xiàn)有的Eclipse IDE和外圍工具中,提供在輸入時(shí)檢測(cè)錯(cuò)誤、引用解析、代碼自動(dòng)完成和保存時(shí)編譯等功能。 mobl還是一種很年輕的語(yǔ)言。第一次公開(kāi)發(fā)布是在2011年1月。它的編譯器、工具和文檔還在逐步完善中。盡管如此,我們覺(jué)得它已經(jīng)顯示出在移動(dòng)領(lǐng)域使用DSL的潛力。 關(guān)于作者Zef Hemel現(xiàn)在是荷蘭代爾夫特理工大學(xué)的博士生,他在那里研究對(duì)領(lǐng)域特定語(yǔ)言的設(shè)計(jì)和實(shí)現(xiàn)。他對(duì)web技術(shù)格外感興趣。之前他曾經(jīng)開(kāi)發(fā)過(guò)WebDSL和PIL 。他經(jīng)常在博客上發(fā)表博文,并在twitter賬號(hào)上發(fā)推。 |
|
來(lái)自: 周巍的森林 > 《我的圖書(shū)館》