㈠ 程序的編譯期,鏈接期, 運行期各執行哪些操作
參考一下:
源文件的編譯過程包含兩個主要階段,而它們之間的轉換是自動的。第一個階段是預處理階段,在正式的編譯階段之前進行。預處理階段將根據已放置在文件中的預處理指令來修改源文件的內容。#include指令就是一個預處理指令,它把頭文件的內容添加到.cpp文件中還有其他許多預處理指令
這個在編譯之前修改源文件的方式提供了很大的靈活性,以適應不同的計算機和操作系統環境的限制。一個環境需要的代碼跟另一個環境所需的代碼可能有所不同,因為可用的硬體或操作系統是不同的。在許多情況下,可以把用於不同環境的代碼放在同一個文件中,再在預處理階段修改代碼,使之適應當前的環境。
預處理器顯示為一個獨立的操作,但一般不能獨立於編譯器來執行這個操作。調用編譯器會自動執行預處理過程,之後才編譯代碼。
編譯器為給定源文件輸出的是機器碼,執行這個過程需要較長時間。在對象文件之間並沒有建立任何連接。對應於某個源文件的對象文件包含在其他源文件中定義的函數引用或其他指定項的引用,而這些函數或項仍沒有被解析。同樣,也沒有建立同庫函數的鏈接。實際上,這些函數的代碼並不是文件的一部分。這些工作是由鏈接程序(有時稱為鏈接編輯器)完成的
鏈接程序把所有對象文件中的機器碼組合在一起,並解析它們之間的交叉引用。它還集成了對象模塊所使用的庫函數的代碼。這是鏈接程序的一種簡化表示,因為這里假定在可執行模塊中,模塊之間的所有鏈接都是靜態建立的。實際上有些鏈接是動態的,即這些鏈接是在程序執行時建立的。
鏈接程序靜態地建立函數之間的鏈接,即在程序執行之前建立組成程序的源文件中所包含的函數鏈接。動態建立的函數之間的鏈接(在程序執行過程中建立的鏈接)將函數編譯並鏈接起來,創建另一種可執行模塊—— 動態鏈接庫或共享庫。動態鏈接庫中的函數鏈接是在程序調用函數時才建立的,在程序調用之前,該鏈接是不存在的。
動態鏈接庫有幾個重要的優點。一個主要的優點是動態鏈接庫中的函數可以在幾個並行執行的程序之間共享,這將節省相同函數佔用的內存空間。另一個優點是動態鏈接庫在調用其中的函數之前是不會載入到內存中的。也就是說,如果不使用給定動態鏈接庫中的函數,該動態鏈接庫就不會佔用內存空間
㈡ 條件編譯問題
一般情況下,源程序中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是「條件編譯」。有時,希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。
編譯是在運行前執行的,比如說只是if else語句可能運行時 有些語句可能就沒執行,但在編譯階段它們都經行了編譯。
而像你上面的#if #else 則不同 #if NNN 就是指當NNN標示符已經定義過則對程序段statement1進行編譯,而statement2和statement3則跳過了。
你可能會問:不用條件編譯命令而直接用if語句也能達到要求,用條件編譯命令有什麼好處呢?的確,此問題完全可以不用條件編譯處理,但那樣做目標程序長(因為所有語句都編譯),而採用條件編譯,可以減少被編譯的語句,從而減少目標的長度。當條件編譯段比較多時,目標程序長度可以大大減少。
㈢ python編譯時間長
沒有尾遞歸優化。
因為某些編譯型語言(如C)的編譯器有尾遞歸優化,所以遞歸演算法效率並不低。但是python並沒有尾遞歸優化。
Python是一種廣泛使用的解釋型、高級和通用的編程語言。[1]Python由荷蘭數學和計算機科學研究學會的GuidovanRossum創造,第一版發布於1991年,它是ABC語言的後繼者,也可以視之為一種使用傳統中綴表達式的LISP方言。
㈣ 單片機執行用c編譯的程序時,每執行一行語句所需要的時間是多少
不確定,這個和單片機的性能,編譯器性能,語句復雜度都有關系。
就像你不能要求1.8G的CPU運行速度和2.8G的同樣快,單片機的性能很重要。
同樣一條C語句,不同的編譯器可能翻譯成不同條數的機器碼指令,當然,一般一個單片機只認識很有限編譯器編出來的目標碼,這條基本可以忽略。
還有就是C語句是什麼語句,比如運行i++一般只需要一個指令周期,i=i+1卻最少需要三個。
所以你的問法應該是「核心頻率是XXXHz的單片機,每秒能執行多少匯編指令?」
㈤ 編譯程序大多數時間花在什麼上
編譯程序大多數時間花在目標代碼生成。
編譯程序把用高級程序設計語言書寫的源程序,翻譯成等價的機器語言格式目標程序的翻譯程序。編譯程序屬於採用生成性實現途徑實現的翻譯程序。
它以高級程序設計語言書寫的源程序作為輸入,而以匯編語言或機器語言表示的目標程序作為輸出。編譯出的目標程序通常還要經歷運行階段,以便在運行程序的支持下運行,加工初始數據,算出所需的計算結果。
編譯程序的基本功能是把源程序(高級語言)翻譯成目標程序。但是,作為一個具有實際應用價值的編譯系統,除了基本功能之外,還應具備語法檢查、調試措施、修改手段、覆蓋處理、目標程序優化、不同語言合用以及人-機聯系等重要功能。
編譯程序的實現演算法較為復雜。這是因為它所翻譯的語句與目標語言的指令不是一一對應關系,而是一多對應關系;同時也因為它要處理遞歸調用、動態存儲分配、多種數據類型,以及語句間的緊密依賴關系。
但是,由於高級程序設計語言書寫的程序具有易讀、易移植和表達能力強等特點,編譯程序廣泛地用於翻譯規模較大、復雜性較高、且需要高效運行的高級語言書寫的源程序。
㈥ 編譯程序所需要的時間和電腦的性能有關系么
有關系的
當需要編譯工程的復雜度一定的時候,電腦性能越好,編譯所需要時間越短;反之,則時間越長。
當電腦性能一定的時候,工程越復雜,則編譯所需要的時間越長;反之,則時間越短。
㈦ 在不同電腦的不同軟體上,有的int型變數佔用2個位元組,有的佔用4個位元組,這是由什麼決定的
最近在看深入理解計算機系統這本書,上面提到了在32位機器和64機器中int類型都佔用4個位元組。後來,查了The C Programming language這本書,裡面有一句話是這樣的:Each compiler is free to choose appropriate sizes for its own hardware, subject only to the restriction that shorts and ints are at least 16bits, longs are at least 32bits, and short is no longer than int, which is no longer than long.意思大致是編譯器可以根據自身硬體來選擇合適的大小,但是需要滿足約束:short和int型至少為16位,long型至少為32位,並且short型長度不能超過int型,而int型不能超過long型。這即是說各個類型的變數長度是由編譯器來決定的,而當前主流的編譯器中一般是32位機器和64位機器中int型都是4個位元組(例如,GCC)。
這個int類型的大小到底是跟編譯器有關,還是跟CPU有關,還是跟操作系統有關?
所謂的16位32位64位系統是由cpu決定的,由機器指令的定址、寄存器位數決定的
os受cpu的限制,但在32位的cpu下16位的os也可以跑(就向上面提到的所謂純dos)
很多os是向前兼容的,就是使以前的程序也能運行,如果編譯器本身是16位時代做的,那麼os會提供一個模擬16位的子環境供這個編譯器使用
int和void*長度應該是一樣的(16位的時候的20位的指針是兩個16位錯位加起來的)
非要轉牛角尖的話,int只是語言定義裡面的一個關鍵字,只對compiler可見,complier說它是幾位就是幾位,和os/cpu都沒關系
永遠都用sizeof是最安全的辦法,但sizeof只是編譯時常量,不能做到二進制兼容(移植)
說 int和void*一樣長只是因為在一般情況下它們都應該可以放到單個寄存器里,其實這樣說很不確切,還是不要這樣理解的好,說在xx位的cpu上int 是多少位只是因為這級別的cpu有對xx位數據進行操作的單條指令(因為寄存器是xx位)(可能會有擴展指令,我不清楚,但關鍵看寄存器的位數),從而編 譯器就圖個方便把int做為xx位,這也不一定的,譬如以後64位機器出來了,可能編譯器只是把long擴到64位,而int還是當作32,也挺合適的。
網上很多博客對這個有很多的解釋,感興趣可以去看看!
㈧ 什麼是編譯時間
用戶使用編譯程序對其個人編制的源程序進行編譯的過程稱為程序編譯。編譯時間(compiling time) 指編譯程序將源程序編譯成目標程序所佔用的時間。
1 如何減少編譯時間
一是執行每日自動構建。每日自動構建的原理很簡單:安裝每日構建工具CCNET(不熟悉該工具的同學可以去搜索下)。然後在源碼伺服器上安裝編譯環境。源碼伺服器每天獲取最新代碼,每天下班後開始編譯最新代碼,經過一個晚上基本上就能把庫和應用程序都編好,到了第二天開發人員只需下載最新的庫文件和代碼文件而不須自己重新編譯。這樣就能大大節省時間了。
二是使用聯合編譯器IncrediBuild。這個工具估計大家都不陌生。最近試驗了一個新想法,寫一個批處理文件,將SVN和IncrediBuild綁在一起,實現了從源碼更新到工程編譯。
2 批處理文件的命令語法
svnupinclude//更新伺服器的include文件夾到本地
BuildConsoleD:\Code\MySolution.sln/prj="MyApp"/build/OpenMonitor/cfg="Debug|Win32"
BuildConsole是IncrediBuild的命令行工具,
D:\Code\MySolution.sln是你的解決方案文件絕對路徑,
/prj參數設置你要編譯的工程,如果你要編譯多個工程,可以這樣設置,/prj="prj1,prj2,prj3",
/prj參數也支持通配符,/prj="*"即為編譯MySolution.sln下的所有工程
/build為編譯工程,若改為/rebuild即是清理重編工程。
/OpenMonitor為打開IncrediBuild的圖形化界面,去掉該參數則不出現圖形界面。
/cfg為編譯設置選項,如要編release版本,可以改為Release|Win32。
把上面的代碼保存為BuildDebug.bat,把文件保存在D:\Code\路徑下(即源碼根目錄,下面有include、src和vs三個文件夾),然後運行這個批處理文件就相當於把從更新源碼到編譯源碼這一系列動作都執行了。
㈨ 編譯器編譯的時間, 要比解釋語言運行的速度慢嗎為什麼
只能說說通常的情況,因為情況比較復雜
一般來說,編譯的語言比解釋性語言運行的速度塊
不過編譯時間的話就很難說了,和編譯器本身有關系
解釋語言可以不用專成 二進制代碼直接運行
㈩ 請問java中的編譯期和運行期有什麼區別
編譯時是調用檢查你的源程序是否有語法錯誤,如果沒有就將其翻譯成位元組碼文件。即.class文件。
運行時是java虛擬機解釋執行位元組碼文件。