先編譯後
A. 運行java程序時,為什麼要先編譯再運行,編譯運行一起進行不行嗎
java講究的是 一次編譯 處處運行,也就是提高了程序的一致性。java的程序之所在不同的操作系統上的運行結果是一樣的,是因為java虛擬機。
所以要運行java都要裝一個叫jdk的東西,裡面有java的虛擬機。這個虛擬機就是來解釋我們寫的代碼。通過這個虛擬機,就實現了代碼的移植。
我們寫好的程序,通過虛擬機,編譯成class文件,然後在運行。但是我們只需要編譯一次即可。
B. c語言源程序文件的後綴是什麼,經過編譯後生成文件的後綴是什麼經過連接後生成文件的後綴是什麼
程序文件名的後綴是.c,經過編譯後是.obj,經過連接後是.exe。
xx.h文件.h中一般放的是同名.c文件中定義的變數、數組、函數的聲明,需要讓.c外部使用的聲明。
xx.c文件.c文件一般放的是變數、數組、函數的具體定義。
1、頭文件的預編譯,預處理。
編譯器在編譯源代碼時,會先編譯頭文件,保證每個頭文件只被編譯一次。
在預處理階段,編譯器將c文件中引用的頭文件中的內容全部寫到c文件中。
2、詞法和語法分析(查錯)。
3、編譯(匯編代碼,.obj文件)。
轉化為匯編碼,這種文件稱為目標文件。後綴為.obj。
4、鏈接(二進制機器碼,.exe文件)。
將匯編代碼轉換為機器碼,生成可執行文件。
(2)先編譯後擴展閱讀
注意事項
在編譯過程中.h文件中的所有內容會被寫到包含它的.c文件中,而所有的.c文件以一個共同的main函數作為可執行程序的入口。
在.h文件中編寫函數實現依然可以正常編譯執行,相當於所有.h的內容最後都被寫到了main.c文件中。
但是為了邏輯性、易於維護性以及一些其他目的,一般在.h文件中寫函數的聲明,在.c文件中編寫函數的實現。
C. 突然想知道,為什麼有的語言需要編譯之後運行,而有的語言則不需要呢 C, ruby 請分析謝謝!
我們用的大部分程序設計語言都是高級語言,高級語言要執行,必須要先變成計算機能識別的匯編語言.將高級語言變成匯編語言的過程叫做翻譯,目前有兩種形式的翻譯方法,一種是編譯,一種是解釋.C就屬於編譯方式,執行前一定先編譯一次.而B語言就是解釋方式,解釋一條執行一條,所以執行先不需要編譯一下.
D. C++運行前要經過什麼步驟,先編譯,再鏈接最後運行
你說的沒錯。但現在的開發環境一般是集成化的,可以編譯、連接、執行一起在IDE(集成開發環境)中連續運行,不需要任何命令,滑鼠點「運行」即可。
E. 一個C語言源程序經過編譯後就可以執行了 這句話對嗎
對的,C語言是先編譯後執行,一般只要不出錯誤,編譯完就可以執行力。有時候還要考慮是否跨平台。
F. 涓轟粈涔堢▼搴忚佸厛緙栬瘧錛屾墠鑳借繍琛屽晩錛
褰撶紪鍐欏畬涓涓紼嬪簭鍚庯紝闇瑕侀栧厛榪涜岀紪璇戱紝鐒跺悗鍐嶈繍琛屻
濡備笅鍥炬墍紺猴紝紼嬪簭緙栧啓瀹屾瘯鍚庯紝鐐瑰嚮宸ュ叿鏍忎腑鐨凟xecute,閫夋嫨compile(緙栬瘧錛
濡傛灉娌℃湁閿欒錛屽啀閫夋嫨Execute,閫夋嫨run錛堣繍琛)
鎵╁睍璧勬枡
緙栬瘧灝辨槸鎶婇珮綰ц璦鍙樻垚璁$畻鏈哄彲浠ヨ瘑鍒鐨2榪涘埗璇璦錛岃$畻鏈哄彧璁よ瘑1鍜0錛岀紪璇戠▼搴忔妸浜轟滑鐔熸倝鐨勮璦鎹㈡垚2榪涘埗鐨勩緙栬瘧紼嬪簭鎶婁竴涓婧愮▼搴忕炕璇戞垚鐩鏍囩▼搴忕殑宸ヤ綔榪囩▼鍒嗕負浜斾釜闃舵碉細璇嶆硶鍒嗘瀽錛涜娉曞垎鏋愶紱璇涔夋鏌ュ拰涓闂翠唬鐮佺敓鎴愶紱浠g爜浼樺寲錛涚洰鏍囦唬鐮佺敓鎴愩備富瑕佹槸榪涜岃瘝娉曞垎鏋愬拰璇娉曞垎鏋愶紝鍙堢О涓烘簮紼嬪簭鍒嗘瀽錛屽垎鏋愯繃紼嬩腑鍙戠幇鏈夎娉曢敊璇錛岀粰鍑烘彁紺轟俊鎮銆
緙栬瘧璇璦鏄涓縐嶄互緙栬瘧鍣ㄦ潵瀹炵幇鐨勭紪紼嬭璦銆傚畠涓嶅儚鐩磋瘧璇璦涓鏍鳳紝鐢辮В閲婂櫒灝嗕唬鐮佷竴鍙ヤ竴鍙ヨ繍琛岋紝鑰屾槸浠ョ紪璇戝櫒錛屽厛灝嗕唬鐮佺紪璇戜負鏈哄櫒鐮侊紝鍐嶅姞浠ヨ繍琛屻傜悊璁轟笂錛屼換浣曠紪紼嬭璦閮藉彲浠ユ槸緙栬瘧寮忥紝鎴栫洿璇戝紡鐨勩傚畠浠涔嬮棿鐨勫尯鍒錛屼粎涓庣▼搴忕殑搴旂敤鏈夊叧銆
G. 用c語言編寫的源程序需要用編譯程序先編譯成由機器語言組成的目標程序,在經過( )後才能得到可執行程序
源代碼需經過編譯和鏈接,才可生成可執行文件。
由匯編程序生成的目標文件並不能立即就被執行,其中可能還有許多沒有解決的問題。 例如,某個源文件中的函數可能引用了另一個源文件中定義的某個符號(如變數或者函數調用等);在程序中可能調用了某個庫文件中的函數,等等。所有的這些問題,都需要經鏈接程序的處理方能得以解決。
鏈接程序的主要工作就是將有關的目標文件彼此相連接,也即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成為一個能夠誒操作系統裝入執行的統一整體。
根據開發人員指定的同庫函數的鏈接方式的不同,鏈接處理可分為兩種:
(1)靜態鏈接
在這種鏈接方式下,函數的代碼將從其所在地靜態鏈接庫中被拷貝到最終的可執行程序中。這樣該程序在被執行時這些代碼將被裝入到該進程的虛擬地址空間中。靜態鏈接庫實際上是一個目標文件的集合,其中的每個文件含有庫中的一個或者一組相關函數的代碼。
(2) 動態鏈接
在此種方式下,函數的代碼被放到稱作是動態鏈接庫或共享對象的某個目標文件中。鏈接程序此時所作的只是在最終的可執行程序中記錄下共享對象的名字以及其它少量的登記信息。在此可執行文件被執行時,動態鏈接庫的全部內容將被映射到運行時相應進程的虛地址空間。動態鏈接程序將根據可執行程序中記錄的信息找到相應的函數代碼。
對於可執行文件中的函數調用,可分別採用動態鏈接或靜態鏈接的方法。使用動態鏈接能夠使最終的可執行文件比較短小,並且當共享對象被多個進程使用時能節約一些內存,因為在內存中只需要保存一份此共享對象的代碼。但並不是使用動態鏈接就一定比使用靜態鏈接要優越。在某些情況下動態鏈接可能帶來一些性能上損害。