首頁
中文書目錄
原文書目錄
 站內快速搜尋
資源中心
Book Series
Special Interest













■好消息,歐萊禮書籍已重新鋪貨至各大書局及網路書店,歡迎讀者選購       ■歡迎各院校採用歐萊禮書籍,學校團購請洽校園服務團隊

[技術短文]

用 XML 設計一個你自己的程式語言


長期使用別人設計的程式語言來寫程式,你是否曾有念頭想過要自己設計一個語言?或許是因為對目前某些語言的某些特性不滿,想動手改造,或許是因為想給自己一個有趣的挑戰。不管目的為何,我相信有過這樣念頭的人不少,但實際動手的人卻不多,因為設計一個新語言所必經的前幾道關卡,其實就是不小的障礙。過去有 YACC(Yet Another Compiler Compiler)等工具可以用來幫助設計新程式語言,但是我發現 XML 可以是另一個選擇,甚至有可能是比 YACC 更好的選擇,因為你可以很快上手。畢竟 XML 是一般性的工具,用途很廣,很可能你們公司已經用 XML 在做計劃了,而你也因此對 XML 有一定程度的認知。這使得你不需要花太多時間學習 XML,就可以利用 XML 動手實做出你的程式語言了。

有些人可能會懷疑我的說法,認為以 XML 應用(XML application)的方式來定義程式語言很奇怪,長久以來的經驗,使得我們一看到夾雜一堆 tag 的檔案就會直覺地認定它是文件,不是程式碼。不要讓這種先入為主的觀念蒙蔽了你所使用 XML 的應用領域,XML 的用途很廣,套句廣告詞「the only limitation is your imagination(你的想像力是唯一的限制)」。我認為,用 XML 來當程式語言的 meta language 非但可行,甚至很適合。

XML 和程式語言之間都有樹狀結構化的要求,以下面的 Java 程式為例:

public class Test {
public static void main(String[] args) {
for (int x=0; x<10; x++) {
// do something
}
}
}

如果改用 XML 來表示,可以如下:

<class public="true">
   <method public="true" static="true" return="void" name="main">
      <argument_list>
         <argument>
            <type>String[]</type><name>args</name>
         </argument>
      </argument_list>
      <body>
         <for>
            <pre>int x=0</pre>
            <judgement>x&lt10<judgement>
            <step>x++</step>
            <body>
               <!-- do something -->
            </body>
         </for>
      </body>
   </method>
</class>

你一定會覺得這樣變得更凌亂,原始碼更長 ......。其實,現在有許多商業或免費的 XML 的編輯軟體可以讓我們輕易地克服這點,不但可以輕鬆地編輯,還可以搭配不同的 XSL 產生不同的外觀。你還可以搭配 DTD 來使用這些功能強大的 XML 編輯軟體,那麼程式中出現的錯誤就會被自動挑出來,等於是在幫你做語法檢查。不用你自己設計編輯軟體,你的程式語言就可以擁有專業的編輯軟體可用。

當然,使用 XML 來設計程式語言,絕對不是只為了上述的那麼一點編輯時的好處罷了。設計程式碼剖析器(parser)時,你的程式如果是 XML 格式,你可以只花不到十分鐘就寫出一個 parser,而別人需要花十天以上。DOM 和 SAX 是很普遍的 XML parser API,不管你選用 IBM 的 XML4J 或 Sun 的 JAXP(當然,還有許多其他公司的產品),它們都支援 DOM 和 SAX,你只消把資料餵過去給這些 API,parse tree「莫名其妙地」就產生出來了。我估計使用 DOM/SAX API 的程式花不到十行就可以剖析 XML 文件,你不會認為需要花上十分鐘來寫這十行程式吧!

上述編輯和剖析時的好處還不算什麼,更大的好處是 XML 可以讓你不用寫程式就擁有編譯器,只要你將將編譯所需的 template 寫成 XSLT 的格式即可。現在有許多商業或免費的 XSL 程式可以讓我們輕易地將某 XML 文件遵照某 XSLT 的規則來轉換成另一個。編譯出來的結果是另一個 XML 格式(等於是組合語言),雖然不是 target code,但是和 target code 之間有直接對應的關係。你只要寫一個小程式(組譯程式)就可以將它轉成 target code。大功告成!

所以,只要準備好:
1. 原始語言的 DTD(原始語言的定義)
2. 組合語言的 DTD(組合語言的定義)
3. 原始語言轉組合語言的 XSLT
4. 組譯程式

你就具有一個實際可用的程式語言了。上述的兩個 DTD 和一個 XSLT 都是 XML 文件檔。只有組譯程式是真的要用 Java 寫,但是這個程式通常很短,我估計只需要一百多或幾百行程式碼就差不多了,如果你把組合語言的 DTD 定義得很好的話,甚至會不到一百行。基本上這個組譯程式只是在進行 tree traversal,只需要幾個 method,就可以一直遞回(recursive)呼叫,程式碼當然短。 

這篇文章是否引起你實作一個語言的興趣了?如果是的話,在你開始規劃你的程式語言前,我要先給你幾個建議:
  • 編譯的速度通常會比較慢(雖然你不見得感覺得到),畢竟你用的是一般性的 XSLT 程式,而不是自行開發的編譯程式。
  • 如果你拿不定主意要設計一個什麼樣的語言,而且不想搞得太複雜,你可以拿 Java 語言為範本,再去掉一些功能,定義出一個 Java 語言的 subset,我看這個語言就叫做 Javlet(小 Java)好了。
  • 如果你拿不定主意要設計一個什麼樣的語言,而且想作出一個華麗的語言,你可以拿 Java 語言為範本,再加上一些功能,定義出一個 Java 語言的 superset,我看這個語言就叫做 JavaDialect(Java 方言)好了。
  • 我必須善盡告知的義務:這個 XSLT 檔可能不好設計,畢竟它等於是編譯器 : (
  • 你必須選擇一個 target code 的平台。我不認為 x86 是好選擇,因為執行檔架構太複雜,雖然 PPC 可能比 x86 好一點,但還是很複雜。我建議你的 target 平台使用 Java Virtual Machine(Java 虛擬機器),因為 Java Bytecode 架構簡單清楚,而且你的程式語言還可以繼續使用 Java 的所有 API。Java Bytecode 正是樹狀架構,組譯程式很好寫。如果你需要 Java 虛擬機器的知識,可以參考我的「Java 虛擬機器」一書(歐萊禮出版)。
如果真有人做出來了,可別忘了寄一份到 jerry@oreilly.com.tw 給我們瞧瞧。

本文作者:蔡學鏞
張貼日期:1/30/01

| 首頁 | 聯絡我們 |
© 2009, O'Reilly Media, Inc. Taiwan Branch