當前位置:首頁 » 網頁前端 » 電腦前端編譯器
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

電腦前端編譯器

發布時間: 2022-06-09 02:33:54

A. 什麼是編譯器

編譯器

編譯器是一種特殊的程序,它可以把以特定編程語言寫成的程序變為機器可以運行的機器碼。我們把一個程序寫好,這時我們利用的環境是文本編輯器。這時我程序把程序稱為源程序。在此以後程序員可以運行相應的編譯器,通過指定需要編譯的文件的名稱就可以把相應的源文件(通過一個復雜的過程)轉化為機器碼了。

[編輯]編譯器工作方法
首先編譯器進行語法分析,也就是要把那些字元串分離出來。然後進行語義分析,就是把各個由語法分析分析出的語法單元的意義搞清楚。最後生成的是目標文件,我們也稱為obj文件。再經過鏈接器的鏈接就可以生成最後的可執行代碼了。有些時候我們需要把多個文件產生的目標文件進行鏈接,產生最後的代碼。我們把一過程稱為交叉鏈接。

一個現代編譯器的主要工作流程如下:

* 源程序(source code)→預處理器(preprocessor)→編譯器(compiler)→匯編程序(assembler)→目標程序(object code)→連接器(鏈接器,Linker)→可執行程序(executables)

工作原理

編譯是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器言)。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。

典型的編譯器輸出是由包含入口點的名字和地址以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的可執行程序。

編譯器種類

編譯器可以生成用來在與編譯器本身所在的計算機和操作系統(平台)相同的環境下運行的目標代碼,這種編譯器又叫做「本地」編譯器。另外,編譯器也可以生成用來在其它平台上運行的目標代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬體平台時非常有用。「源碼到源碼編譯器」是指用一種高級語言作為輸入,輸出也是高級語言的編譯器。例如: 自動並行化編譯器經常採用一種高級語言作為輸入,轉換其中的代碼,並用並行代碼注釋對它進行注釋(如OpenMP)或者用語言構造進行注釋(如FORTRAN的DOALL指令)。

預處理器(preprocessor)

作用是通過代入預定義等程序段將源程序補充完整。

編譯器前端(frontend)

前端主要負責解析(parse)輸入的源程序,由詞法分析器和語法分析器協同工作。詞法分析器負責把源程序中的『單詞』(Token)找出來,語法分析器把這些分散的單詞按預先定義好的語法組裝成有意義的表達式,語句 ,函數等等。 例如「a = b + c;」前端詞法分析器看到的是「a, =, b , +, c;」,語法分析器按定義的語法,先把他們組裝成表達式「b + c」,再組裝成「a = b + c」的語句。 前端還負責語義(semantic checking)的檢查,例如檢測參與運算的變數是否是同一類型的,簡單的錯誤處理。最終的結果常常是一個抽象的語法樹(abstract syntax tree,或 AST),這樣後端可以在此基礎上進一步優化,處理。

編譯器後端(backend)

編譯器後端主要負責分析,優化中間代碼(Intermediate representation)以及生成機器代碼(Code Generation)。

一般說來所有的編譯器分析,優化,變型都可以分成兩大類: 函數內(intraproceral)還是函數之間(interproceral)進行。很明顯,函數間的分析,優化更准確,但需要更長的時間來完成。

編譯器分析(compiler analysis)的對象是前端生成並傳遞過來的中間代碼,現代的優化型編譯器(optimizing compiler)常常用好幾種層次的中間代碼來表示程序,高層的中間代碼(high level IR)接近輸入的源程序的格式,與輸入語言相關(language dependent),包含更多的全局性的信息,和源程序的結構;中層的中間代碼(middle level IR)與輸入語言無關,低層的中間代碼(Low level IR)與機器語言類似。 不同的分析,優化發生在最適合的那一層中間代碼上。

常見的編譯分析有函數調用樹(call tree),控制流程圖(Control flow graph),以及在此基礎上的變數定義-使用,使用-定義鏈(define-use/use-define or u-d/d-u chain),變數別名分析(alias analysis),指針分析(pointer analysis),數據依賴分析(data dependence analysis)等等。

上述的程序分析結果是編譯器優化(compiler optimization)和程序變形(compiler transformation)的前提條件。常見的優化和變新有:函數內嵌(inlining),無用代碼刪除(Dead code elimination),標准化循環結構(loop normalization),循環體展開(loop unrolling),循環體合並,分裂(loop fusion,loop fission),數組填充(array padding),等等。優化和變形的目的是減少代碼的長度,提高內存(memory),緩存(cache)的使用率,減少讀寫磁碟,訪問網路數據的頻率。更高級的優化甚至可以把序列化的代碼(serial code)變成並行運算,多線程的代碼(parallelized,multi-threaded code)。

機器代碼的生成是優化變型後的中間代碼轉換成機器指令的過程。現代編譯器主要採用生成匯編代碼(assembly code)的策略,而不直接生成二進制的目標代碼(binary object code)。即使在代碼生成階段,高級編譯器仍然要做很多分析,優化,變形的工作。例如如何分配寄存器(register allocatioin),如何選擇合適的機器指令(instruction selection),如何合並幾句代碼成一句等等。

B. 一個編譯器至少包含三個部分的進程是什麼

一個典型的編譯程序通常包含8個組成部分,它們是詞法分析程序、語法分析程序、語義分析程序、中間代碼生成程序、中間代碼優化程序、目標代碼生成程序、表格管理程序和錯誤處理程序。
(1) 編譯程序:如果源語言為高級語言,目標語言為某台計算機上的匯編語言或機器語

言,則此翻譯程序稱為編譯程序。

(2) 源程序:源語言編寫的程序稱為源程序。

(3) 目標程序:目標語言書寫的程序稱為目標程序。

(4) 編譯程序的前端:它由這樣一些階段組成:這些階段的工作主要依賴於源語言而與

目標機無關。通常前端包括詞法分析、語法分析、語義分析和中間代碼生成這些階

段,某些優化工作也可在前端做,也包括與前端每個階段相關的出錯處理工作和符

號表管理等工作。

(5) 後端:指那些依賴於目標機而一般不依賴源語言,只與中間代碼有關的那些階段,

即目標代碼生成,以及相關出錯處理和符號表操作。

(6) 遍:是對源程序或其等價的中間語言程序從頭到尾掃視並完成規定任務的過程。

詞法分析程序:輸人源程序,拼單詞、檢查單詞和分析單詞,輸出單詞的機內表達形式。

語法分析程序:檢查源程序中存在的形式語法錯誤,輸出錯誤處理信息。

語義分析程序:進行語義檢查和分析語義信息,並把分析的結果保存到各類語義信息表中。

中間代碼生成程序:按照語義規則,將語法分析程序分析出的語法單位轉換成一定形式的中間語言代碼,如三元式或四元式。

中間代碼優化程序:為了產生高質量的目標代碼,對中間代碼進行等價變換處理

C. 適合win10系統的c語言編譯器

桌面操作系統

對於當前主流桌面操作系統而言,可使用 VisualC++、GCC以及 LLVM Clang 這三大編譯器。

Visual C++(簡稱 MSVC)只能用於 Windows 操作系統;GCC 和 LLVM Clang除了可用於Windows操作系統之外,主要用於 Unix/Linux操作系統。

像現在很多版本的 Linux 都默認使用 GCC 作為C語言編譯器,而像 FreeBSD、macOS 等系統默認使用 LLVM Clang 編譯器。由於當前 LLVM 項目主要在 Apple 的主推下發展的,所以在 macOS中,Clang 編譯器又被稱為 Apple LLVM 編譯器。

MSVC 編譯器主要用於 Windows 操作系統平台下的應用程序開發,它不開源。用戶可以使用 Visual Studio Community 版本來免費使用它,但是如果要把通過 Visual Studio Community 工具生成出來的應用進行商用,那麼就得好好閱讀一下微軟的許可證和說明書了。

而使用 GCC 與 Clang 編譯器構建出來的應用一般沒有任何限制,程序員可以將應用程序隨意發布和進行商用。

MSVC 編譯器對 C99 標準的支持就十分有限,加之它壓根不支持任何 C11 標准,所以本教程中設計 C11 的代碼例子不會針對 MSVC 進行描述。所幸的是,Visual Studio Community 2017 加入了對 Clang 編譯器的支持,官方稱之為——Clang with Microsoft CodeGen,當前版本基於的是 Clang 3.8。

也就是說,應用於 Visual Studio 集成開發環境中的 Clang 編譯器前端可支持 Clang 編譯器的所有語法特性,而後端生成的代碼則與 MSVC 效果一樣,包括像 long 整數類型在 64 位編譯模式下長度仍然為 4 個位元組,所以各位使用的時候也需要注意。

為了方便描述,本教程後面涉及 Visual Studio 集成開發環境下的 Clang 編譯器簡稱為 VS-Clang 編譯器。

嵌入式系統

而在嵌入式系統方面,可用的C語言編譯器就非常豐富了,比如:

  • 用於 Keil 公司 51 系列單片機的 Keil C51 編譯器;

  • 當前大紅大紫的 Arino 板搭載的開發套件,可用針對 AVR 微控制器的 AVRGCC 編譯器;

  • ARM 自己出的 ADS(ARM Development Suite)、RVDS(RealView Development Suite)和當前最新的 DS-5 Studio;

  • DSP 設計商 TI(Texas Instruments)的 CCS(Code Composer Studio);

  • DSP 設計商 ADI(Analog Devices,Inc.)的 Visual DSP++ 編譯器,等等。


  • 通常,用於嵌入式系統開發的編譯工具鏈都沒有免費版本,而且一般需要通過國內代理進行購買。所以,這對於個人開發者或者嵌入式系統愛好者而言是一道不低的門檻。


  • 不過 Arino 的開發套件是可免費下載使用的,並且用它做開發板連接調試也十分簡單。Arino 所採用的C編譯器是基於 GCC 的。


  • 還有像樹莓派(Raspberry Pi)這種迷你電腦可以直接使用 GCC 和 Clang 編譯器。此外,還有像 nVidia 公司推出的 Jetson TK 系列開發板也可直接使用 GCC 和 Clang 編譯器。樹莓派與 Jetson TK 都默認安裝了 Linux 操作系統。


  • 在嵌入式領域,一般比較低端的單片機,比如 8 位的 MCU 所對應的C編譯器可能只支持 C90 標准,有些甚至連 C90 標準的很多特性都不支持。因為它們一方面內存小,ROM 的容量也小;另一方面,本身處理器機能就十分有限,有些甚至無法支持函數指針,因為處理器本身不包含通過寄存器做間接過程調用的指令。


  • 而像 32 位處理器或 DSP,一般都至少能支持 C99 標准,它們本身的性能也十分強大。而像 ARM 出的 RVDS 編譯器甚至可用 GNU 語法擴展。


  • 下圖展示了上述C語言編譯器的分類。


D. 編譯器前端開發

編譯器粗略分為詞法分析,語法分析,類型檢查,中間代碼生成,代碼優化,目標代碼生成,目標代碼優化。把中間代碼生成及之前階段劃分問編譯器的前端,那麼後端與前端是獨立的。後端只需要一種中間代碼表示,可以是三地址代碼或四元式等,而這些都與前端生成的方式無關。也就是不論你前端是用fortran還是c/c++,只要生成了中間代碼表示就可以了,後端是不管你是用哪種語言生成的。

E. 編譯器的工作原理

編譯 是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器語言)的翻譯過程。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。
典型的編譯器輸出是由包含入口點的名字和地址, 以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的EXE,
所以我們電腦上的文件都是經過編譯後的文件。

F. 前端需要編譯器嗎vscode這個不是編譯器嗎

編譯器就是將「一種語言(通常為高級語言)」翻譯為「另一種語言(通常為低級語言)」的程序。一個現代編譯器的主要工作流程:源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 目標代碼 (object code) → 鏈接器 (Linker) → 可執行程序 (executables)

從這個意義上來說,前端是沒有編譯器的,但是會有開發環境(IDE)一說,前端雖然是純文本,可以用普通的記事本或者editplus之類來的編輯,但會缺少象語法補全、代碼格式化、腳本調試、語法高亮這些功能,所以才會需要有這些功能的IDE存在,vscode不是編譯器,它只是一個代碼編輯器,僅就前端來說,如果不用vscode,也可以用象hbuilderX這類軟體。

G. Web前端開發一般用什麼編譯器

collection.find().toArray(function(err,docs){
console.log(docs);
//將數據顯示到網頁上
// console.log('1'+docs[0].name);
// $('#question').append('<div>'+docs+'</div>');
// document.getElementById("editLevels").value =docs;

H. 學python用什麼編譯器啊,哪位大佬推薦一下

1、CPython
是Python語言規范的參考實現,能夠優先獲得Python語言的最新、最強的功能,CPython是由C語言編寫而成,不但可以從Python代碼中調用C代碼的函數,還可以直接在Python中使用大量現有的C代碼庫。
2、Brython
Brython可用於在瀏覽器中運行包含了Python 3腳本的Web應用。
3、PyPy Python
雖然第一個推薦的是在Python中使用最廣泛的編譯器,但卻不是最快的,PyPy採用的是即時的編譯概念,在代碼執行前,就直接編譯為機器代碼,因此其執行速度提高了近4倍。
4、Jython或JPython
使用率第二高,Jython最初被稱為JPython,是通過Python語言來實現Java虛擬機的,開發者既可以將現有的Java包和代碼庫,導入自己的Python程序中,還可以在Java程序中嵌入Python腳本。
5、Cython
Cython與CPython不同,更像是一個超集,允許開發者在代碼中結合C和Python,從而生成C語言代碼類型的輸出,以供任何一種C/C++編譯器進行後續編譯。
6、Skulpt
流行的速度非常快,主要目的是提供一種良好的在線式Python編譯器,也可以通過讓Web應用引擎包含Skulpt,以方便開發者編寫出被用於前端的Python腳本。
7、PyJS
是另一款完全用Python去開發Web應用的編譯工具,在後台,PyJS會在使用內置的Ajax框架之前,將Python代碼編譯為JavaScript。
8、WinPython
是Python的"即用型"發行版,也就意味著用戶無需安裝,即可在Windows PC上運行,作為另一種Python的實現,WinPython編譯器不僅帶來了Python執行環境,而且還包含了諸如:Scipy、Numpy、以及Pandas等各種Python庫。

I. 現在比較好用的前端開發工具有哪些啊

1. node.js + npm, 這個是前端工具的一個平台,沒有他們就沒有以下的工具,建立開發環境,下載開發工具,運行開發工具的利器
2. bower, 庫依賴管理器,類似於npm,但針對瀏覽器JavaScript的依賴管理,減少尋找庫,下載庫和升級庫的煩惱
3.grunt,流程自動化管理工具,將你非編程的開發步驟減到最小,grunt watch+liveReload或者grunt connect,可以使得免除你F5無盡地獄,發布和開發各種無壓力。以下大部分開發工具,都有grunt的相對應的插件,也就是說他們都能利用grunt進行自動化運行
5. 本人用less比較多,因為基本無縫兼容歷史遺留系統中的css,(而Sass語法比較特殊,還沒有專門用過,應該開發新系統的css比較好),一套css預編譯語言,可以把less語法轉成css語法,lessc是less語言編譯器,配合grunt less,編寫大型css文檔毫無壓力。

6.Phantomjs,沒有界面的瀏覽器,用js腳本控制其操作網頁。測試,抓圖,網頁流程自動化利器。配合casperjs的語法簡化功能真強庫後,控制Phantomjs就更加容易了
7. grunt PhotoBox, 利用phantomjs抓圖功能和ImageMagick圖片比較功能,在利用live-reload即時刷新功能,可以讓你開發css的時候,快速對n多個頁面進行觀察,看其前後變化。不過缺點也比較明顯,就是速度慢。但比起手動對比來看,還是非常快的。值得css開發時擁有
8. phantomCSS,這個和grunt photobox類似,都用於css開發的,差別是photobox是全局觀察差別,而這個是單元組件觀察差別,它方便你就抓頁面中某一塊元素然後進行前後比較,更加註重細節上的差異,這個比較合適組件開發時候使用。
9. jshint,幫助你快速定位JavaScript的語法錯誤和潛在的跨瀏覽器兼容性問題。在部署你JS前,用jshint檢查一下是沒錯的 。
10.UglifyJS,壓縮JavaScript代碼,使你的JS代碼可以更加快速的載入。有grunt的插件
11. browserify允許你在瀏覽器裡面使用CMD標准模塊,但本人認為它的另外一個優勢是合並代碼,開發時候可以把代碼模塊化,分成很多很多小文件,然後有調理的放到相對應文件夾下,然後最後合成單一文件。本人曾經利用browserify開發greasemonkey代碼,大大簡化了greasemonkey的開發難度和增強了greasemonkey代碼的質量。browserify有grunt插件,這樣又減少的開發步驟。
12. Karma, google開發的一個單元測試運行器,這個自己本身不是一個單元測試框架,而是配合測試單元框架的一個工具。由於前端瀏覽器眾多,就算你有live-reload這樣自動化工具,但是還是要手動打開各種瀏覽器,手動把你的單元測試在各個瀏覽器都運行一遍。這個工具目的是目的就是讓電腦能自動化打開各種瀏覽器,然後把單元測試在各個瀏覽器中自動運行一遍,讓這個步驟也能自動化了。
13.clean-css (grunt cssmin), 我用的是grunt cssmin,但是grunt cssmin實際上背後使用的是clean-css工具,這個工具就是用來壓縮精簡css的,讓css文件大小更小。

J. web前端開發用什麼編譯器

collection.find().toArray(function(err,docs){
console.log(docs);
//將數據顯示到網頁上
// console.log('1'+docs[0].name);
// $('#question').append('<div>'+docs+'</div>');
// document.getElementById("editLevels").value =docs;