一位前同事提到了將PHP轉換成Java的設想。//2009-7-18
我對PHP不瞭解。至於“如何將script 轉換成Java”,下面是我的一孔之見。
目標:將script 語言轉換成Java(script泛指Ruby或JavaScript等“輕量級語言”, 暫不考慮其運行環境).
步驟:
1. 編寫script的文法描述(產生式集).
2. 將文法描述解析成文法圖(即所謂的抽象文法樹),樹的結點類型同源碼中的結構成份一一對應,如:Function, VariableDefine, IfElse, For, While, Return, ParameterList, CodeBlock, Expresssion等等。——它表明了源碼的文法結構。
3. 用抽象文法樹來匹配一段script執行個體(A),產生一個匹配樹(我稱之為匹配樹),匹配樹的結點類型同文法樹類似。匹配樹有嚴格的樹結構——它所含的結點與A執行個體中的成份是一一對應的。
這一個過程具體上是這樣做的:
3.1 產生一個類,專門用來讀取script。
3.2 運行這個類,傳入script執行個體(A),成功運行後將產生一個匹配樹。
3.3 實際上,對所產生的匹配樹需要做一些標準化處理以方便此後的語義分析。比如:將其中的每一隻運算式子樹化為一隻二叉樹(以方便此後的算符優先順序分析和求值)。
4. 接下來做的是,針對每一類結點構造相應的語義結點。一個語義結點執行個體負責通過與其對應的匹配樹的結點來對相應的原始碼成分做語義上的分析或翻譯。
注意:文法圖和匹配樹在概念上既相關聯又有差別。
一些經驗表明,1~3步會耗去大部分時間、調試也會耗去大部分時間。若使用javaCC(或者使用我的javaCCe),則會省去大部分時間。
這以上過程中可能會遇到這些問題:
1. Java不支援函數或屬性的動態增減。
2. script內建對象或native方法(如果有的話)及其各函數的Java化。因為內建對象和native方法沒有源碼,因此不能翻譯,只能模仿,這需要很大的工作量。
3. script可能有內建的正則語言,若要把它化為Java的正則語言(參見java.util.regex.Pattern),可能會很有難度。
4. 對錶達式的求值。 運算式幾乎可包含所有的文法成分(比如class)。
5. ……
對具有嚴謹文法結構的語言進行語義分析,理論上似乎沒有難度。
反過來講,要想把Java化為script,工作量會大大增加, 因為Java是“重量級的語言”。
end.