c的編譯器是怎麼做的
⑴ 編譯器是怎麼被編譯出來的
我們要在Y系統上做一個c語言的編譯器,假定:X與Y是不同的兩種計算機,其指令系統不兼容。考慮以下幾種情況:
Case 1: Y上沒有C語言編譯器,但X系統上有。
那麼我們可以先在X系統上開發一個針對Y系統的C語言交叉編譯器。然後用這個交叉編譯器重新編譯已有的這個C編譯器的源代碼,就可以得到能在Y系統上運行的C語言編譯器了。(交叉編譯器:在X系統上運行的編譯器,但編譯出來的目標代碼在Y系統上運行。嵌入式平台上的程序基本都是交叉編譯得到的,因為嵌入式平台上很少會有自己的編譯器)
Case 2: X,Y上都沒有C語言編譯器,但有另一種語言的編譯器。
a.我們可以先劃出C語言的一個子集,這個子集必須滿足兩個條件:首先,必須足夠簡單,簡單到可以用另一種語言來編寫接受這個子集的編譯器;其次,必須足夠強大,強大到用這個語言子集就可以編寫出接受C語言的編譯器。(你一定奇怪為什麼一個語言的子集就能寫出接收整個語言的編譯器,呵呵。我猜是因為一個語言的很多復雜特性都是由簡單特性構成的,就像一個struct結構完全可以用幾個定義在一起的簡單變數代替實現;而且,編譯器的實現往往不會用到這個語言的高級特性,需要用的都加到那個子集里就行。)
b.再用另一種語言編寫一個能接受這個C語言子集的編譯器,只要保證可以在Y系統上正確運行就行,並不對其效率作要求,因為基本上它只被用一次。
c.然後,用C語言的子集編寫一個在Y系統上的C語言編譯器,用上一步得到的編譯器編譯得到可用的Y系統上的C編譯器。
⑵ 怎樣去寫一個編譯器(用C語言寫C語言編譯器),需要哪些知識做鋪墊,可以給一下相關網站和書籍的推薦嗎
書籍請參考編譯原理的龍書,以及flex,bison,llvm的manual。
如何寫我可以給你一個大致的流程,
編譯器由詞法分析器->語法分析器->中間代碼生成器->後端組成。
用C語言寫編譯器一般可以按照以下步驟:
1.使用flex生成詞法分析器。(flex可以通過自己編寫的描述文件來自動生成詞法分析器)
2.使用bison生成語法分析器。(bison可以通過自己編寫的描述文件來自動生成語法分析器)
3.通過語法分析器得到輸入代碼的語法樹表示。
4.編寫遍歷函數遍歷語法樹生成中間代碼。(這里推薦使用LLVM的中間代碼表示)
5.利用LLVM工具集來編譯執行所得到的中間代碼。
相關網站:
龍書(當當上去買一本)
http://dinosaur.compilertools.net/flex/index.html(flex手冊)
http://dinosaur.compilertools.net/bison/index.html(bison手冊)
http://www.llvm.org(LLVM官網)
⑶ 第一個 C 語言編譯器是怎樣編寫的
第一個C語言編譯器
是先制定了簡單的C語法後,用B語言寫的
這個是C語言的前身。
當時B語言已經比較成熟 只不過 沒有C強大
於是 發明了C語言
之所以叫C,其實也是因為在B基礎上加一。
後續的C編譯器 就都是用C寫的了。
⑷ c語言編譯器是用什麼於語言寫的
第一個C語言編譯器應該是用匯編寫的,但是第一個成熟的C語言編譯器應該是由匯編和C語言共同寫的。
編譯原理講到了「自舉編譯器」。大意就是先用底層語言(應該是匯編)寫一個能運行,但效率極低的C語言編譯器(底層語言不好優化),有了C語言的編譯器以後,就可以用C語言好好寫一個編譯器了,用之前那個運行沒問題,但效率低得編譯器編譯一下,就得到了可以使用的編譯器了。
⑸ c編譯器是如何編譯程序的
每種平台都有自己的C編譯器的,例如linux下有 gcc ,windows下有ms vs 系列。c的源程序經過這些編譯器,再與各自平台的連接器就可以生成該平台下對應的二進制執行代碼了。
但由於C語言很多時候會涉及很多硬體級調用的,這個對平台依賴性極大。所以移植性這種東西,我只能說,哈哈!
⑹ c編譯程序是什麼
c編譯程序是將c語言程序編譯成目標代碼程序的程序,即正確答案應該選擇D。
1、c語言是目前世界上最流行、使用最廣泛的面向過程的高級程序設計語言。 c語言對操作系統和系統使用程序以及需要對硬體進行操作的場合,用c語言明顯優於其它高級語言,許多大型應用軟體都是用c語言編寫的。
2、編譯就是利用編譯程序從源語言編寫的源程序產生目標程序的過程,其中的五個階段分別是詞法分析、語法分析、語義檢查和中間代碼生成、代碼優化、目標代碼生成。主要是進行詞法分析和語法分析,又稱為源程序分析,分析過程中發現有語法錯誤,給出提示信息。
(6)c的編譯器是怎麼做的擴展閱讀
c編譯程序的語言特點
對於c編譯程序來說,其語言的特點如下:
1、c語言是一種結構化語言。它層次清晰,便於按模塊化方式組織程序,易於調試和維護,而且表現能力和處理能力極強。
2、c語言具有豐富的運算符和數據類型,便於實現各類復雜的數據結構。它還可以直接訪問內存的物理地址,進行位(bit)一級的操作。
3、由於c語言實現了對硬體的編程操作,因此集高級語言和低級語言的功能於一體。它既可用於系統軟體的開發,也適合於應用軟體的開發。
4、此外,c語言還具有效率高、可移植性強等特點。因此它廣泛地移植到了各類各型計算機上,從而形成了多種版本。
⑺ C語言編譯器是用來做什麼的
編譯器,是將便於人編寫,閱讀,維護的高階計算機語言翻譯為計算機能解讀、運行的低階機器語言的程序。編譯器將原始程序(Source program)作為輸入,翻譯產生使用目標語言(Target language)的等價程序。源代碼一般為高階語言 (High-level language), 如 Pascal、C++、Java 等,而目標語言則是匯編語言或目標機器的目標代碼(Object code),有時也稱作機器代碼(Machine code)。
一個現代編譯器的主要工作流程如下:
源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 匯編程序 (assembler) → 目標代碼 (object code) → 連接器 (Linker) → 可執行程序 (executables)
⑻ 第一個C語言編譯器是怎樣編寫的
任何一個功能
任何一個語言 都能實現
所以 關鍵的不在於語言 而在於 演算法
C語言被人設計出來
設計了它的語法和規則
然後 根據這個規則,用B語言(Ken Thompson發明的B語言,而 B語言則源自BCPL語言。) 加匯編 編寫了第一個C的編譯器
沒用多久
因為C語言更好用
於是 後續的C語言編譯器 都是C語言自己寫的了。