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

資訊專欄INFORMATION COLUMN

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

kelvinlee / 2868人閱讀

摘要:一翻譯環(huán)境和執(zhí)行環(huán)境標(biāo)準(zhǔn)是由美國國家標(biāo)準(zhǔn)協(xié)會及國際化標(biāo)準(zhǔn)組織推出的關(guān)于語言的標(biāo)準(zhǔn)。開始執(zhí)行程序代碼,這個時候程序?qū)⑹褂靡粋€運(yùn)行時堆棧,內(nèi)存函數(shù)的局部變量和返回地址。正常終止函數(shù)也有可能是意外終止。棧幀中保存了該函數(shù)的返回地址和局部變量。

前言

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

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


一、翻譯環(huán)境和執(zhí)行環(huán)境

0x00 ANSI C 標(biāo)準(zhǔn)

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

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

? 【百度百科】ANCI C 標(biāo)準(zhǔn)

0x01 程序的翻譯環(huán)境和執(zhí)行環(huán)境

? ANSI C 的任何一種實(shí)現(xiàn)中,存在兩種不同的環(huán)境:

????? ① 翻譯環(huán)境:在該環(huán)境中,源代碼被轉(zhuǎn)換為可執(zhí)行的機(jī)器指令。

????? ② 執(zhí)行環(huán)境:用于實(shí)際執(zhí)行代碼。

二、詳解編譯和鏈接

0x00 翻譯環(huán)境

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

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

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

? 舉個例子: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

預(yù)編譯截?cái)啵?strong>*.i)

預(yù)處理指令

……

編譯(*.s

語法分析

詞法分析

語義分析

符號匯總

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

形成符號表

匯編指令 → 二進(jìn)制指令 ----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 運(yùn)行環(huán)境

? 程序執(zhí)行過程:

① 程序必須載入內(nèi)存中。在有操作系統(tǒng)的環(huán)境中:程序的載入一般由操作系統(tǒng)完成。在獨(dú)立環(huán)境中:程序的載入必須手工安排,也可能是通過可執(zhí)行代碼置入只讀內(nèi)存來完成。

② 程序的執(zhí)行便開始。接著便調(diào)用 main 函數(shù)。

③ 開始執(zhí)行程序代碼,這個時候程序?qū)⑹褂靡粋€運(yùn)行時堆棧(stack),內(nèi)存函數(shù)的局部變量和返回地址。程序同時也可以使用靜態(tài)(staic)內(nèi)存,存儲與靜態(tài)內(nèi)存中的變量在整個執(zhí)行過程中一直保留他們的值。

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

? 舉個例子:這段代碼的執(zhí)行過程

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;}

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

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

?

?


參考資料:

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

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

比特科技. C語言進(jìn)階[EB/OL]. 2021[2021.8.31]. .

本章完。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/119118.html

相關(guān)文章

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

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

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

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

    terro 評論0 收藏0
  • 淺析git

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

    explorer_ddf 評論0 收藏0

發(fā)表評論

0條評論

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