謝謝Derek 給了我一些觀念性的幫助
我也找了一些資料 在程式語言編譯這方面
程式語言演進:
GL:generation language
1GL:machine language
2GL:assembly language(low level language)
3GL:higher level language(Procedure Oriented Language(POL)). Java ,C , Pascal, Fotytan
4GL:very high level language(problem oriented language)(nonprocedure language)
5GL:nature language(knowledge-based language)
以高階語言或組合語言所撰寫的原始程式(source program),必須經過編譯程式(compiler)、直譯程式(interpreter)或組合程式(assembler)的翻譯才能成為機器語言形式的目的程式(object program),接著電腦才能直接執行,此一過程即稱為轉譯(translate)。
compiler:
ex:C++是編譯式語言,必須經過compiler才能將原始碼轉換成組合語言的程式碼,再利用assembler轉變成最低階電腦看得懂的機器碼,轉換好後 的機器碼便是目的檔(object file),目的檔不能執行,因為最一開始的C語言程式碼所用到的函數的實質內容事實上都是寫在library檔裡的!我們需要將library檔裡的資 料加到object檔裡,而這就是linker的工作,用linker連結完object檔和library檔之後,便得到我們所想要的應用程式。
半直譯式
interpreter:

ex:原始程式 --> 編譯器 --> 位元碼 --> 直譯器 --> 執行檔
app.java --> compiler --> byte-codes --> interpreter -->
Java很特殊,它必須先經過編譯的程序,然後再利用直譯的方式來執行。透過編譯,java程式會被轉成與平台無關(platform- independent)的機器碼,java稱之為位元碼(byte-codes)。透過Java的直譯器(interpreter)便可解釋並執行 Java的位元碼。任何一種可以執行java程式的軟體均可看成是java的虛擬機器(Java virtual macine,JVM)。如瀏覽器與JAVA的開發工具皆可視為一部JVM,因此可以把Java的byte-codes看成是JVM所執行的機器碼 (machine code)。byte-codes最大的好處是可跨越平台而行(write once,run everywhere),比如說Windows,Mac OS或Unix都含有JVM的平台,跨越平台的特性,讓Java急速普及。
編譯程式具有下列特性
編譯程式(compiler)屬於系統程式
它是將高階語言所寫的程式轉換成目的程式(或稱為機器語言),使得計算機可以直接執行該機目的程式。
即使某些不會用到的敘述亦會加以翻譯,同時每個敘述也只會被翻譯一次。
只編譯不執行
編譯程式在翻譯的過程中,並不會讓計算機執行所翻譯過的目的程式。
最佳化處理程式碼
編譯程式可以將程式碼作最佳化處理,因此可以得到效率較佳的目的程式。
轉換後目的程式可以無限次使用,不必在另一次執行時再進行程式的翻譯,因此可以得到較高的執行效率。
不管該迴圈敘述被執行多少次,編譯程式都只要花一次翻譯的時間,不需要重複地翻譯,因此會比直譯程式節省大量時間。
執行時需較大的記憶體空間
由於編譯程式是將原始程式一次翻譯成目的程式,並且在執行時將該目的程式配合相關函式載入記憶體,因此執行時需要的記憶體空間較大。
由於編譯程式必須將程式翻譯成目的程式之後,才可以執行,因此若程式開發時遇到錯誤,就必須在修改後再重新進行編譯,因此即使只是一點點的錯誤也需要完全重新來過,因此不利於程式開發。
直譯程式具有下列特性
直譯程式(interpreter)屬於系統程式
它是將高階語言的每一敘述轉譯成目的程式,並讓計算機直接地執行該目的程式。
直譯程式是根據程式的邏輯及流程之特性,一次翻譯一道敘述,如果沒有執行到的敘述就不會被翻譯,同時,如果某個敘述被重複地執行數次,則會被重覆地翻譯數次。
亦即是每翻譯完一道敘述之後,就會立刻讓計算機執行該敘述。
執行時記憶體空間需求較小:
由於直譯程式是將原始程式一次翻譯一行敘述,翻譯後立即執行。因此在記憶體中,只需要可以容納一行敘述以及程式內部所需的記憶體空間就足夠了。
由於直譯程式可以一邊翻譯程式、一邊執行程式,因此遇到錯誤時可以立即更正,甚至有些系統可以從原來錯誤處繼續地執行下去,因此可以大幅度減少程式開發的時間。
執行效率低:
由於直譯程式是讓計算機一邊翻譯程式、一邊執行程式,因此執行時所花的時間就比較長,相對地執行效率亦較低。
由於大部份的程式絕大部份的時間都花在迴圈敘述,同時每執行一次迴圈敘述就必須進行一次翻譯,因此對於同樣的敘述就會進行多次的翻譯。
目前研究到現在 Java 的彈性還是比較大,因為沒有的func 還是可以經過自己編譯 執行
Ruby呢 則是在Ruby模組內有提供的才可使用 不然~~
Comments