⑴ 請問編譯程序和解釋程序是什麼意思什麼是編譯器、什麼是解釋器
編譯和解釋是從源程序到可執行程序轉換的兩種方法。編譯,是在源程序完成後,先轉換成中間代碼,然後再轉換成二進制代碼,完成後,每次執行,都直接執行這個二進制代碼。一次轉換完成。
而解釋程序的執行不同,他在執行時,是一次讀入一條源代碼,然後分析轉換成二進制代碼,執行這條語句,然後再讀入一條源代碼,再轉換,再執行。是一邊轉換一邊執行。編譯器和解釋器就是完成編譯和解釋工作的一個軟體。
⑵ jdk中的編譯器是什麼,解釋器是什麼
編譯器是指java程序運行時對java代碼進行語法檢查和代碼規范的一種機制,若不符合代碼規范和語法有錯誤編譯器將會報錯,代碼將無法運行。解釋器我很少聽說,是不是編譯器報錯的時候出現的錯誤提示?
⑶ 計算機都有編譯器和解釋器嗎
編譯器是程序員開發程序用的~!
而解釋器則是執行腳本程序用到~
編譯器和解釋器都是軟體,非硬體``
而計算機上通常在系統中已裝有某些腳本或批處理的解釋器。
編譯器大多數就沒有內置安裝了。
⑷ 編譯器和解釋器的主要區別是什麼他們相對於對方各自的優點
解釋器是解釋執行的源代碼,編譯器是將源代碼編譯成目標代碼
他們最大的區別是程序運行時需要解釋器邊解釋邊執行,而編譯器則在運行時是完全不需要的
解釋器的優點是比較容易讓用戶實現自己跨平台的代碼,比如java,php等,同一套代碼可以在幾乎所有的操作系統上執行,而無需根據操作系統做修改;
編譯器的目的就是生成目標代碼再由連接器生成可執行的機器碼,這樣的話需要根據不同的操作系統編制代碼,雖然有像Qt這樣的源代碼級跨平台的編程工具庫,但在不同的平台上仍然需要重新編譯連接成可執行文件,但其執行效率要遠遠高於解釋運行的程序。
編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;
而解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯後的程序運行的快的.
這是因為計算機不能直接認識並執行我們寫的語句,它只能認識機器語言(是二進制的形式)
⑸ 超贊,編譯器和解釋器的異同,瞬間明白了
編譯器和解釋器的最大不同就是:以 WINDOWS 系統為例進行講解就是:編譯器是可以把用戶編寫的源程序(例如:C 語言源程序)經過編譯、鏈接產生成一個在 WINDOWS 系統下面可獨立運行的二進制代碼(以 *.exe 為後綴的);而解釋器則必須在高級語言的解釋環境中才能夠運行用戶編寫的源程序,一旦退出了解釋器,那麼用戶編寫的源程序將無法執行。例如:以前的 BASIC 語言就是解釋執行、而不是編譯執行的。即:在 BASIC 解釋環境中,可以執行用戶編寫的以 *.BAS 為後綴的源程序,但是一旦退出了 BASIC 解釋器,那麼用戶編寫的 *.BAS 源程序就無法執行了。
⑹ python 編譯器與解釋器
編譯器是整體編譯再執行,而解釋器是邊解釋便執行。
舉個簡單的例子,編譯器就相當於你買了一桶海底撈,那麼所有海底撈食材都是整體「編譯」好,只要通過倒水(執行)就可以吃,而解釋器相當於你去海底撈門店,然後菜是一道一道上(一條一條解釋這是啥菜),你是一道一道放入湯中吃(執行)。
編譯器 的特點是:
解釋器 的特點是:
python的源文件通過解釋器進行模塊的載入及鏈接,然後將解釋完成的位元組碼存入內存,提供給CPU進行操作,然後寫入本地的.pyc文件,其觸發條件是判斷 是否存在.pyc文件+比較源文件與編譯的.pyc文件的時間戳
⑺ java解釋器和編譯器分別是什麼
Java的編譯方式有兩種,一種是和C++等語言一樣的,把源代碼編譯成和本地機器平台相關的機器語言,叫即時編譯。另一種是編譯成一種中間的位元組碼,與機器平台無關的,這種也是常用的,叫解釋型的。
即時編譯器因為產生的是本地機器的機器碼,能直接執行;不像位元組碼還要在JVM(Java虛擬機)上解釋運行,所以執行得更快些。
請採納!
⑻ python解釋器
python解釋器的介紹:
解釋器由一個編譯器和一個虛擬機構成,編譯器負責將源代碼轉換成位元組碼文件,而虛擬機負責執行位元組碼。
所以,解釋型語言其實也有編譯過程,只不過這個編譯過程並不是直接生成目標代碼,而是中間代碼(位元組碼),然後再通過虛擬機來逐行解釋執行位元組碼。
計算機的大腦是CPU, 中文名叫中央處理器,它仍然不能直接處理 Python 語言。CPU 只能直接處理機器指令語言,那是一種由0和1數字組成的語言,這是一種我們人很難直接寫出來的語言。
所以,我們需要一個翻譯,把Python語言翻譯成 計算機CPU 能聽懂的機器指令語言,這樣計算機才能按照 我們的Python程序的要求去做事。.py結尾的文件需要解釋器去運行執行。
執行過程原理:
1.執行 python XX.py 後,將會啟動 Python 的解釋器。
2.python解釋器的編譯器會將.py源文件編譯(解釋)成位元組碼生成PyCodeObject位元組碼對象存放在內存中。
3.python解釋器的虛擬機將執行內存中的位元組碼對象轉化為機器語言,虛擬機與操作系統交互,使機器語言在機器硬體上運行。
4.運行結束後python解釋器則將PyCodeObject寫回到pyc文件中。當python程序第二次運行時,首先程序會在硬碟中尋找pyc文件,如果找到,則直接載入,否則就重復上面的過程。
Python解釋器執行程序的三個階段:
第一步:先啟動python3解釋器。
第二步:Python3解釋器就像一個文本編輯器一樣將文件python3 D: est.py從硬碟讀入內存。
第三步:Python3解釋器解釋執行文件代碼。
只有第三階段才識別python的語法。
⑼ IE究竟是什麼網路瀏覽器程序解釋器、編譯器
python,lua還有javascript這些腳本語言其實是通過編譯成中間碼,然後再解釋這個中間碼來執行的,所以並不是純解釋的腳本。如果要寫一個純解釋的腳本語言解釋器,這種解釋器的速度肯定不會很快,但是程序可以更簡單一些。這對於需要小型的腳本解釋器的情況比較適用,因為一個人只要幾天就可以完成。比如unix的shell,windows中的cmd等。當然,對於一般的程序員來說,主要是為了嵌入自己的程序。假設我們的腳本包含變數,基本表達式,順序,分支,循環語句,goto等。手工編寫,當然是採用遞歸下降方法。
變數用一個鏈表或數組就可以解決。解釋賦值語句時,將變數存在符號表中。
表達式已經有很成熟的解決方法,就是一個算符堆棧,一個操作數堆棧,然後按算符優先順序來做就可以了
然後我們討論基本語句的執行
statements==>if_statements,for_statements,goto_statements等
我們用c函數exec_if,exec_for,exec_goto來分別解釋它們,用exec_statements()函數來遞歸調用前面這些函數。
如果是如下順序執行的腳本,實現是比較容易的,就是順序執行。
COMMAND:statements;
就是前面是命令後面是語句,在c語言中可以用一個switch輕松搞定。但是如果出現了分支與循環,函數的時候,情況就變得復雜了。先看循環語句,比如如下腳本
for i= 1 to 100 do
statements;
end
假設現在我們已經將腳本都載入到內存中了,有一個char *指針current指向當前的腳本的位置。這個解釋執行並不難。先解釋for i=1 to 100 do這句,將自變數i保存到符號表中,這時候current已經指向statements了。循環解釋執行的c程序偽碼如下:
char *old=current;
for(i=自變數開始值;i++;i<自變數目標值)
{
current =old;
執行 statements;(這個過程中current會變化)
}
其中自變數開始值和自變數目標值都可以解釋獲得,每次執行完statements後在開始循環時恢復current指針即可。
但是分支語句可沒這么簡單,比如腳本
if exp1 then
statements1;
elseif exp2 then
statements2;
end
假設exp1為真則執行statements1,exp2為真則執行statement2。那麼解釋執行的時候問題就來了,當exp1為真時
執行完statements1後,我們要跳過statements2到end,然後再執行,同樣exp1為假,exp2為真的時候,問題也同樣存在,需要跳過statements1.問題是怎麼跳過?statements1,statements2均可能包含嵌套的分支或循環。在編譯型的腳本中,其實不管是statements1,statements2在編譯的時候都是需要編譯的,在編譯完這些語句後再進行代碼回填。這樣在執行中間碼的過程中exp1,exp2執行完後,就知道跳到哪裡執行了,實際上在執行中間碼的時候腳本編譯器已經進行了一次源碼的掃描了,執行的函數不關心這些。但是我們現在是純解釋執行,就是一次掃描了。除了編譯成中間碼這個方法外,我沒有想到更優雅的辦法,這個方法因為涉及到編譯,不是純解釋因此排除掉。對每種語句都有一個解釋執行該語句的函數,例如
for 語句我們用exec_for()函數來執行,if我們用exec_if來執行。一種方法是可以對應編寫一個pass函數,例如pass_for(),pass_if(),這樣對於statements我們只需要一個pass_statements()函數就可以了,pass_statements()遞歸調用pass_for,pass_if,這樣就可以過濾掉不需要執行的語句了。pass函數只改變current的值而並不執行被pass掉的那些語句。
顯然pass_statemts除了不修改符號表,不做其它動作外,其它邏輯流程與exec_statements函數相同。這顯然不夠優雅。
goto則需要先掃描行號,執行goto時跳到對應的行。
不知有沒有更好的coding技巧,探索中。
http://www.learn-it.cn/Info_9509.htm