⑴ 編譯器有什麼用
簡單講,編譯器就是將「一種語言(通常為高級語言)」翻譯為「另一種語言(通常為低級語言)」的程序。一個現代編譯器的主要工作流程:源代碼 (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)。
⑵ 高級語言經過編譯器之後的處理
假設你的程序有兩種源代碼,一種是C語言寫的,一種是java寫的,現在要發布到這幾個平台上:
1、Windows 7/xp/vista...
2、linux RedHat/Fedora/Unbutu...
3、Symbian S60/S50(手機)
那麼源程序如果是C語言的,需要找下面的工具:
1、VC60/VS2008,負責編譯生成VISTA/XP/WIN7用的.exe文件
2、G++,負責編譯生成Linux用的可執行程序
3、Symbian用的C++編譯器,不說也罷
如果源程序是JAVA語言的,那麼需要做的僅僅是用javac編譯、jar打包,然後:
1、確保目標WIN7/XP/VISTA安裝了java虛擬機
2、確保目標LINUX安裝了java虛擬機
3、確保目標手機Symbian系統已安裝了支持同版本的java虛擬機
看明白沒有?C語言編譯器是直接把源程序一步翻譯為目標計算機(16位,32位,64位)的指定晶元(X86或ALPHA PPC,RISC)、指定操作系統(WINDOWS,DOS,LINUX,SYMBIAN)用的特定可執行程序目標碼,
而JAVA編譯器是把程序翻譯為中間碼,由虛擬機將中間碼解釋為最終的指定晶元、指定操作系統的可執行程序目標碼
嚴格來說,C和C++、JAVA都是跨平台的,但C#肯定不是,至少目前還沒有人在LINUX上做C#的實現。
不同的是,C和C++是通過不同平台上的不同編譯器實現跨平台
JAVA是通過不同平台的不同虛擬機實現跨平台
這樣說你看懂了沒有?
⑶ 大家都推薦我學C或C++,學會了以後會有什麼大作為嗎
c
c++是基礎
要學精通,有作為的話學要一個體系
學技術本來就是給別人打工的了
不想打工就只能自己創業咯,需要的是你的社會能力
⑷ 編譯原理學了有什麼用
對大多數人來說,學過編譯原理,應該可以知道對於很多代碼的優化,編譯器其實可以做好,不需要自己寫代碼的時候杞人憂天。在通用、局部的優化上,甚至編譯器往往做得比程序員好。
大概率會意識到編譯原理背後的故事,也許會沉迷在某個方向,也許還會樂於看一些奇妙的parser構建方式。
大概還可能會去學習類型系統,發現形式化的故事似乎在很多方面都有對應的版本,而後,他們也許會嘗試走向研究,去挑戰目前都沒有好好解決的代碼優化問題,也許會走向應用,用起LLVM,在上面加個target,支持一些新硬體,做個新語言的前端等。
編譯原理是計算機專業的一門重要專業課,旨在介紹編譯程序構造的一般原理和基本方法。內容包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間代碼生成、存儲管理、代碼優化和目標代碼生成。 編譯原理是計算機專業設置的一門重要的專業課程。
編譯原理課程是計算機相關專業學生的必修課程和高等學校培養計算機專業人才的基礎及核心課程,同時也是計算機專業課程中最難及最挑戰學習能力的課程之一。編譯原理課程內容主要是原理性質,高度抽象。
編譯可以分為五個基本步驟:詞法分析、語法分析、語義分析及中間代碼的生成、優化、目標代碼的生成。這是每個編譯器都必須的基本步驟和流程, 從源頭輸入高級語言源程序輸出目標語言代碼。
1、詞法分析
詞法分析器是通過詞法分析程序對構成源程序的字元串從左到右的掃描, 逐個字元地讀, 識別出每個單詞符號, 識別出的符號一般以二元式形式輸出, 即包含符號種類的編碼和該符號的值。
詞法分析器一般以函數的形式存在, 供語法分析器調用。當然也可以一個獨立的詞法分析器程序存在。完成詞法分析任務的程序稱為詞法分析程序或詞法分析器或掃描器。
2、語法分析
語法分析是編譯過程的第二個階段。這階段的任務是在詞法分析的基礎上將識別出的單詞符號序列組合成各類語法短語, 如「語句」, 「表達式」等.語法分析程序的主要步驟是判斷源程序語句是否符合定義的語法規則, 在語法結構上是否正確。
而一個語法規則又稱為文法, 喬姆斯基將文法根據施加不同的限制分為0型、1型、2型、3型文法, 0型文法又稱短語文法, 1型稱為上下文有關文法, 2型稱為上下文無關文法, 3型文法稱為正規文法, 限制條件依次遞增。
3、語義分析
詞法分析注重的是每個單詞是否合法, 以及這個單詞屬於語言中的哪些部分。語法分析的上下文無關文法注重的是輸入語句是否可以依據文法匹配產生式。
那麼, 語義分析就是要了解各個語法單位之間的關系是否合法。實際應用中就是對結構上正確的源程序進行上下文有關性質的審查, 進行類型審查等。
4、中間代碼生成與優化
在進行了語法分析和語義分析階段的工作之後, 有的編譯程序將源程序變成一種內部表示形式, 這種內部表示形式叫做中間語言或中間表示或中間代碼。
所謂「中間代碼」是一種結構簡單、含義明確的記號系統, 這種記號系統復雜性介於源程序語言和機器語言之間, 容易將它翻譯成目標代碼。另外, 還可以在中間代碼一級進行與機器無關的優化。
5、目標代碼的生成
根據優化後的中間代碼, 可生成有效的目標代碼。而通常編譯器將其翻譯為匯編代碼, 此時還需要將匯編代碼經匯編器匯編為目標機器的機器語言。
6、出錯處理
編譯的各個階段都有可能發現源碼中的錯誤, 尤其是語法分析階段可能會發現大量的錯誤, 因此編譯器需要做出錯處理, 報告錯誤類型及錯誤位置等信息。
⑸ linux下鏈接過程中編譯器會做哪些工作
1. 預處理
首先源代碼文件(.c/.cpp)和相關頭文件(.h/.hpp)被預處理器cpp預編譯成.i文件(C++為.ii)。預處理命令為:
gcc –E hello.c –o hello.i
預編譯過程主要處理那些源代碼中以#開始的預編譯指令,主要處理規則如下:
u 將所有的#define刪除,並且展開所有的宏定義;
u 處理所有條件編譯指令,如#if,#ifdef等;
u 處理#include預編譯指令,將被包含的文件插入到該預編譯指令的位置。該過程遞歸進行,及被包含的文件可能還包含其他文件。
u 刪除所有的注釋//和 /**/;
u 添加行號和文件標識,如#2 「hello.c」 2,以便於編譯時編譯器產生調試用的行號信息及用於編譯時產生編譯錯誤或警告時能夠顯示行號信息;
u 保留所有的#pragma編譯器指令,因為編譯器須要使用它們。
2. 編譯
編譯過程就是把預處理完的文件進行一系列詞法分析,語法分析,語義分析及優化後生成相應的匯編代碼文件(.s)。編譯的命令為:
gcc –S hello.i –o hello.s
或者從源文件直接輸出匯編代碼文件:
gcc –S hello.c –o hello.s
現在版本的GCC把預編譯和編譯兩個步驟合並成一個步驟,由程序cc1來完成(C++為cc1plus)。
3. 匯編
匯編就是將匯編代碼轉變成機器可以執行的命令,生成目標文件(.o),匯編器as根據匯編指令和機器指令的對照表一一翻譯即可完成。匯編的命令為:
gcc –c hello.s –o hello.o
或者從源文件直接輸出目標文件:
gcc –c hello.c –o hello.o
4. 鏈接
鏈接就是鏈接器ld將各個目標文件組裝在一起,解決符號依賴,庫依賴關系,並生成可執行文件。鏈接的命令為:
ld –static crt1.o crti.o crtbeginT.o hello.o –start-group –lgcc –lgcc_eh –lc-end-group crtend.o crtn.o
一般我們使用一條命令就可以完成上述4個步驟:
gcc hello.c
實際上gcc只是一些其它程序的包裝,它會根據不同參數去調用預編譯編譯程序cc1、匯編器as、鏈接器ld。
⑹ WPS的有宏編譯器啟用宏拿來幹嘛
宏是用於擴展WPS功能,可以編寫宏代碼,來完成WPS中沒有的功能,或者提高操作效率。
開始wps文字宏功能的步驟如下。打開WPS文字,進入程序主界面。接著,點擊上方的開始工具選項,點擊打開。在窗口中看到宏功能處於灰色,無法使用。
宏的用途是使常用任務自動化。雖然有些宏僅僅是記錄鍵擊或滑鼠單擊操作,但開發人員可以使用代碼編寫功能更強大的VBA(VisualBasicforApplications(VBA):MicrosoftVisualBasic的宏語言版本,用於編寫基於MicrosoftWindows的應用程序,內置於多個Microsoft程序中。)宏,這些宏可以在計算機上運行多條命令。
⑺ 編譯器代碼打完之後應該干什麼
打完代碼後就是調試工作,看是否有錯,進行修正。最後發布程序
⑻ java編譯器的作用是什麼
java編譯器的作用就是「編譯」,即將java源代碼編譯成中間代碼位元組碼文件。
編譯時,編譯器(java.exe)首先讀入 java 源代碼,然後進行語法檢查,如果出現問題就終止編譯。語法檢查通過後,生成中間代碼即位元組碼。
位元組碼文件是一種和任何具體機器環境及操作系統環境無關的中間代碼,它是一種二進制文件,是Java源文件由Java編譯器編譯後生成的目標代碼文件。
編譯器編譯生成與平台無關的位元組碼文件後,提供給 JVM (Java虛擬機)執行。
⑼ 在國內從事C/C++編譯器的開發有發展前景嗎
我給你講講我的經歷。 我大概十年工作經驗,大概五年c++編譯器前端經驗(在兩家500強做靜態分析),四五年項目管理和品質過程改善經驗。其他主流語言都會用,實現的大概方式也明白。 前一段時間找工作,投了二十幾個c++職位一個電話都沒有。唯一的面試是朋友內推的阿里的項目管理專家。跑去面試,悲催,直接換崗成p5-p6的測試來面試,問了幾個測試問題直接讓我回家了(順便吐槽一下,他們對於測試過程感覺還沒問到點上) 最後的結局就是,沒人要,轉行去製造加工業了。我總結一下為什麼找不到工作(可能只是我偏頗的認識:一是這行需求太少,二是hr根本不知道你是幹嘛的,三是做這行的根本不好意思寫精通c++。
⑽ 編譯器是什麼
電腦是不會直接讀取你的程序的,就算是匯編也不會,它只會讀010101,而編譯器就承擔了把你的程序轉換成二進制,也就是電腦看的懂得樣子,有些編譯器還允許設置中間語言,比如,我把c++的程序編譯,中間語言是匯編語言,它會先轉換成匯編語言,再轉換成機器語言,不求採納,點個贊就好了