標籤:

Source-to-source compiler 有什麼用?

看 Genie/Vala 的時候遇到這個, 語法糖是一回事...

對性能有改變嗎?

LLVM 把那麼多語言編譯成 C 可以拿來幹嘛?

Wiki 上說明得太晦澀..

http://en.wikipedia.org/wiki/Source-to-source_compiler#Vala


"Source-to-source"這個概念,認真來講,是很模糊的;

因為編譯器本來就是「把一種語言變成另一種」的程序,本質上就是這樣;

令 你感到不解的,應該是,你常見的編譯器,最後輸出彙編(彙編碼)或者可執行程序(機器碼), 而突然有一個編譯器輸出了C代碼你感到不習慣...但你仔細想想,其實他們都同樣是「把一種語言變成另一種」而已;從這個角度講,C在這裡扮演的角色和很 多「傳統」編譯器中最後的機器碼程序或者彙編碼程序沒什麼不一樣,不必感到不解;

至於為什麼它選擇的target到C上,你提供的那個鏈接由於wikipedia反SOPA/PIPA運動我暫時看不到,不知道上面說了些什麼;

但我談談我的理解:

其 實haskell的編譯器,也是將haskell源碼target到C上的,再調用C的編譯器去做最後的編譯;這麼做的好處就是:不用為haskell在 每種硬體平台、每種操作系統都做一份編譯器——因為C這種流行語言的編譯器已經遍布各個平台和操作系統,haskell編譯成C其實是圖了方便、坐享其 成;其實在這裡,C語言就扮演了早期彙編語言的角色——為編譯器隔離各種平台相關性;

另外,開個玩笑:從這個觀點來看,把那些搞翻譯的人叫做「自然語言編譯器」也不錯,搞同聲傳譯的直接就是interpreter


廣義上講,所有的compiler 都是source to source的。

狹義的講,這樣可以不用給很多語言在一些硬體上去構建新的編譯器,只需要將其source to source到一個已經有編譯器支持的語言就可以了。


kripken/ammo.js · GitHub


第一個c++的編譯器就是這麼來的


編譯器的作用就是將一種語言編譯成另一種可以在某個平台上運行的語言,這個平台並不局限於x86或者arm這種後端,也可以是其他支持源碼的平台。比如mozilla的emscripten,就是將LLVM bitcode編譯成為javascript,從而可以讓一些應用在web平台上運行


推薦閱讀:

推薦些使用單元測試的開源項目?
chromium源代碼為什麼那麼大,我們用的不是只有幾十m嘛?
有哪些優秀、可以作為學慣用途的 C 語言源碼或開源項目?
自己寫的代碼太丑不敢開源怎麼辦?
GCC是在GPL協議下發布的,那麼使用了GCC標準模板庫的軟體也要受到GPL的傳染而被要求開源嗎?

TAG:開源 | 編譯 | LLVM |