程序在編譯階段做了什麼事
㈠ 精品賞析:一個.NET程序在編譯和運行時都做了些什麼
run-time)和運行原理 (CPU-specific binary or pseudo-code)的疑問。 這里是一個簡單的回答:當你編譯一個C#應用程序或任何一種CLS(Commmon Language Specification)兼容的語言時,它將首先被編譯成一種稱為IL (Intermediate Language)的偽代碼(pseudo-code)。在這個應用程序第一次 被運行的時候,這種IL代碼將被編譯成機器代碼,用於執行。也就是說從源代碼 到得到運行結果,進行了兩次編譯。事實上,只有那些被真正使用的函數代碼 才會被進行第二次編譯。下面揭示開發過程中被隱藏起來的細節: 1) 你用C#開發一些程序 2) 用C#編譯器或CLS兼容的編譯器編譯成EXE 3) 編譯器將生成的IL代碼和附加信息(manifest)放入擁有一個標准PE頭的Win32 可執行文件的只讀部分。 4) 編譯器在創建這個可執行文件時導入(import)一個名為_CorExeMain的函數。 這個函數是.NET EE(execution engine)--.NET運行期引擎的入口函數。 5) 當執行這個Win32可執行文件時,因為其主要是依賴於DLL的PE文件,操作系 統將會調用位於MSCorEE.DLL中的_CorExeMain函數。 6) 操作系統通過PE文件里的進入點,調用MSCorEE.DLL。並能保證在Windows里 可以有很多程序同時運行。 7) 因為操作系統不能執行.NET IL代碼,EXE里的進入點只是簡單的中介,它將 指示操作系統調用_CorExeMain函數。 8) 隨後_CorExeMain函數開始解釋位於PE文件中的IL代碼。 9) 因為IL是不能被直接執行的, .NET EE使用稱為JITter (Just In Time compiler) 這一即時編譯過程只在第
㈡ 程序編譯連接的過程中各幹了什麼事情
呵呵,樓主應該看看《編譯原理》。
我的空間里的一篇日誌或許對樓主也有幫助。
鏈接是把程序代碼與所需要的其他目標代碼,或函數庫,Run-time 庫連接在一起。
比如 printf,程序代碼里沒有它內部實現的代碼,只是說要調用這個功能。
連接程序會把它內部實現代碼從 Run-time 庫里提出來,放在一起,這樣程序才可以單獨執行。
對於使用了第三方函數庫的代碼來說,鏈接程序同樣會在第三方函數庫中提取相關內容,加在一個可執行文件(Exe 或其他)中。
另外,一些比較大的程序,可能會分若干個文件,它們互相調用彼此的函數。可以獨立編譯成若干個目標代碼。如果這些函數有的缺失了,編譯也可以通過。
這樣做的好處是,對於大型程序,分成若幹部分分別編譯,加快了編譯過程。同時,減少每個源碼文件的行數。
比如,寫一個計算程序。後台計算有一個文件,可以編譯成功。前台界面有一個文件,也可以編譯成功。它們分辨編譯成兩個不同的目標代碼文件(obj 或其他)
然後經過鏈接過程
這個例子的話,可以認為有這個式子:
前台.obj + 後台.obj + .... + 第三方函數庫 + Run-time 庫 = Exe
鏈接的時候,才會檢查這種相互依賴是否完整。
比如前台部分是否使用了有些函數,而這些函數在後台處理模塊中並不存在?或者忘記寫這個函數了?
或者是否調用了一個後台函數,而這個函數的參數與調用的時候根本不一致?
發生這些情況時,才會給出鏈接警告和錯誤。
㈢ C語言文件的編譯與執行的四個階段並分別描述
開發C程序有四個步驟:編輯、編譯、連接和運行。
任何一個體系結構處理器上都可以使用C語言程序,只要該體系結構處理器有相應的C語言編譯器和庫,那麼C源代碼就可以編譯並連接到目標二進制文件上運行。
1、預處理:導入源程序並保存(C文件)。
2、編譯:將源程序轉換為目標文件(Obj文件)。
3、鏈接:將目標文件生成為可執行文件(EXE文件)。
4、運行:執行,獲取運行結果的EXE文件。
(3)程序在編譯階段做了什麼事擴展閱讀:
將C語言代碼分為程序的幾個階段:
1、首先,源代碼文件測試。以及相關的頭文件,比如stdio。H、由預處理器CPP預處理為.I文件。預編譯的。文件不包含任何宏定義,因為所有宏都已展開,並且包含的文件已插入。我歸檔。
2、編譯過程是對預處理文件進行詞法分析、語法分析、語義分析和優化,生成相應的匯編代碼文件。這個過程往往是整個程序的核心部分,也是最復雜的部分之一。
3、匯編程序不直接輸出可執行文件,而是輸出目標文件。匯編程序可以調用LD來生成可以運行的可執行程序。也就是說,您需要鏈接大量的文件才能獲得「a.out」,即最終的可執行文件。
4、在鏈接過程中,需要重新調整其他目標文件中定義的函數調用指令,而其他目標文件中定義的變數也存在同樣的問題。
㈣ 編譯程序的工作過程一般可以劃分為哪5個基本階段,還自始至終伴隨進行哪兩項工作
1、編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;中間代碼生成;代碼優化;目標代碼生成。
2、編譯程序的工作過程一般自始至終伴隨進行信息表管理和出錯處理兩項工作。
主要是進行詞法分析和語法分析,又稱為源程序分析,分析過程中發現有語法錯誤,給出提示信息。
(4)程序在編譯階段做了什麼事擴展閱讀:
解釋程序是一種語言處理程序,在詞法、語法和語義分析方面與編譯程序的工作原理基本相同,但在運行用戶程序時,它直接執行源程序或源程序的內部形式(中間代碼)。因此,解釋程序並不產生目標程序,這是它和編譯程序的主要區別。解釋程序的工作過程如下:
1、由總控程序完成初始化工作。
2、依次從源程序中取出一條語句進行語法檢查,如有錯,輸出錯誤信息;如果通過了語法檢查,則根據語句翻澤成相應的指令並執行它。
3、檢查源程序是否已經全部解釋執行完畢,如果未完成則繼續解釋並執行下一條語句,直到全部語句都處理完畢。
㈤ C語言源程序的編譯過程包括哪三個階段
編譯:將源程序轉換為擴展名為.obj的二進制代碼
連接:將obj文件進行連接,加入庫函數等生成可執行文件
運行:執行可執行文件,有錯返回修改,無錯結束
㈥ 描述一般的編譯程序可分為哪些階段,每個階段的目的是什麼
其目的是保證標識符和常數的正確使用,把必要的信息...綜合部分 綜合階段必須根據符號表和中間語言程序產生...目標程序質量,也可以把一個邏輯步驟的工作分為幾遍.
㈦ 計算機編譯程序主要是做什麼工作
編譯程序就是將高級語言程序設計語言源程序翻譯成計算機可執行代碼的軟體
㈧ 程序的編譯期,鏈接期, 運行期各執行哪些操作
參考一下:
源文件的編譯過程包含兩個主要階段,而它們之間的轉換是自動的。第一個階段是預處理階段,在正式的編譯階段之前進行。預處理階段將根據已放置在文件中的預處理指令來修改源文件的內容。#include指令就是一個預處理指令,它把頭文件的內容添加到.cpp文件中還有其他許多預處理指令
這個在編譯之前修改源文件的方式提供了很大的靈活性,以適應不同的計算機和操作系統環境的限制。一個環境需要的代碼跟另一個環境所需的代碼可能有所不同,因為可用的硬體或操作系統是不同的。在許多情況下,可以把用於不同環境的代碼放在同一個文件中,再在預處理階段修改代碼,使之適應當前的環境。
預處理器顯示為一個獨立的操作,但一般不能獨立於編譯器來執行這個操作。調用編譯器會自動執行預處理過程,之後才編譯代碼。
編譯器為給定源文件輸出的是機器碼,執行這個過程需要較長時間。在對象文件之間並沒有建立任何連接。對應於某個源文件的對象文件包含在其他源文件中定義的函數引用或其他指定項的引用,而這些函數或項仍沒有被解析。同樣,也沒有建立同庫函數的鏈接。實際上,這些函數的代碼並不是文件的一部分。這些工作是由鏈接程序(有時稱為鏈接編輯器)完成的
鏈接程序把所有對象文件中的機器碼組合在一起,並解析它們之間的交叉引用。它還集成了對象模塊所使用的庫函數的代碼。這是鏈接程序的一種簡化表示,因為這里假定在可執行模塊中,模塊之間的所有鏈接都是靜態建立的。實際上有些鏈接是動態的,即這些鏈接是在程序執行時建立的。
鏈接程序靜態地建立函數之間的鏈接,即在程序執行之前建立組成程序的源文件中所包含的函數鏈接。動態建立的函數之間的鏈接(在程序執行過程中建立的鏈接)將函數編譯並鏈接起來,創建另一種可執行模塊—— 動態鏈接庫或共享庫。動態鏈接庫中的函數鏈接是在程序調用函數時才建立的,在程序調用之前,該鏈接是不存在的。
動態鏈接庫有幾個重要的優點。一個主要的優點是動態鏈接庫中的函數可以在幾個並行執行的程序之間共享,這將節省相同函數佔用的內存空間。另一個優點是動態鏈接庫在調用其中的函數之前是不會載入到內存中的。也就是說,如果不使用給定動態鏈接庫中的函數,該動態鏈接庫就不會佔用內存空間
㈨ 說說java文件編譯時都做了哪些事情
java有反射機制,執行編譯時會嘗試找到JRE安裝所在目錄,然後找到jvm.dll,接著啟動JVM進行初始化動作,產生3個類載入器,用來將所用到的類文件載入到內存中,會自動導入java.lang下的類文件和你想導入的類文件,查看你的代碼中是否有未處理的可控式異常,JVM會查看你寫的代碼是否符合語法,.JVM會將你所寫的java文件編譯為與系統平台無關的位元組碼文件。
㈩ 什麼是編譯程序 編譯程序的工作過程
編譯程序是變成語言在計算機上面運行的一種方式。
比如你現在編寫(編譯型語言)了你個程序文件並要運行它,但是計算機是不認識這個文件裡面的東西的(其實計算機只認識0和1這樣的數字),所以這里就需要把你自己寫的程序文件翻譯一遍,翻譯過後並生成一個計算機能夠識別的文件,把你原來的源文件翻譯成計算機能夠識別的文件的過程就叫編譯,其實計算機運行的真正文件是編譯過後的編譯文件。