導航:首頁 > 源碼編譯 > 預編譯過程的操作有哪些

預編譯過程的操作有哪些

發布時間:2025-03-07 23:18:49

❶ js基礎知識點

JavaScript的組成部分包括DOM、BOM以及ECMAScript。DOM與BOM用於操作瀏覽器環境,ECMAScript是JavaScript的核心語言規范。

JavaScript運行的三步驟中,函數聲明優先於變數聲明。函數聲明時,其定義會立即提升到全局作用域中。

棧遵循LIFO(先進後出)原則,新添加或刪除的元素位於棧頂。主要存放基本類型變數和對象引用,如數組。

隊列遵循FIFO(先進先出)原則,新元素位於尾部,舊元素位於頭部。用於存放基本類型變數和對象引用。

作用域定義了變數與函數的可訪問范圍,分為全局作用域和局部作用域。全局作用域中變數與函數可見,局部作用域內僅能訪問該作用域內的變數與函數。

字元串的賦值與操作涉及原始類型與包裝類型。原始類型如數字、字元串等,不帶屬性與方法。在操作時,會創建對應的包裝類型對象。

編譯過程包括在全局作用域創建全局對象,提升變數與函數,然後存入全局變數中。這一過程包含四個步驟,涉及變數和函數的初始化與提升。

執行環境在每次函數執行時創建,具有獨特的上下文。執行完畢後,環境被銷毀,作用域鏈包含函數運行時的所有活動對象。

改變作用域鏈的方法在於JavaScript引擎存取的內部屬性[[Scope]],包含了函數作用域中對象的集合。

塊級作用域通過解析函數創建AO上下文環境,被提升的變數與函數在變數環境中,塊級作用域的變數則存放在詞法環境的獨立區域。詞法環境內部結構維護了一個小型棧,用於變數查找。

ES6引入了let和const關鍵字,使JavaScript具備塊級作用域,提高了代碼的可讀性和可維護性。

❷ 什麼是預編譯,何時需要預編譯

預編譯又稱為預處理,是做些代碼文本的替換工作

預編譯又稱為預處理,是做些代碼文本的替換工作

處理#開頭的指令,比如拷貝#include包含的文件代碼,#define宏定義的替換,條件編譯等

就是為編譯做的預備工作的階段

主要處理#開始的預編譯指令

預編譯指令指示了在程序正式編譯前就由編譯器進行的操作,可以放在程序中的任何位置。常見的預編譯指令有:

(1)#include 指令

該指令指示編譯器將xxx.xxx文件的全部內容插入此處。若用<>括起文件則在系統的INCLUDE目錄中尋找文件,若用" "括起文件則在當前目錄中尋找文件。一般來說,該文件是後綴名為"h"或"cpp"的頭文件。

注意:<>不會在當前目錄下搜索頭文件,如果我們不用<>而用""把頭文件名擴起,其意義為在先在當前目錄下搜索頭文件,再在系統默認目錄下搜索。

(2)#define指令

該指令有三種用法:

第一種是定義標識,標識有效范圍為整個程序,形如#define XXX,常與#if配合使用;

第二種是定義常數,如#define max 100,則max代表100(這種情況下使用const定義常數更好,原因見注1);

第三種是定義"函數",如#define get_max(a, b) ((a)>(b)?(a):(b)) 則以後使用get_max(x,y)就可以得到x和y中較大的數(這種方法存在一些弊病,見注2)。

第四種是定義"宏函數",如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用時,用GEN_FUN(int),則此處預編譯後就變成了 max_int(int a,int b){return a>b?a:b;},以後就可以使用max_int(x,y)就可以得到x和y中較大的數.比第三種,增加了類型的說明。

(3)#if、#else和#endif指令

這些指令一般這樣配合使用:

#if defined(標識) //如果定義了標識

要執行的指令

#else

要執行的指令

#endif

在頭文件中為了避免重復調用(比如說兩個頭文件互相包含對方),常採用這樣的結構:

#if !(defined XXX) //XXX為一個在你的程序中唯一的標識符,

//每個頭文件的標識符都不應相同。

//起標識符的常見方法是若頭文件名為"abc.h"

//則標識為"abc_h"

#define XXX

真正的內容,如函數聲明之類

#endif

❸ 程序語言最終怎樣被轉換成計算機能讀懂的機械語言,0和1,

程序語言有很多,拿最常用的c/c++語言舉例。

將用戶的文本形式的源代碼轉化成計算機可以直接執行的機器代碼的過程。主要經過這么幾個過程:

一、預編譯,又稱為預處理 , 是做些代碼文本的替換工作

二、編譯,由編譯器將c源代碼(.cpp)轉變成匯編代碼(.s)

三、匯編,由匯編器將匯編代碼(.s)轉變成目標代碼(.o)

四、鏈接,由鏈接器將代碼在執行過程用到的其他目標代碼和庫文件鏈接成為一個可執行程序也就是目標程序。

經過以上步驟高級語言就會被解釋成為計算機可以認知的機器語言。

(3)預編譯過程的操作有哪些擴展閱讀

一、預編譯

1、定義

處理以# 開頭的指令 , 比如拷貝 #include 包含的文件代碼,#define 宏定義的替換 , 條件編譯等,就是為編譯做的預備工作的階段。

主要處理#開始的預編譯指令,預編譯指令指示了在程序正式編譯前就由編譯器進行的操作,可以放在程序中的任何位置。

二、編譯

1、定義

編譯的過程就是將源代碼文件以字元流的形式進行處理,進行詞法和語法的分析,然後通過匯編器將源代碼指令轉變成匯編指令,編譯的過程包括兩個大部分:預處理 = 預編譯

2、特殊符號

特殊符號是指:例如在源程序中出現的LINE標識將被解釋為當前行號(十進制數),FILE則被解釋為當前被編譯的C源程序的名稱。預編譯程序對於在源程序中出現的這些串將用合適的值進行替換。

三、匯編

1、定義

匯編過程實際上是把匯編語言代碼翻譯成目標機器指令的過程。對於被翻譯系統處理的每一個C語言源程序,都將最終經過這一處理而得到相應的目標文件。目標文件中所存放的也就是與源程序等效的目標的機器語言代碼。

四、鏈接

1、定義

由匯編程序生成的目標文件並不能立即就被執行,其中可能還有許多沒有解決的問題。

❹ C語言文件的編譯與執行的四個階段並分別描述

開發C程序有四個步驟:編輯、編譯、連接和運行。

任何一個體系結構處理器上都可以使用C語言程序,只要該體系結構處理器有相應的C語言編譯器和庫,那麼C源代碼就可以編譯並連接到目標二進制文件上運行。

1、預處理:導入源程序並保存(C文件)。

2、編譯:將源程序轉換為目標文件(Obj文件)。

3、鏈接:將目標文件生成為可執行文件(EXE文件)。

4、運行:執行,獲取運行結果的EXE文件。

(4)預編譯過程的操作有哪些擴展閱讀:

將C語言代碼分為程序的幾個階段:

1、首先,源代碼文件測試。以及相關的頭文件,比如stdio。H、由預處理器CPP預處理為.I文件。預編譯的。文件不包含任何宏定義,因為所有宏都已展開,並且包含的文件已插入。我歸檔。

2、編譯過程是對預處理文件進行詞法分析、語法分析、語義分析和優化,生成相應的匯編代碼文件。這個過程往往是整個程序的核心部分,也是最復雜的部分之一。

3、匯編程序不直接輸出可執行文件,而是輸出目標文件。匯編程序可以調用LD來生成可以運行的可執行程序。也就是說,您需要鏈接大量的文件才能獲得「a.out」,即最終的可執行文件。

4、在鏈接過程中,需要重新調整其他目標文件中定義的函數調用指令,而其他目標文件中定義的變數也存在同樣的問題。

❺ c++ 編譯 鏈接是怎麼回事

compile和link是大多數語言從原代碼生成可執行程序的兩個步驟。

之所有有這兩個步驟因為幾乎任何一個程序都不是用一個原文件寫出來的。compile是先針對單獨原文件進行處理。link是把compile處理的結果組合成一個完整的可執行文件。

其實C/C++完全也可以一步成型,不需要compile和link兩個步驟,但是那樣的後果就是:一,每次生成可執行程序,必須翻譯全部源代碼;二,C語言的執行庫(printf, scanf這些)必須都以源代碼形式存在。這怎麼樣也說不過去吧。

另外頭文件不屬於compile和link過程,頭文件是預編譯過程的文件。

C/C++語言的完整編譯過程是

一、預編譯

處理#define #if #include這類#開頭的語句,這些稱為預編譯指令。這個過程中會把.h文件和.c/.cpp文件組合成最終交給compile過程的原文件。這個原文件是不包含任何#開頭的語句的。所有#define定義的宏也會被替換。

二、編譯
把上面那個原文件編譯成.o或者VC里是.obj文件。這個文件保存了機器碼化的函數、函數的描述、全局變數的描述、乃至段的描述等等。

三、連接
把可執行程序需要的所有的編譯過程產生的.o或者.obj文件組合到一起。(這里也包括.lib文件,.lib文件件本質上就是打包的.obj文件集合)。另外連接過程還會組合一些其他數據,比如資源、可執行文件頭等等。

❻ c語言編譯預處理

編譯,編譯程序讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,再由匯編程序轉換為機器語言,並且按照操作系統對可執行文件格式的要求鏈接生成可執行程序。

如果用一張圖來表示:

讀取c源程序,對其中的偽指令(以#開頭的指令)和特殊符號進行處理

[析] 偽指令主要包括以下四個方面

(1)宏定義指令,如#define Name TokenString,#undef等。對於前一個偽指令,預編譯所要做的是將程序中的所有Name用TokenString替換,但作為字元串常量的Name則不被替換。對於後者,則將取消對某個宏的定義,使以後該串的'出現不再被替換。

(2)條件編譯指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉

(3)頭文件包含指令,如#include "FileName"或者#include 等。在頭文件中一般用偽指令#define定義了大量的宏(最常見的是字元常量),同時包含有各種外部符號的聲明。採用頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用。因為在需要用到這些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復一遍。預編譯程序將把頭文件中的定義統統都加入到它所產生的輸出文件中,以供編譯程序對之進行處理。

包含到c源程序中的頭文件可以是系統提供的,這些頭文件一般被放在/usr/include目錄下。在程序中#include它們要使用尖括弧(<>)。另外開發人員也可以定義自己的頭文件,這些文件一般與c源程序放在同一目錄下,此時在#include中要用雙引號("")。

(4)特殊符號,預編譯程序可以識別一些特殊的符號。例如在源程序中出現的LINE標識將被解釋為當前行號(十進制數),FILE則被解釋為當前被編譯的C源程序的名稱。預編譯程序對於在源程序中出現的這些串將用合適的值進行替換。

注意:

預編譯程序所完成的基本上是對源程序的「替代」工作。經過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經過預處理的源文件是相同的,但內容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機器指令。

閱讀全文

與預編譯過程的操作有哪些相關的資料

熱點內容
程序員放棄後會怎樣 瀏覽:186
河北模具編程 瀏覽:189
adb查找命令 瀏覽:323
安卓手機視頻文件夾怎麼打開 瀏覽:312
平板加密手機後怎麼關閉 瀏覽:572
流媒體伺服器應該注意什麼 瀏覽:538
d8命令編譯 瀏覽:967
壓縮包解壓需要多少空間 瀏覽:148
如何查找app屬性 瀏覽:388
android人臉識別技術 瀏覽:323
pc104編程 瀏覽:336
二維碼反編譯破解推廣 瀏覽:684
修改伺服器的mac地址 瀏覽:529
好玩的編程軟體 瀏覽:901
編程語言創始人有錢嗎 瀏覽:808
短視頻app怎麼獲客 瀏覽:16
查看雲伺服器的應用 瀏覽:438
javadump工具 瀏覽:566
程序員16g 瀏覽:448
程序員沒有辦法成為top怎麼辦 瀏覽:221