當前位置:首頁 » 編程軟體 » 同樣的代碼比較編譯器才有意義

同樣的代碼比較編譯器才有意義

發布時間: 2023-09-13 09:48:14

編譯器有什麼用

簡單講,編譯器就是將「一種語言(通常為高級語言)」翻譯為「另一種語言(通常為低級語言)」的程序。一個現代編譯器的主要工作流程:源代碼 (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)。

② 同樣一段代碼,為什麼編譯器不同會不同結果

這很正常,每種語言的標准只是給出了該語言實現的最小集合,而廠家或者開源社區做編譯器的時候,只要遵循這些標准就可以,在此基礎上增加的非標准功能,就有可能不一致了。

③ 編譯器和解釋器的主要區別是什麼他們相對於對方各自的優點

解釋器是解釋執行的源代碼,編譯器是將源代碼編譯成目標代碼

他們最大的區別是程序運行時需要解釋器邊解釋邊執行,而編譯器則在運行時是完全不需要的

解釋器的優點是比較容易讓用戶實現自己跨平台的代碼,比如java,php等,同一套代碼可以在幾乎所有的操作系統上執行,而無需根據操作系統做修改;
編譯器的目的就是生成目標代碼再由連接器生成可執行的機器碼,這樣的話需要根據不同的操作系統編制代碼,雖然有像Qt這樣的源代碼級跨平台的編程工具庫,但在不同的平台上仍然需要重新編譯連接成可執行文件,但其執行效率要遠遠高於解釋運行的程序。
編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;
而解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯後的程序運行的快的.
這是因為計算機不能直接認識並執行我們寫的語句,它只能認識機器語言(是二進制的形式)

④ java源代碼為什麼要編譯

你現在電腦里的文件是文檔文件確切的說在計算機里也是0和1的序列 但是他和執行程序不是一

個類型的文件 文件是由類型的比如說mp3 是播放聲音的 MP4是播放視屏的 TXT是文檔文件

就是存儲文檔的 在回到問題

.java文件其實就和TXT文件一樣是文檔文件是用來存儲你寫的代碼的

他是拿來給你人看的

你要想讓他變成其可執行程序的文件你就得通過編譯器編譯它

編譯器是按照你寫的代碼把他們翻譯成可執行文件的編碼方式

然後你就可以運行它了

在計算機看來所有的文件都是0和1的組合 應為文件的類型的不同它會用不同的方式解讀它們

具體的java程序。編譯。運行等等環節怎麼完成怎麼解釋 你得慢慢了解 或者有時間我在給你解釋解釋

寫的比較亂 你湊合著看吧

⑤ C語言同一段代碼,同樣的文件,編譯器為什麼運行結果不一樣

一般來說,C語言程序被編譯為可執行程序後,每次都輸出都是相同的,但有些特殊情況例外,比如,代碼中引入了隨機變數,並讓它出現在輸出結果中。

⑥ 同樣需要編譯器為什麼匯編語言比較快

絕大多數情況下,並不是。

事實上除了對CPU工作模式極端熟悉的人,一般人是很難用匯編寫出更高效的代碼的。
編譯器雖然智商比不了人,但是它更精通優化。生成高效的代碼需要透徹地掌握硬體的工作模式,每個細節都要考慮清楚。而且這很大程度上是軟體更擅長但人並不擅長的繁重無腦又要求極高精確性的機械化工作。

當然專業搞優化的人還是能打敗編譯器的,因為編譯器能做到的人終究還是可以做到。而人要比編譯器聰明得多。編譯器只能遵循一些規定好的模式進行優化,人可以創造編譯器根本不知道的優化方法。某些邏輯靠編譯器是沒辦法生成出來的,只能由人直接用匯編寫。匯編語言雖然也要編譯,但是一般會和機器指令直接對應,相當於要求CPU在細節上嚴格按人的思路工作,而高級語言並不能控制太多細節。

⑦ 同樣的一段程序,CCS 和 IAR 編譯運行的結果不同

優化舉個簡單例子:int
i;i=1;i=2;i=3;i=4;i=5;i=6;i=7;i=8;i=9;i=10;這段代碼會被直接優化成
i=10;連續10次給i賦值,只有最後一次才有意義。前面的賦值沒有意義,會被直接優化掉。如果後面i也沒有被使用,則變數i本身沒有意義,直接優化掉。最後編譯出來的代碼就是空。進一步,把上面的賦值換成循環int
i;for(i=1;i<10;i++);這段代碼也會被優化成i=10;循環相當於連續給i賦值9次,循環裡面i的值是多少,是沒有意義的,最後循環退出時的i值才有意義,相當於最後一次的賦值i=10;如果後面的程序沒有用到i,則變數i本身沒有意義,直接優化掉。最後編譯出來的代碼就是空。謹記:空循環是沒有意義的,有點優化能力的編譯器,都會將空循完全環優化掉。如果需要延時,請加上volatile,或者調用編譯器的延時函數,或者用編譯參數禁止優化,或者使用內嵌匯編。總之,不要使用沒有volatile的空循環帶實現延時,這是不規范的。

熱點內容
微信清除朋友圈緩存 發布:2024-11-19 10:32:08 瀏覽:138
3ds編程 發布:2024-11-19 10:31:14 瀏覽:229
mac如何修改賬戶密碼變成普通用戶 發布:2024-11-19 10:23:05 瀏覽:875
接龍源碼 發布:2024-11-19 10:14:48 瀏覽:33
驅動軟體哪個安卓版好 發布:2024-11-19 10:08:28 瀏覽:703
伺服器一鍵搭建java環境 發布:2024-11-19 10:08:27 瀏覽:729
布丁少兒編程 發布:2024-11-19 09:57:11 瀏覽:98
vb資料庫數組 發布:2024-11-19 09:23:40 瀏覽:828
安卓游戲數據保存在哪裡找 發布:2024-11-19 09:22:02 瀏覽:310
解壓出來的文件亂碼 發布:2024-11-19 09:15:40 瀏覽:940