❶ 難道編譯器AI到幫人類善做主張的跳過寫的代碼不執行自作聰明的優化
從代碼上看,連續對同一個內存單元賦值,連續執行四次,和只執行最後一次沒有區別,如果編譯器優化能過濾掉這種沒有效率的代碼,你應該感謝編譯器的開發人員作出的這種提高程序執行效率的努力。
況且一般編輯器都都會提供是否優化代碼和優化等級的選項,供開發者選擇。
❷ 編程只有寫代碼→編譯→程序 這一種方式嗎有沒有更復雜的東西
是這樣。簡單編譯器靠一個人完全可以實現。編譯器主要分為編譯器和連接器兩個部分。我這里先簡單說一下編譯器。
首先所有編譯器都預定義了一個符號表項,在符號表現中保存著程序語言(如C++)的關鍵字(保留字)以及這些關鍵字對應的類型、作用域、優先順序、結合性等等。這個符號表項如果自己編寫的話,可以考慮實現為C++中的一個map容器。
其次編譯器需要一個代碼分析器。如果你之前寫過一個C++的計算器程序的話,我認為你對這個會很了解。代碼分析器就是說識別出代碼中的關鍵字並且識別出用戶定義類型等等。這個可以通過目前廣泛流行的「遞歸向下調用」實現。
首先編寫一個函數,處理大的表達式。這個函數返回最終結果(在編譯器中,這一步就是生成程序代碼),然後是字表達式函數,處理子表達式,返回結果。最後是一個分析單項的函數。這個函數分析出項是什麼類型(名字、值、關鍵字等)並且將類型信息用一個enum枚舉值返回。
最後我們通過這樣一個鏈條向下調用:表達式->字表達式->項。由項返回項類型給字表達式,子表達式產生結果(可能是一個新對象、一個變數)並且返回給表達式,表達式生成代碼(這里的代碼只是偽代碼,需要給連接器進一步處理成機器代碼)。
參見《C++程序設計語言 特別版》第6章 Calculator類。以及習題中有一道是讓你動手編寫一個簡單編譯器。
最後是連接器。連接器的實現很復雜。。很晦澀(這一步我完全不會)。它牽扯到了操作系統底層語言和實現。連接器的大致原理是分析編譯器生成的偽代碼並且會把它翻譯成機器語言(即一個二進制可執行文件)。光是這一步就有大量的系統底層問題:內存、指針、栰、地址、映象、內核等等。需要你精通操作系統以及內核了。事實上,我估計這一步只有大師級別的程序員才能實現(這樣的程序員估計沒有幾個)。這絕對是計算機編程的最高境界了。
❸ 編譯器做什麼工作
1. 詞法分析 詞法分析器根據詞法規則識別出源程序中的各個記號(token),每個記號代表一類單詞(lexeme)。源程序中常見的記號可以歸為幾大類:關鍵字、標識符、字面量和特殊符號。詞法分析器的輸入是源程序,輸出是識別的記號流。詞法分析器的任務是把源文件的字元流轉換成記號流。本質上它查看連續的字元然後把它們識別為「單詞」。 2. 語法分析 語法分析器根據語法規則識別出記號流中的結構(短語、句子),並構造一棵能夠正確反映該結構的語法樹。 3. 語義分析 語義分析器根據語義規則對語法樹中的語法單元進行靜態語義檢查,如果類型檢查和轉換等,其目的在於保證語法正確的結構在語義上也是合法的。 4. 中間代碼生成 中間代碼生成器根據語義分析器的輸出生成中間代碼。中間代碼可以有若干種形式,它們的共同特徵是與具體機器無關。最常用的一種中間代碼是三地址碼,它的一種實現方式是四元式。三地址碼的優點是便於閱讀、便於優化。 5. 中間代碼優化 優化是編譯器的一個重要組成部分,由於編譯器將源程序翻譯成中間代碼的工作是機械的、按固定模式進行的,因此,生成的中間代碼往往在時間和空間上有很大浪費。當需要生成高效目標代碼時,就必須進行優化。 6. 目標代碼生成 目標代碼生成是編譯器的最後一個階段。在生成目標代碼時要考慮以下幾個問題:計算機的系統結構、指令系統、寄存器的分配以及內存的組織等。編譯器生成的目標程序代碼可以有多種形式:匯編語言、可重定位二進制代碼、內存形式。 7 符號表管理 符號表的作用是記錄源程序中符號的必要信息,並加以合理組織,從而在編譯器的各個階段能對它們進行快速、准確的查找和操作。符號表中的某些內容甚至要保留到程序的運行階段。 8 出錯處理用戶編寫的源程序中往往會有一些錯誤,可分為靜態錯誤和動態錯誤兩類。所謂動態錯誤,是指源程序中的邏輯錯誤,它們發生在程序運行的時候,也被稱作動態語義錯誤,如變數取值為零時作為除數,數組元素引用時下標出界等。靜態錯誤又可分為語法錯誤和靜態語義錯誤。語法錯誤是指有關語言結構上的錯誤,如單詞拼寫錯、表達式中缺少操作數、begin和end不匹配等。靜態語義錯誤是指分析源程序時可以發現的語言意義上的錯誤,如加法的兩個操作數中一個是整型變數名,而另一個是數組名等。
❹ 什麼是c編譯器有什麼用,可以用它來寫C語言嗎
所謂c語言編譯器,就是把編程得到的文件,比如.c,.h的文件,進行讀取,並對內容進行分析,按照c語言的規則,將其轉換成系統可以執行的二進制文件。
其本質在於對文件的讀入,分析,及處理。這些操作,c語言都是可以實現的。
所以用c語言來做c語言的編譯器是完全可行的。
但是,歷史上的第一個c語言編譯器,肯定不是c語言寫的,因為在沒有編譯器時,無法把c語言轉換成可執行文件。
只要有了第一版其它語言的編譯器,就可以用c語言寫編譯器了。
事實上,目前大多數的c語言編譯器,都是用c語言寫的。
❺ 編譯原理除了可以用來編寫編譯器,還在哪些領域可以用到編譯原理的知識
很多的,例如MASM編譯器。
編譯原理內容包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間代碼生成、存儲管理、代碼優化和目標代碼生成等,這門課大部分人聽起來比較困難,介紹編譯程序構造的一般原理和基本方法,雖然只有少數人從事編譯方面的工作,但是這門課在理論、技術、方法上都對我們提供了系統而有效的訓練,有利於提高軟體人員的素質和能力。
❻ 編譯器有什麼用
簡單講,編譯器就是將「一種語言(通常為高級語言)」翻譯為「另一種語言(通常為低級語言)」的程序。一個現代編譯器的主要工作流程:源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 目標代碼 (object code) → 鏈接器(Linker) → 可執行程序 (executables)
高級計算機語言便於人編寫,閱讀交流,維護。機器語言是計算機能直接解讀、運行的。編譯器將匯編或高級計算機語言源程序(Source program)作為輸入,翻譯成目標語言(Target language)機器代碼的等價程序。源代碼一般為高級語言 (High-level language), 如Pascal、C、C++、Java、漢語編程等或匯編語言,而目標則是機器語言的目標代碼(Object code),有時也稱作機器代碼(Machine code)。
對於C#、VB等高級語言而言,此時編譯器完成的功能是把源碼(SourceCode)編譯成通用中間語言(MSIL/CIL)的位元組碼(ByteCode)。最後運行的時候通過通用語言運行庫的轉換,編程最終可以被CPU直接計算的機器碼(NativeCode)。
❼ 編譯器是什麼意思,是做什麼的
編譯器
編譯器是一種特殊的程序,它可以把以特定編程語言寫成的程序變為機器可以運行的機器碼。我們把一個程序寫好,這時我們利用的環境是文本編輯器。這時我程序把程序稱為源程序。在此以後程序員可以運行相應的編譯器,通過指定需要編譯的文件的名稱就可以把相應的源文件(通過一個復雜的過程)轉化為機器碼了。
下面我們看看它是如何工作的。首先編譯器進行語法分析,也就是要把那些字元串分離出來。然後進行語義分析,就是把各個由語法分析分析出的語法單元的意義搞清楚。最後生成的是目標文件,我們也稱為obj文件。再經過鏈接器的鏈接就可以生成最後的可執行代碼了。有些時候我們需要把多個文件產生的目標文件進行鏈接,產生最後的代碼。我們把一過程稱為交叉鏈接。
有一個稱為LCC的編譯器,還挺不錯的;還有一個用於分析其規則的小工具;
❽ TurboC中的代碼編譯器是做什麼用的啊
代碼編譯器是用來修改程序的代碼的,或者編輯程序的源代碼時會用到的,如果技術不行不要亂修改源代碼,不然後果自負呵~~~~~~~~~
❾ 在編寫程序時要用到編譯器,什麼是編譯器有什麼用
VC Borland C Eclipse 都是編譯器 就是把你的源代碼 編譯 解釋成機器能讀懂的機器碼 因為機器內部是用二進制的嘛 所以最終也就是一串 1 0 組成的序列
❿ C語言編譯器是用來做什麼的
1.
C語言是一種結構化語言。它層次清晰,便於按模塊化方式組織程序,易於調試和維護。
2.
C語言的表現能力和處理能力極強。它不僅具有豐富的運算符和數據類型,便於實現各類復雜的數據結構。它還可以直接訪問內存的物理地址,進行位(bit)一級的操作。由於C語言實現了對硬體的編程操作,因此C語言集高級語言和低級語言的功能於一體。既可用於系統軟體的開發,也適合於應用軟體的開發。此外,C語言還具有效率高,可移植性強等特點。因此廣泛地移植到了各類各型計算機上,從而形成了多種版本的C語言。