⑴ 編譯器的組成及各部分的功能及作用
1. 詞法分析 詞法分析器根據詞法規則識別出源程序中的各個記號(token),每個記號代表一類單詞(lexeme)。源程序中常見的記號可以歸為幾大類:關鍵字、標識符、字面量和特殊符號。詞法分析器的輸入是源程序,輸出是識別的記號流。詞法分析器的任務是把源文件的字元流轉換成記號流。本質上它查看連續的字元然後把它們識別為「單詞」。 2. 語法分析 語法分析器根據語法規則識別出記號流中的結構(短語、句子),並構造一棵能夠正確反映該結構的語法樹。 3. 語義分析 語義分析器根據語義規則對語法樹中的語法單元進行靜態語義檢查,如果類型檢查和轉換等,其目的在於保證語法正確的結構在語義上也是合法的。 4. 中間代碼生成 中間代碼生成器根據語義分析器的輸出生成中間代碼。中間代碼可以有若干種形式,它們的共同特徵是與具體機器無關。最常用的一種中間代碼是三地址碼,它的一種實現方式是四元式。三地址碼的優點是便於閱讀、便於優化。 5. 中間代碼優化 優化是編譯器的一個重要組成部分,由於編譯器將源程序翻譯成中間代碼的工作是機械的、按固定模式進行的,因此,生成的中間代碼往往在時間和空間上有很大浪費。當需要生成高效目標代碼時,就必須進行優化。 6. 目標代碼生成 目標代碼生成是編譯器的最後一個階段。在生成目標代碼時要考慮以下幾個問題:計算機的系統結構、指令系統、寄存器的分配以及內存的組織等。編譯器生成的目標程序代碼可以有多種形式:匯編語言、可重定位二進制代碼、內存形式。 7 符號表管理 符號表的作用是記錄源程序中符號的必要信息,並加以合理組織,從而在編譯器的各個階段能對它們進行快速、准確的查找和操作。符號表中的某些內容甚至要保留到程序的運行階段。 8 出錯處理用戶編寫的源程序中往往會有一些錯誤,可分為靜態錯誤和動態錯誤兩類。所謂動態錯誤,是指源程序中的邏輯錯誤,它們發生在程序運行的時候,也被稱作動態語義錯誤,如變數取值為零時作為除數,數組元素引用時下標出界等。靜態錯誤又可分為語法錯誤和靜態語義錯誤。語法錯誤是指有關語言結構上的錯誤,如單詞拼寫錯、表達式中缺少操作數、begin和end不匹配等。靜態語義錯誤是指分析源程序時可以發現的語言意義上的錯誤,如加法的兩個操作數中一個是整型變數名,而另一個是數組名等。
⑵ 計算機都有編譯器和解釋器嗎
編譯器是程序員開發程序用的~!
而解釋器則是執行腳本程序用到~
編譯器和解釋器都是軟體,非硬體``
而計算機上通常在系統中已裝有某些腳本或批處理的解釋器。
編譯器大多數就沒有內置安裝了。
⑶ 在編寫程序時要用到編譯器,什麼是編譯器有什麼用
VC Borland C Eclipse 都是編譯器 就是把你的源代碼 編譯 解釋成機器能讀懂的機器碼 因為機器內部是用二進制的嘛 所以最終也就是一串 1 0 組成的序列
⑷ 匯編編譯器究竟在哪裡Cpu中
編譯器其實就是個軟體,把你的匯編語言編譯成 計算機可執行的 二進制代碼。
如此而已,不要想太多
⑸ 計算機有解釋器為什麼還要有編譯器 明顯是編譯器要快捷於解釋器啊…………
下面這個回答可以參考:
編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;
而解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯後的程序運行的快的.
這是因為計算機不能直接認識並執行我們寫的語句,它只能認識機器語言(是二進制的形式)
編譯是將源程序翻譯成可執行的目標代碼,翻譯與執行是分開的;而解釋是對源程序的翻譯與執行一次性完成,不生成可存儲的目標代碼。這只是表象,二者背後的最大區別是:對解釋執行而言,程序運行時的控制權在解釋器而不在用戶程序;對編譯執行而言,運行時的控制權在用戶程序。
解釋具有良好的動態特性和可移植性,比如在解釋執行時可以動態改變變數的類型、對程序進行修改以及在程序中插入良好的調試診斷信息等,而將解釋器移植到不同的系統上,則程序不用改動就可以在移植了解釋器的系統上運行。同時解釋器也有很大的缺點,比如執行效率低,佔用空間大,因為不僅要給用戶程序分配空間,解釋器本身也佔用了寶貴的系統資源。
⑹ 編譯程序安裝在計算機的哪裡
舉例來說:
當你使用C編寫代碼,使用編譯器編譯後,即生成了可執行程序。當可執行程序被操作系統的載入器載入到內存、並准備好必要的數據後從代碼段開始執行,這時的代碼段代碼已經是機器碼了,無須編譯。當然,可執行程序里的所有數據並非都是代碼,有些是寫給操作系統看的,以使操作系統能為程序的執行做好必要准備。
至於說DOS命令,分為外部命令和內部命令。外部命令和一般的可執行程序沒有區別,他以可執行程序文件的形式存在。沒有這個文件就不能運行這個命令;內部命令是固化在操作系統中的代碼模塊,一般以DLL文件的形式存在。至於哪個DLL文件包含特定的內部命令的代碼,就必須查資料了。
CPU所支持的指令集,是由CPU的物理設計決定的,並不是說有什麼指令存放在CPU上。
當然,如果是解釋性的語言。那麼,可執行程序是一邊被解釋(編譯)一邊被執行的。所以他的速度要慢些。並且必須安裝對應的編譯(解釋)程序。比如java。
⑺ 機器語言是如何在計算機內部被執行的呢
你該看看這個:
一、引言
在計算機科學中,編程語言是用來編寫可被計算機運行的一系列指令(計算機程序)的人工語言。與英語等自然語言相類似,編程語言具有詞彙、語法和句法。然而,自然語言不適合計算機編程,因為它們能引起歧義,也就是說它們的詞彙和語法結構可以用多種方式進行解釋。用於計算編程的語言必須具有簡單的邏輯結構,而且它們的語法、拼寫和標點符號的規則必須精確。
編程語言在復雜性和通用程度上大相徑庭。有些編程語言是為了處理特定類型的計算問題或為了用於特定型號的計算機系統而編寫的。例如,FORTRAN和COBOL等編程語言是為解決某些普遍的編程問題類型而編寫的——FORTRAN為了科學領域的應用,而COBOL為了商業領域的應用。盡管這些語言旨在處理特定類型的計算機問題,但是它們具有很高的可移植性,也就是說它們可以用來為多種類型的計算機編程。其他的語言,譬如機器語言,是為一種特定型號的計算機系統,甚至是一台特定的計算機,在某些研究領域使用而編寫的。最常用的編程語言具有很高的可移植性,可以用於有效地解決不同類型的計算問題。像C、PASCAL和BASIC這樣的語言就屬於這一范疇。
二、語言類型
編程語言可劃分為低級語言和高級語言。低級編程語言或機器語言,是編程語言中最基礎的類型,能被計算機直接理解。機器語言的區別取決於製造商和計算機的型號。高級語言是在計算機能夠理解和處理之前必須首先翻譯成機器語言的編程語言。C、C++、PASCAL和FORTRAN都是高級語言的例子。匯編語言是中級語言,非常接近於機器語言,沒有其他高級語言所表現出的語言復雜程度,但仍然得翻譯成機器語言。
1、機器語言
在機器語言中,指令被寫成計算機能夠直接理解的被稱之為比特的1和0的序列。機器語言中的一條指令通常告訴計算機4件事情:(1)到計算機主存儲器(隨機訪問存儲器)的哪個位置去找一或兩個數字或者簡單的數據段;(2)要執行的一個簡單操作,例如將兩個數字加起來;(3)將這個簡單操作的結果存放在主存儲器的什麼位置;以及(4)到哪裡找要執行的下一條指令。雖然所有的可執行程序最終都是以機器語言的形式被計算機讀取,但是它們並非都是用機器語言編寫的。直接用機器語言編程極端困難,因為指令是1和0的序列。機器語言中的一條典型的指令可能是10010 1100 1011,意思是將存儲寄存器A的內容加到存儲寄存器B的內容中。
2、高級語言
高級語言是利用人類語言中的詞和句法的一套相對復雜的語句。它們比匯編語言和機器語言更類似於正常的人類語言,因此用來編寫復雜的程序更容易。這些編程語言允許更快地開發更龐大和更復雜的程序。然而,在計算機能夠理解之前,高級語言必須被稱之為編譯器的另外一種程序翻譯成機器語言。因為這個原因,與用匯編語言編寫的程序比較起來,用高級語言編寫的程序可能運行的時間更長,佔用的內存更多。
3、匯編語言
計算機編程人員使用匯編語言使機器語言程序編寫起來更簡單一些。在匯編語言中,每條語句大致對應一條機器語言指令。匯編語言的語句是藉助易於記憶的命令編寫的。在典型的匯編語言的語句中,把存儲寄存器A的內容加到存儲寄存器B的內容中這一命令,可以寫成ADD B, A。匯編語言與機器語言具有某些共同特徵。例如,對特定的比特進行操作,用匯編語言和機器語言都是可行的。當盡量減少程序的運行時間很重要時,程序員就使用匯編語言,因為從匯編語言到機器語言的翻譯相對簡單。當計算機的某個部分必須被直接控制時,如監視器上的單個點或者流向列印機的單個字元,這時也使用匯編語言。
三、高級語言的分類
高級語言通常分為面向過程的、函數式的、面向對象的或邏輯的語言。當今最常見的高級語言是面向過程的語言。在這種語言中,執行某個完整功能的一個或多個相關的語句塊組成一個程序模塊或過程,而且被給予諸如「過程A」的名稱。如果在程序的其他地方需要同樣的操作序列,可以使用一個簡單的語句調回這個過程。實質上,一個過程就是一個小型程序。一個大程序可以通過將執行不同任務的過程組合在一起而構成。過程語言使程序變得比較短,而且更易於被計算機讀取,但是要求程序員將每個過程都設計得足夠通用,能用於不同的情況。
函數式語言像對待數學函數一樣對待過程,並允許像處理程序中的任何其他數據一樣處理它們。這就使程序構造在更高、更嚴密的水平上得以實現。函數式語言也允許變數——在程序運行過程中可以被用戶指定和更改的數據符號——只被賦值一次。這樣,通過減少對語句執行的確切順序給予關注的必要性,就簡化了編程,因為一個變數沒有必要每次在一個程序語句中用到,都重新定義或重新賦值。函數式語言的許多觀點已經成為許多現代過程語言的關鍵部分。
面向對象的語言是函數式語言的發展結果。在面向對象的語言中,用來編寫程序的代碼和程序處理的數據,組合成叫做對象的單元。對象進一步組合成類,而類則定義對象必須具有的屬性。類的一個簡單例子就是書這個類。這個類中的對象可能是小說和短篇小說。對象還有某些與其相關的功能,稱為方法。計算機通過使用對象的某種方法來使用這個對象。方法對對象中的數據執行某個操作,然後將值返回給計算機。對象的類也可更進一步組合成層,而在層中一個類的對象可繼承另一個類的方法。面向對象的語言中所提供的這種結構,使面向對象的語言對於復雜的編程任務非常有用。
邏輯語言將邏輯用作其數學基礎。一個邏輯程序由一系列的事實與「如果……則」規則組成,來具體說明一系列事實如何可以從其他實事中推斷出來,例如:
如果X語句為真,則Y語句為假。
在這樣一個程序的執行過程中,一條輸入語句可以按照邏輯從程序中的其他語句推斷出來。許多人工智慧程序使用這種語言編寫。
四、語言的結構與成分
編程語言使用特定類型的語句或指令,來給程序提供功能結構。程序中的一條語句是表達一個簡單意思的基本句子,其目的是給計算機一條基本指令。語句對允許的數據類型、數據如何處理以及過程和函數的工作方式進行定義。程序員利用語句來操作編程語言的常見成分,如變數和宏(程序中的小型程序)。
數據聲明語句給予稱為變數的程序元素以名稱和屬性。變數在程序中可以賦予不同的值。變數可以具有的屬性被稱作類型,它們包括:變數中可能存儲什麼樣的值,值中使用何種程度的數值精度,以及一個變數可以如何以有組織結構的方式——如以表或數組的形式——代表一組比較簡單的值等等。在許多編程語言中,一種關鍵的數據類型是指示字。指示字變數本身沒有值;相反,它們含有計算機可以用來查找某個其他變數的信息——也就是說,它們指向另一個變數。
表達式是語句的一段,描述要對一些程序變數執行的一系列運算,如X+Y/Z,其中X、Y和Z為變數,運算方法為加和除。賦值語句給一個變數賦予得自某個表達式的值,而條件語句則指定要被測試、然後用於選擇接下來應該執行的其他語句的表達式。
過程與函數語句將某些代碼塊定義為以後可在程序中返回的進程或函數。這些語句也規定程序員可以選擇的變數與參數種類,以及當一個表達式使用過程或函數時代碼將返回的值的類型。許多編程語言也容許叫做宏的小型翻譯程序。宏把使用程序員定義的語言結構編寫的代碼段翻譯成編程語言可以理解的語句。
五、歷史
編程語言幾乎可以追溯到20世紀40年代數字計算機發明之時。最早的匯編語言,隨著商業計算機的推出,出現於20世紀50年代末。最早的過程語言是在20世紀50年代末到20世紀60年代初開發的:FORTRAN語言由約翰•巴克斯創造,然後由格雷斯•霍珀創造了COBOL語言。第一種函數式語言是LISP,由約翰•麥卡錫於20世紀50年代末編寫。這3種語言今天仍在廣泛使用,但經歷過大量修改。
20世紀60年代末,出現了最早的面向對象的語言,如SIMULA語言。邏輯語言在20世紀70年代中期隨著PROLOG語言的推出而變得廣為人知;PROLOG語言是一種用於編寫人工智慧軟體的語言。在20世紀70年代,過程語言繼續發展,出現了ALGOL、BASIC、PASCAL、C和Ada等語言。SMALLTALK語言是一種具有高度影響力的面向對象的語言,它導致了面向對象的語言與過程語言在C++和更近期的JAVA語言中的結合。盡管純粹的邏輯語言受歡迎的程度有所下降,但其變體以現代資料庫所使用的關系語言——如結構化查詢語言——的形式,變得至關重要。
⑻ 計算機編譯器是什麼,怎麼用
計算機編譯器可以說是計算機軟體的生產工具,幾乎所有的軟體都是由編譯器編譯而成的。用的方法有兩種,第一個種是集成在了開發環境里,第二種是用命令行編譯。
⑼ 編譯器屬於計算機系統的內核嗎
當然不是,是編程環境的內核
⑽ 電腦自帶編譯器么還是安裝操作系統是會帶有自動安裝編譯器
不是所有的系統都帶. 很多linux都會帶gcc, 以前的DOS和win98帶qbasic,
現在的Windows基本沒有帶編譯器,但是帶有一些腳本解釋器,包括javascript, vbscript
Windows vista帶powershell解釋器。
,編譯器就是將「一種語言(通常為高級語言)」翻譯為「另一種語言(通常為低級語言)」的程序。一個現代編譯器的主要工作流程:源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 目標代碼 (object code) → 鏈接器(Linker) → 可執行程序 (executables)
高級計算機語言便於人編寫,閱讀交流,維護。機器語言是計算機能直接解讀、運行的。編譯器將匯編或高級計算機語言源程序(Source program)作為輸入,翻譯成目標語言(Target language)機器代碼的等價程序。源代碼一般為高級語言 (High-level language), 如Pascal、C、C++、Java、漢語編程等或匯編語言,而目標則是機器語言的目標代碼(Object code),有時也稱作機器代碼(Machine code)。