国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

我這里有一些好康的!杰哥不要啊~【淺析C語言程序環境】

kelvinlee / 2884人閱讀

摘要:一翻譯環境和執行環境標準是由美國國家標準協會及國際化標準組織推出的關于語言的標準。開始執行程序代碼,這個時候程序將使用一個運行時堆棧,內存函數的局部變量和返回地址。正常終止函數也有可能是意外終止。棧幀中保存了該函數的返回地址和局部變量。

前言

程序環境是什么?我們都 "經歷" 過,但不曾感知到 "他" 的存在。我們其實在不知不覺中早就已經接觸到了程序環境…… 第一次創建了一個文件(test.c),敲下那句 "hello world"? 隨后保存后點擊運行后編譯出可執行文件(test.exe)時,其實就已經接觸到了 "他" 了。

我們只是按下了運行,然后好像所有東西都像變魔術一樣直接就產生了,這一切都似乎是理所當然的事。但是你是否思考過他是如何變成 "可執行程序" 的呢?在這一章,我們將簡單地探討一個 "源程序"是如何變成 "可執行程序" 的,作一個大概了解。


一、翻譯環境和執行環境

0x00 ANSI C 標準

ANSI C是由美國國家標準協會(ANSI)及國際化標準組織(ISO)推出的關于C語言的標準。ANSI C 主要標準化了現存的實現, 同時增加了一些來自 C++ 的內容 (主要是函數原型) 并支持多國字符集 (包括備受爭議的三字符序列)。

? ANSI C 幾乎被所有廣泛使用的編譯器所支持,且多數C代碼是在ANSI C基礎上寫的。

? 【百度百科】ANCI C 標準

0x01 程序的翻譯環境和執行環境

? ANSI C 的任何一種實現中,存在兩種不同的環境:

????? ① 翻譯環境:在該環境中,源代碼被轉換為可執行的機器指令。

????? ② 執行環境:用于實際執行代碼。

二、詳解編譯和鏈接

0x00 翻譯環境

?? 組成一個程序的每個源文件通過編譯過程分別轉換成目標代碼(object code)

每個目標文件由鏈接器(linker)捆綁在一起,形成一個單一而完整的可執行程序。

連接器同時也會引入標準C庫函數中任何被該程序所用到的函數,且可以搜索程序員個人的程序庫,將其需要的函數也鏈接到程序中。

? 舉個例子:test.cadd.cminu.c

0x01 編譯本身的幾個階段

? 舉個例子:

sum.c

int global_val = 2021;void print(const char* string) {    printf("%s/n", string);}

test.c

#include int main(void) {    extern void print(char* string);    extern int global_val;    printf("%d/n", global_val);    printf("Hello,World!/n");    return 0;}

test.c

sum.c

預編譯截斷(*.i

預處理指令

……

編譯(*.s

語法分析

詞法分析

語義分析

符號匯總

匯編(生成可重定位目標文件 *.O

形成符號表

匯編指令 → 二進制指令 ----test.o

?????????????????????????????? ?? ?? ? ----sum.o

鏈接

1. 合并段表

2. 符號表的合并和符號表的重定位

隔離編譯,一起鏈接。

? main.c

extern int sum(int, int);int main(void) {    sum(1, 2);    return 0;}

? sum.c

int sum(int num1, int num2) {    return( num1 + num2);}

? 解析圖(VS2019):

0x02 運行環境

? 程序執行過程:

① 程序必須載入內存中。在有操作系統的環境中:程序的載入一般由操作系統完成。在獨立環境中:程序的載入必須手工安排,也可能是通過可執行代碼置入只讀內存來完成。

② 程序的執行便開始。接著便調用 main 函數。

③ 開始執行程序代碼,這個時候程序將使用一個運行時堆棧(stack),內存函數的局部變量和返回地址。程序同時也可以使用靜態(staic)內存,存儲與靜態內存中的變量在整個執行過程中一直保留他們的值。

④ 終止程序。正常終止 main 函數(也有可能是意外終止)。

? 舉個例子:這段代碼的執行過程

int Add(int x, int y) {    return( x + y);}int main(void) {    int a = 10;    int b = 20;    int ret = Add(a, b);    return 0;}

? 這里還有一個概念:函數棧幀 (目前做簡單了解,后續我將專門寫一篇函數棧幀的講解)

【百度百科】C語言中,每個棧幀對應著一個未運行完的函數。棧幀中保存了該函數的返回地址和局部變量。

?

?


參考資料:

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

俞甲子 / 石凡 / 潘愛民. 《程序員的自我修養》[M]. 電子工業出版社, 2009-4.

比特科技. C語言進階[EB/OL]. 2021[2021.8.31]. .

本章完。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/119118.html

相關文章

  • 淺析微信支付:前篇大綱

    摘要:淺析微信支付前篇大綱本文是淺析微信支付系列文章的第一篇,主要會介紹一下為何寫下這個系列以及對于微信支付的一點小經驗,與君共勉。下面講一下我是如何去學習微信支付的。 淺析微信支付:前篇大綱 本文是【淺析微信支付】系列文章的第一篇,主要會介紹一下為何寫下這個系列以及對于微信支付的一點小經驗,與君共勉。 以下會分幾個步驟講一下我學習微信支付的過程,也是一部辛酸史,也是希望朋友們不要再次跌進...

    mayaohua 評論0 收藏0
  • 淺析前端上傳

    摘要:項目上也用到很多上傳文件的地方,七牛云,阿里云,訊飛上傳都接觸過,所以在這里做一個記錄,總結一下前端上傳的幾種方式。類型的文件名七牛云上傳淺析是一個基于七牛開發的前端。 showImg(https://segmentfault.com/img/bVbvibu?w=1920&h=1080); 圖片,音頻,視頻等等這幾種常見的資源類型,如果需要從前端上傳到服務端,有幾種方式呢?不妨回顧一下...

    terro 評論0 收藏0
  • 淺析git

    摘要:淺析筆者在此整理了常見的命令,的重要性無需多言,與其再百度海中搜索命令,不妨嘗試收藏筆者的此篇作品。旨在快速高效地處理無論規模大小的任何軟件工程。其最大特色就是分支及合并操作非常快速簡便。 淺析git 筆者在此整理了常見的git命令,git的重要性無需多言,與其再百度海中搜索git命令,不妨嘗試收藏筆者的此篇作品。希望對你的學習有所幫助。 版本控制系統之git Git: (一)簡介:G...

    explorer_ddf 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<