• 沒有找到結果。

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

34

解析器、程式碼產生器和解譯器等,最後 Xtext 所有的執行單元都必須以 EMF 為基礎進 行整合,這樣使得 Xtext 能有效率的利用在其他 EMF 相關工具上,例如 GMF(Graphical Modeling Project)。透過上述的執行架構,程式開發者可以在 Eclipse 上建構一個專為某 種語言客製化的語言開發環境,並且在試圖改變一些編輯環境的配置時都會變得相當容 易。Xtext 的核心語法是利用文字的模型編輯方式進行 EMF 模型定義,並且利用 ANTLR-generated parser 對 編 輯 好 的 模 型 語 言 進 行 語 法 的 分 析 , ANTLR(ANother Tool for Language Recognition)是利用 LL(*)方式進行語法分析,目前透過 ANTLR 支援的程式碼 產生器,產生的語言包含 Java、C、C#,Objective-c、Python 與 Ruby。

Xtext 使用較輕量的依賴注入(Dependency injection, DI)架構 Google Guice,藉此連結 了整個程式語言以及開發環境的基礎功能。所謂的依賴注入是透過抽象介面的使用,來 打破兩個類別之間依賴的關係,也就是將原本兩個類別的依賴關係,轉移到抽象介面與 兩個類別之間的關係,使得兩個類別之間不再有依賴關係產生。透過依賴注入的使用,

能夠降低程式碼之間的耦合度,以利於提供程式開發者一個高度客製化的程式編輯環境。

相對於一般程式語言的開發,語言與編輯環境大多是分開進行設計的,先有語言本 身才有編輯器,然而 Xtext 顛覆了一般程式語言開發的過程,提供程式開發者在進行相 關程式語言開發與設計的同時也可以進行編輯環境的設計,讓編輯器的開發變的是簡單、

快速且有效率的,因此我們利用 Xtext 來建構平台無關導引精靈的特定領域語言以及以 Eclipse 平台為基礎的專屬 IDE,藉此當作整個系統的輸入。

3.3 Xtend

Xtend【25】是隨著 Xtext 一起釋出並且整合於 Xtext 中,用來進行模型轉換的重要工具,

Xtend 是一種靜態型別(statically-typed)的程式語言,線上即時的轉換為 Java 原始碼,因 此能夠緊密的與其他 Java 程式結合,編譯與執行。所謂的靜態型別是指,對於變數的型 別檢查是在程式編譯時期的語意分析中所進行。Xtend 並非想取代 Java 語言,而是與

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

35

Java 保持一種高度互動的關係,Java 與 Xtend 的程式可以互相叫用,而 Xtend 的編輯環 境也與 Eclipse 上的 JDT 完全整合,所以 Xtend 與 Java 兩者是可以同時存在的,Xtend 相對於 Java 語言增加了以下幾個概念:

• 提供先進的型別推測方法,減少使用者對於 type signatures 的描述。

• 完全支援 Java 的 Generics 程式寫作,包含所有的一致性與轉換規則。

• 支援且提供簡潔的 Closures 匿名函式描述語法。

• 允許進行運算子多載(operator overloading)的程式寫作。

• 提供功能較強大的 switch expression。

• 在 Xtend 裡沒有 statements 的描述,全部都是 expression 的描述。

• 對於範本的 expressions 描述,提供智慧的空白區域處裡。

• 對於外部方法(methods)的使用,利用 inject 的方式引入。

• 對於物件屬性的存取語法,提供了 getter 與 setter 的存取方式。

• 提供 multiple dispatch,又名 polymorphic method invocation。

• 編輯完成的 Xtend 模型轉換程式會被轉換成一般的 Java 程式而非 bytecode。

表 3-1 為 Xtend 的基本程式結構,乍看之下容易讓人誤以為是 Java 程式。一個基本 的 Xtend 程式從 package 的宣告開始,接著是 import 的引用區塊,最後是 class 的定義,

class 裡包含的是一些函式、模型轉換規則或模型範本的描述。事實上 Xtend 的 class 與 函式會被自動轉換成 Java 的 class 與方法,並且儲存於對應的 Java package 裡。

表 3-1:基本 Xtend 程式結構。

01 package edu.nccu.cs.wta.pimwizarddsl 02 import java.util.*

03 class MyClass {

04 def String first(List<String> elements) { 05 return elements.get(0)

06 } 07 }

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

36

對於 Xtend 的相關語法,在 class 裡的是定義一個基本的函式,以保留字「def」開 始接著是回傳值型別與函式名稱完成一個函式的定義,Xtend 提供先進的型別推測方法,

所以回傳值型別是可以省略的。在 Xtend 裡對於函式類型加入了「Dispatch 函式」與

「Create 函式」的概念:一般函數呼叫的解析與參數連結,通常是依據形式參數與實際 引數的靜態型別在編譯時期確定的。但有些時候這並非是我們想要的,尤其當我們的參 數具有多型(polymorphic)的特性時。Dispatch 函式主要是用來產生一組多載分派函數,

可在程式執行時根據每一個不同的參數的動態型別,再來決定哪一個多載的函式要被呼 叫。程式師可透過在「def」後面加入保留字「dispatch」的方式標記該函數為分派函數的 一個成員。進行 Dispatch 函式的建立。

Create 函式使程式師得以簡潔的生成新物件,並由現存物件產生初始值。當利用 Xtend 進行模型轉換時,我們需要產生多個新物件,並透過現有的物件給予初始值,此 時一般的程式寫作模式需要兩個或兩個以上的函式來完成此動作,但透過 Create 函式的 使用則可以簡化程式的複雜度。表 3-2 為 Create 函式的範例,複製一個新的 Person 物 件,透過在「def」後面加入保留字「create」的使用來建立 Create 函式,target 代表的是 新宣告的 Person 物件,接著在函式裡進行新物件的初始化,最後此 Create 函式會以 Person 作為回傳值型別,並且回傳 target 物件。

表 3-2:Create 函式範例。

最後是 Xtend 的程式碼產生器建構方式,Xtend 利用「Rich Strings」來進行模型轉 換範本的描述,Rich Strings 允許可閱讀的字串內容進行串聯,不再只是片段單行的描述,

表 3-3 為 Rich Strings 的範例,產生一個 Java Class 的範本,利用兩個「'''」分別代表 Rich 01 def create target:new Person() copy(Person p) {

02 target.name = p.name 03 }

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

37

Strings 的開頭與結尾,在進行模型範本描述的過程中,也可以內插可執行的 Xtend 表達 式(expression)來增加範本內容的靈活性,表達式的語法是利用「«」 + + 與「»」 + + 來進行表達式的描述,最後 Rich Strings 會被轉換成有效的字 串串聯,並且以 Java 的 CharSequence 作為回傳值型態進行回傳。

表 3-3:Rich Strings 範例。

與一般的模型轉換語言相比,Xtend 同時支援了模型轉換規則與模型範本的撰寫,

並且其程式語法也與 Java 相似,讓原本就熟悉 Java 語言的程式開發者能夠更容易上手,

更重要的是 Xtext 與 Xtend 進行整合,使得 Xtend 能夠直接存取利用 Xtext 設計的 DSL 模型,讓 Xtext 模型程式設計更加便利。

01 def toClass(Entity e) 02 '''

03 package «e.packageName»;

04 «e.placeImports»

05 public class «e.name» {

06 «FOR e.members»

07 «member.toMember»

08 «ENDFOR»

09 } 010 '''

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

38

MoDWiz3 系統

本 WTA(Web Technology and Application)實驗室曾發展一套 MoDWizII 系統(Model-Driven Wizard Generation System II)【13】,是本研究的前身,而其前身則是 MoDWiz。

此章節將先針對 MoDWizII 系統做一簡短回顧。首先介紹的是 MoDWizII 系統架構,說 明如何將 MDA 應用於多平台導引精靈程式開發系統上;接著介紹系統的實作,介紹如 何透過 Eclipse 平台與 Eclipse 相關的 Plug-ins 模型開發工具,進行多平台導引精靈程式 開發系統 MoDWizII 的實作;再來是將 MoDWizII 系統尚未實現的部份進行探討,與本 系統 MoDWiz 3 建構在 MoDWizII 上加強的地方。