C語言helloworld從運行到結束過程(我的理解)

來源:互聯網
上載者:User

現在我用我的理解來解釋一下一個helloworld程式的運行過程:

//---------- helloworld.cpp

#include<stdio.h>

int main(){

printf("hello world!\n");

return 0;

}


從helloworld.cpp到 helloworld.exe經過了以下過程:

1,編譯器進行一些預先處理,如處理#include<stdio.h>把 stdio.h的內容放到文本,還有把#define 編譯指令的處理等.

2,對預先處理好的來源程式進行彙編,把C翻譯成彙編代碼.

3,進行編譯:把以上彙編代碼進行彙編,再編譯成中間代碼檔案obj, 這裡的obj檔案的內容裡有程式運行時的機器碼,還有為連結器等準備的資料結構等,但些時它沒有一些函數的地址,只是用符號代替.

4,進行連結:把中間檔案進行串連,程式要用到許多其他的代碼,運用到好多的庫(c執行階段程式庫等),比如printf函數,你沒有實現它,printf只是存放在別的地方,連結器要把它的代碼地址找出來,再在對應修改機器代碼跳轉的絕對位址等(這裡絕對位址是虛擬位址).然後產生EXE檔案.通過連結器,程式的機器代碼可以在作業系統上運行了.

linux上的過程也是一樣的.


從雙擊helloworld.exe到程式結束

1, windows下的 explorer.exe外殼程式建立這個helloworld進程.

2,windows為進程分配資源,建立主線程,先是C啟動函數運行,初始化程式,然後調用helloworld 的main函數.當main返回時,調用exit,結束程式,返回到作業系統.


看了<<深入理解電腦系統>>等資料,把自已的對程式啟動並執行理解寫了下來,這隻是我的理解,上面有什麼錯誤之處嗎?請大家指出我的誤解之處.


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.