2011-08-22 61 views
7

我想知道創建源到源翻譯器的策略是什麼,即創建從一種高級語言到另一種高級語言的翻譯。即進入我腦海的兩個方面是創建源到源翻譯器

1-改變一種語言到另一種語言語法樹 2 - 將其更改爲中間語言的語法樹,然後轉換爲其他高級語言

我的問題是也就是說,使用這兩種策略進行轉換是可行的,哪種方法更可行,任何人都可以參考某些轉換器所做的理論或實現,比如上述任何一種方法。是否有任何標準的基於xml的中間語言,我知道xmlvm使用xml作爲中間語言,但它沒有提供任何適當的中間語言規範。

+0

請參閱我的回答關於編程語言之間的翻譯:http://stackoverflow.com/a/3460977/120163。這是關於真正的工業工具來做到這一點,而不是理論。 –

回答

7

任何編譯器大致都是源到源轉換器。目標語言可以是彙編語言(或直接使用二進制機器代碼語言)或C語言,也可以是您喜歡的任何高級語言。所以,一般compilers theory是適用的。

就像一個忠告 - 一種中間語言通常不夠。使用更多。使用數十種中間語言,每種語言都與前一種不同,只是在一個很小的方面。這樣任何語言到語言的翻譯都不過是微不足道的。

另一個建議的詞(在此期待downvotes) - 遠離XML,特別是作爲AST s的表示。

+2

同意關於XML的SK邏輯。參見http://stackoverflow.com/a/2831343/120163關於XML作爲AST表示的(德)優點的討論。 –

0

轉換器通常基於構造一個程序的語義樹,然後將其重新塑造成目標PL。作爲一個例子,看看C# to Java convertor

第二種方法也是可行的,但是代碼的組織可能在轉換後完全改變。因此,最好儘可能保持中間通用結構(IL,ST等)的高水平。

2

我會看LLVM,它可以做源代碼。雖然輸出不太好,但它可能會提供一些好的想法。

+1

它可以做源語言來源?我認爲LLVM/Clang很適合C和C++,其他語言可能相當困難。 –

+0

@Ira Baxter:LLVM有一個CBackend,它將LLVM BitCode編譯爲C. LLVM也有一個名爲emscripten的JavaScript後端項目。所以在技術上任何輸出到LLVM的前端都可以使用這些後端中的任何一個。這不考慮項目在開發中,或者項目將在開發中。示例前端應該是Clang,llvm-lua,llvm-gcc,LDC等等。這不是一個「完整解決方案」,但如果有人正在研究一些想法,並想要一些代碼來實際查看,那將是一個地方開始。 – TechZilla

0

試試Clang!它對於源代碼翻譯非常有用。截至目前,它完全支持C,C++,Objective C和Objective C++。 您可能還想看看ROSE編譯器基礎結構。