MDA之路

          MDA,UML,XML,Eclipse及Java相關的Blog
          posts - 53, comments - 494, trackbacks - 0, articles - 2
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          模型轉換語言ATL使用感想

          Posted on 2005-12-20 17:48 wxb_nudt 閱讀(7192) 評論(5)  編輯  收藏 所屬分類: 技術雜談

          1.     ATL簡介

          ATLATLAS轉換語言的簡稱,它是ATLAS研究組開發出來的一種符合OMG的一個QVT提案的模型轉換語言。目前ATL已經實現為ADT的一個組成部分,ADT是一個Eclipse插件,他是著名的Eclipse項目GMT的子項目。ATL是基于EMFEclipse模型框架)的,其元模型、模型都是用EMF來描述的。

          從本質上來說,ATL屬于基于規則的模型轉換語言,其中使用了OCL作為約束描述語言。ATL是一種混合語言,既有描述性語言的特征,又含有命令式語言的內容。作為一種基于規則的語言,描述性是其最主要特征,但是為了完成某些復雜的轉換,命令式的內容也被加進去了。

          目前ATL屬于三個組織,ATLAS研究組LINA & INRIA(這應該是一個法國的研究機構,主頁上是法文,看不懂)和法國Nantes大學。

          2.     ATL安裝簡介

          ADT的文檔頁面上面有關于ATLADT的大部分文檔,包括安裝手冊、初學者手冊和用戶手冊等等。2,3,4節簡要的說明了其中的內容。

          安裝步驟如下:

          首先安裝Eclipse3.1EMF2.1.0

          Eclipse is available at http://www.eclipse.org/downloads/index.php. Select the release 3.1(eclipse-SDK-3.1-win32.zip).

          EMF can be downloaded from http://download.eclipse.org/tools/emf/scripts/downloads.php.

          Select the release 2.1.0 (emf-sdo-runtime-2.1.0.zip).

          然后安裝ADT,它在http://www.eclipse.org/gmt/atl/download/,選擇adt-20051102.zip包下載。然后按照Eclipse插件的安裝方法安裝插件。

          最后還要安裝兩個其它的java包:

          ANTLR can be downloaded from http://www.antlr.org/download.html. Select the “jar file only”(tool and Java runtime) archive (antlr-2.7.5.jar).將這個jar包改名為antlr.jar,然后拷貝到\eclipse\plugins\org.atl.eclipse.engine_version\lib

          MDR is available at http://mdr.netbeans.org/download/. Select the “MDR zip” archive (mdrstandalone.zip).將這個zip包解壓縮后得到jmi.jar, jmiutils.jar, mdrapi.jar, mof.jar, nbmdr.jar and openide-util.jar,將這些jar文件拷貝到\eclipse\plugins\org.atl.engine.repositories.mdr4atl_version\lib

              至此ADT才算安裝完成,過程有點復雜,所以記下來。

          3.     ATLHelloworld

          ATL的框架結構

          ATLhelloworld可不是那么簡單,首先要弄清楚一個ATL程序需要包含哪些內容。而要弄清這些內容,最好還是先看看ATL的整個框架結構。以下就是ATL的模型轉換的層次結構:

          image002.gif
             其中
          Ma是源模型,而Mb是目標模型。Ma符合其元模型MMa,而Mb符合其元模型MMb。同時MMaMMb都符合唯一的元元模型MMMMt是一個模型轉換實例,它也是一種模型,它符合模型轉換的元模型MMtMMt也符合唯一的元元模型MMM

          ATL當中,唯一的元元模型就是Ecore,其地位等同于MOF。而MMaMMb則是Ecore創建出來的元模型。MaMb則是符合這些元模型的模型實例。MMt已經被ATL定義好了,Mt則是使用者自己要定義的模型轉換模型,也就是模型轉換程序。

          所以,一個完整的ATL模型轉換程序,需要四個內容:MMaMMbMaMt。而生成的目標模型則是Mb

          ATLhelloworld

          這個例子出現在ATL Starter’s Guide中。

          首先打開Eclipse創建一個ATL項目,然后依次創建文件Author.km3Person.km3 Authors.ecoreAuthor2Person.atl。它們分別代表元源模型、元目標模型、源模型和轉換程序。

          元模型其實都可以使用EMF來直接創建,但是ATL提供了一個類似java的語言km3,使用km3定義的元模型可以生成基于EMF的元模型Author.ecorePerson.ecore

          代碼內容如下:

          Author.km3:

          package Author{

            class Author{

              attribute name : String;

              attribute surname: String;

              }

          }

          package PrimitiveTypes{

            datatype String;

            } 

           

          Person.km3:

          package Person{

            class Person{

              attribute name : String;

              attribute surname: String;

              }

          }

           

          package PrimitiveTypes{

            datatype String;

            }

              這兩個元模型經過轉換后都成為基于XMI格式的Ecore模型Author.ecorePerson.ecore

              然后給出一個源模型,它是符合Author.ecore的:

          Authors.ecore:

          <?xml version="1.0" encoding="ISO-8859-1"?>

          <xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns="Author">

            <Author name="David" surname="Touzet"/>

            <Author name="Freddy" surname="Allilaire"/>

          </xmi:XMI>

              最后是轉換程序代碼:

          Author2Person.atl

          module Author2Person; -- Module Template

          create OUT : Person from  IN : Author;

          uses strings;

          rule Author{

          from

            a: Author!Author

          to

            p: Person!Person (

              name<-a.name,

               surname<-a.surname

            )

          }

              代碼的含義可以參考相關文獻,可以看出來,這種基于規則的代碼簡單的定義了兩個模型之間的名稱映射。如果要定義更加復雜的約束,則需要用到更多ATL的知識,這些約束一般都是使用OCL來定義的。

              Eclipse中運行這個程序需要在run as…中進行詳細的配置。也可以參考相關文獻。運行的結果是一個目標模型Persons.ecore,其內容如下:

          <?xml version="1.0" encoding="ISO-8859-1"?>

          <xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns="Person">

            <Person name="Freddy" surname="Allilaire"/>

            <Person name="David" surname="Touzet"/>

          </xmi:XMI>

              當然,ecore模型都是可以用EMF的編輯器來進行可視化察看的,并不是都使用XMI格式來察看。而且,在熟悉了之后可以使用EMF來直接創建元模型,我覺得比學習和使用KM3語言要稍微快一點。

          至此我們完成了ATL的這個helloworld,看起來有一點復雜,需要的知識面也比較廣泛。如果對于相關的知識都有一定程度的了解,可能會比較輕松上手。

          4.     另一個ATL例子代碼

          這個例子出現在ATL User Manual中,但是只有轉換程序代碼,其它的三個代碼都沒有,因此我補全了其它代碼,使之可以運行。

          這個例子的目的如下:MMa描述了一本書的模型,這本書含有許多章節,每個章節都有頁數、名稱和作者。MMb描述了一個出版物的模型,這個出版物只包括了一個總的名稱、作者和頁數。那么轉換程序的目的是將書的所有章節作者合并到出版物的作者字符串,將書的所有章節的字數相加得到出版物的字數。

          MMa的代碼如下(我使用EMF直接創建了它,但是這里列出的是文本內容)Book.ecore

          <?xml version="1.0" encoding="UTF-8"?>

          <xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore">

          <ecore:EPackage xmi:version="2.0"

              xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

              xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="Book">

            <eClassifiers xsi:type="ecore:EClass" name="Book">

              <eStructuralFeatures xsi:type="ecore:EAttribute" name="title" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>

              <eStructuralFeatures xsi:type="ecore:EReference" name="chapters" upperBound="-1"

                  eType="#//Chapter"/>

            </eClassifiers>

            <eClassifiers xsi:type="ecore:EClass" name="Chapter">

              <eStructuralFeatures xsi:type="ecore:EAttribute" name="nbPages" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>

              <eStructuralFeatures xsi:type="ecore:EAttribute" name="title" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>

              <eStructuralFeatures xsi:type="ecore:EAttribute" name="author" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>

            </eClassifiers>

          </ecore:EPackage>

          </xmi:XMI>

          MMb的代碼如下Publication.ecore

          <?xml version="1.0" encoding="UTF-8"?>

          <xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore">

          <ecore:EPackage xmi:version="2.0"

              xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

              xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="Publication">

            <eClassifiers xsi:type="ecore:EClass" name="Publication">

              <eStructuralFeatures xsi:type="ecore:EAttribute" name="title" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>

              <eStructuralFeatures xsi:type="ecore:EAttribute" name="nbPages" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>

              <eStructuralFeatures xsi:type="ecore:EAttribute" name="authors" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>

            </eClassifiers>

          </ecore:EPackage>

          </xmi:XMI>

          Ma的代碼如下Books.ecore

          <?xml version="1.0" encoding="ISO-8859-1"?>

          <xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns="Book">

            <Book title="WxbBook">

            <chapters nbPages="12" title="chapter1" author="author1"/>

            <chapters nbPages="15" title="chapter2" author="author2"/>

            <chapters nbPages="20" title="chapter3" author="author3"/>

            </Book>

          </xmi:XMI>

          Mt的代碼如下Book2Publication.atl,這個代碼是手冊中提供的,我還是列在這里:

          module Book2Publication; -- Module Template

          create OUT : Publication from IN : Book;

           

          helper context Book!Book def : getAuthors() : String =

            self.chapters->collect(e | e.author)->asSet()

              ->iterate(authorName; acc : String = '' |

              acc +

              if acc = ''

                then authorName

                else ' and ' + authorName

              endif

          );

           

          helper context Book!Book def : getNbPages() : Integer =

            self.chapters->collect(f|f.nbPages)

              ->iterate(pages; acc :  Integer = 0 |

              acc + pages

          );

           

          rule Book2Publication {

          from

            b : Book!Book (

              b.getNbPages() > 2

              )

          to

            out : Publication!Publication (

          title <- b.title,

              authors <- b.getAuthors(),

              nbPages <- b.getNbPages()

            )

          }

          Mt的代碼可以看出,為了實現轉換中的約束,定義了兩個helper函數,函數都是使用OCL來定義的。并且在轉換規則中調用了這些函數。在規則開頭的限定條件中也調用了這些函數。

          那么進行轉換后得到的代碼如下,Publications.ecore

          <?xml version="1.0" encoding="ISO-8859-1"?>

          <Publication xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns="Publication" title="WxbBook" nbPages="47" authors="author3 and author1 and author2"/>

          本節的內容主要是想把用戶手冊中沒有提供的代碼補全,讓初學者可以直接運行這個例子,可以了解ATL的一部分功能。

          5.     ATL使用感想

          通過這一天的對ATL的了解和使用,有一點點心得。

          ATLMTF的比較

          在目前能夠run的模型轉換語言中,MTFATL都是比較著名的。MTFIBM開發的模型轉換框架,而ATL則是EclipseGMT中包含的模型轉換語言。從影響力來看,旗鼓相當。使用者的人數不好統計,況且目前好像都還沒有商業化,也看不出市場占有率。不過從純技術的角度來比較這兩個語言,也是很有意義的。

          從上手的難易度來看,無疑MTF是比ATL容易得多。MTF作為一個準商業化的軟件,遵循了簡單易用的原則。而ATL作為一個研究者團體開發的開源軟件,上手則比較困難。從安裝上來看,MTF是一個標準的Eclipse插件,基于EMF插件,安裝一步到位。而ATL則需要另外安裝兩個其它的jar包。從提供的例子程序來看,MTF提供了完整的例子程序包,由易到難循序漸進,在運行helloworld的時候僅僅需要一個規則文件即可憑空構造一個目標模型,再以這個目標模型作為源模型構造更多的目標模型。而ATL在運行第一個Helloworld例子時則需要手工輸入源元模型、目標元模型、源模型和規則文件。導致復雜性大幅度增加。而且,除了轉換語言ATL以外,還引入了元模型描述語言KM3,而不是直接使用EMF。這樣也增加了上手的困難程度。

          從技術路線來看,MTFATL都是基于Eclipse平臺和EMF。而且,它們都是基于規則的轉換語言。不同之處在于,MTF更加傾向于構造一個完全描述性的語言,而ATL則傾向于構造一個描述性和命令行共存的混合語言。這就導致了MTF可以更多的用來描述雙向轉換規則,即源模型和目標模型可以對等轉換。而ATL則一般用來描述單向轉換規則。但是有得必有失,我認為MTF描述復雜規則的能力要比ATL弱。因為ATL使用了OCL作為約束描述語言,它基本上實現了OCL(有些地方略為有更改),從上文就可以看出,使用OCL定義的ATL函數功能是比較強大的。而MTF則沒有使用OCL來定義約束,而是使用一種中庸的簡單比較功能來限定轉換的條件。這樣在寫轉換規則的時候就有一種便秘的感覺,明明我非常了解這個約束,但是不能夠痛快的寫出來。而且,如果在源模型中使用OCL定義了某種約束,那么在MTF的轉換中必然不能直接的使用或者體現這個約束。相比之下,ATL的功能更加強大一些。

          另外有一點值得注意的是,MTFATL的作者對于模型層次的理解顯然有點差別。在MTF中,模型層次和MOF中的四層模型是一致的。MTFM2層定義轉換規則,進行轉換的是M1層的模型。例如,定義了簡化的UML和簡化的RDBMS之間的轉換規則,可以將UML中的類轉換為關系數據庫中的表。但是ATL的模型層次則大部分時候是在M1層定義轉換,而進行轉換的是M0層的模型,即對象模型。例如第4節的例子。當然,所謂的“元”只是一個相互對應的概念,更抽象的便可稱之為“元”。MTFATL都可以用處轉換各個模型層次的模型,只是從它們提供的例子可以看出它們作者的偏好。從這個角度來看,MTF更加符合大眾的口味。

          總而言之,MTF是易于上手的,容易理解的,雙向的描述性模型轉換語言,其描述規則的能力一般,往往要繞圈子來定義規則。而ATL是開源的,難于上手和掌握的,單向的混合型(描述性和命令行并存)模型轉換語言,使用OCL來描述約束,描述規則的能力較好,使用范圍較廣。

          ATL的前景

          MDA是一個較新的概念,也是一個爭議很大的技術。但是模型轉換作為MDA的核心技術卻是毫無疑問的。廣義的模型轉換技術其實和XSLT一樣,將一種格式化的模型(文檔)轉換為另一種格式化的模型(文檔)。所以它是有著廣泛的用途和強大的生命力的。

          ATL作為模型轉換語言中的一個出色的實現,依托于Eclipse這個平臺,應該是有著比較光明的背景的。遺憾的是,學習和使用ATL所需的背景知識比較多,使用起來也不是很容易上手。我可以看見ATLAS已經在努力克服這些問題,最近他們實現了模型編織的工具,用來生成ATL的模型轉換代碼。從模型編織的理論上來看,是比較優秀和完美的,但是ModelWeaver我還沒有體驗過,因此并不知道是否可以克服ATL目前的缺點。

          6.     小結

          我很遺憾的發現關于ATL網上似乎沒有任何的中文文獻,包括MDA技術也大多是泛泛而談,涉及到具體的工具、理論的很少。愿這篇文章,可以給那些有志于了解模型轉換技術的人一個引路石。

           


          評論

          # re: 模型轉換語言ATL使用感想  回復  更多評論   

          2006-01-13 23:27 by maysnow
          perfect,謝謝引路

          # re: 模型轉換語言ATL使用感想  回復  更多評論   

          2006-01-20 12:14 by Only sail
          有機會講述一下ECOIII機制

          # re: 模型轉換語言ATL使用感想  回復  更多評論   

          2006-10-14 00:40 by transform
          too complicate

          # re: 模型轉換語言ATL使用感想  回復  更多評論   

          2006-11-15 10:22 by jesse[匿名]
          我最近也熟悉了一下ADT,我感覺ATL的模型轉換并不是發生在M0層,同MTL一樣它的轉換也發生在M1層。從ATL的框架圖來說,它的“MMM”指MOF1.4或者Ecore,對應于M3層;"MM"是遵循MOF1.4或者Ecore的元模型,對應于M2層,而"M"則是M1層,是符合元模型的模型

          # re: 模型轉換語言ATL使用感想  回復  更多評論   

          2006-11-15 10:26 by jesse[匿名]
          我最近也熟悉了一下ADT,我感覺ATL的模型轉換并不是發生在M0層,同MTL一樣它的轉換也發生在M1層。從ATL的框架圖來說,它的“MMM”指MOF1.4或者Ecore,對應于M3層;"MM"是遵循MOF1.4或者Ecore的元模型,對應于M2層,而"M"則是M1層,是符合元模型的模型
          http://jizhe.blog.edu.cn/
          主站蜘蛛池模板: 辽阳县| 正阳县| 嵊州市| 喀喇沁旗| 梁河县| 盐池县| 岑溪市| 安新县| 英山县| 和顺县| 盐山县| 乃东县| 方正县| 大邑县| 阜宁县| 咸丰县| 澄江县| 汾阳市| 福清市| 务川| 涡阳县| 古田县| 喀喇| 西青区| 杭锦旗| 太原市| 湟源县| 府谷县| 曲靖市| 平陆县| 永平县| 招远市| 宁河县| 金堂县| 萝北县| 铜梁县| 阜新市| 绥芬河市| 时尚| 绩溪县| 兴仁县|