當前位置:首頁 » 編程軟體 » 編譯器的強弱符號

編譯器的強弱符號

發布時間: 2022-06-26 17:08:53

1. 編譯器的組成及各部分的功能及作用

1. 詞法分析 詞法分析器根據詞法規則識別出源程序中的各個記號(token),每個記號代表一類單詞(lexeme)。源程序中常見的記號可以歸為幾大類:關鍵字、標識符、字面量和特殊符號。詞法分析器的輸入是源程序,輸出是識別的記號流。詞法分析器的任務是把源文件的字元流轉換成記號流。本質上它查看連續的字元然後把它們識別為「單詞」。 2. 語法分析 語法分析器根據語法規則識別出記號流中的結構(短語、句子),並構造一棵能夠正確反映該結構的語法樹。 3. 語義分析 語義分析器根據語義規則對語法樹中的語法單元進行靜態語義檢查,如果類型檢查和轉換等,其目的在於保證語法正確的結構在語義上也是合法的。 4. 中間代碼生成 中間代碼生成器根據語義分析器的輸出生成中間代碼。中間代碼可以有若干種形式,它們的共同特徵是與具體機器無關。最常用的一種中間代碼是三地址碼,它的一種實現方式是四元式。三地址碼的優點是便於閱讀、便於優化。 5. 中間代碼優化 優化是編譯器的一個重要組成部分,由於編譯器將源程序翻譯成中間代碼的工作是機械的、按固定模式進行的,因此,生成的中間代碼往往在時間和空間上有很大浪費。當需要生成高效目標代碼時,就必須進行優化。 6. 目標代碼生成 目標代碼生成是編譯器的最後一個階段。在生成目標代碼時要考慮以下幾個問題:計算機的系統結構、指令系統、寄存器的分配以及內存的組織等。編譯器生成的目標程序代碼可以有多種形式:匯編語言、可重定位二進制代碼、內存形式。 7 符號表管理 符號表的作用是記錄源程序中符號的必要信息,並加以合理組織,從而在編譯器的各個階段能對它們進行快速、准確的查找和操作。符號表中的某些內容甚至要保留到程序的運行階段。 8 出錯處理用戶編寫的源程序中往往會有一些錯誤,可分為靜態錯誤和動態錯誤兩類。所謂動態錯誤,是指源程序中的邏輯錯誤,它們發生在程序運行的時候,也被稱作動態語義錯誤,如變數取值為零時作為除數,數組元素引用時下標出界等。靜態錯誤又可分為語法錯誤和靜態語義錯誤。語法錯誤是指有關語言結構上的錯誤,如單詞拼寫錯、表達式中缺少操作數、begin和end不匹配等。靜態語義錯誤是指分析源程序時可以發現的語言意義上的錯誤,如加法的兩個操作數中一個是整型變數名,而另一個是數組名等。

2. 編譯器怎麼區分標識符和字元

首先要清楚標識符和字元的定義

  • 標識符是程序員自己規定的具有特定含義的單詞,比如類名稱,屬性名稱,變數名等。

舉例子就是 class string

  • 字元是指計算機中使用的字母、數字、字和符號

舉例子就是 1,2,3,abc

然後要強調,編譯器是無法區分標識符和字元的,只有人事先為其規定好規則的情況下,編譯器才會按照標識符的方式去讀取。打個比方,我規定了class為類標識符,那當我程序里 出現了class test時,編譯器就會認為test是類而不是字元。不知道能不能理解,不過是個好問題

3. 請問編譯器的符號表是什麼呢 能否舉個例子呢謝謝

用到的函數都在裡面
調用時查那表

4. 編譯器有哪幾部分構成.編譯原理

1. 詞法分析

詞法分析器根據詞法規則識別出源程序
中的各個記號(token),每個記號代表一類單詞(lexeme)。源程序中常見的記號可以歸為幾大類:關鍵字、標識符、字面量和特殊符號。詞法分析器
的輸入是源程序,輸出是識別的記號流。詞法分析器的任務是把源文件的字元流轉換成記號流。本質上它查看連續的字元然後把它們識別為「單詞」。

2. 語法分析

語法分析器根據語法規則識別出記號流中的結構(短語、句子),並構造一棵能夠正確反映該結構的語法樹。

3. 語義分析

語義分析器根據語義規則對語法樹中的語法單元進行靜態語義檢查,如果類型檢查和轉換等,其目的在於保證語法正確的結構在語義上也是合法的。

4. 中間代碼生成

中間代碼生成器根據語義分析器的輸出生成中間代碼。中間代碼可以有若干種形式,它們的共同特徵是與具體機器無關。最常用的一種中間代碼是三地址碼,它的一種實現方式是四元式。三地址碼的優點是便於閱讀、便於優化。

5. C 編譯器符號表有哪些內容

符號表內部不記變數的值 每個變數都有自己對應的內空間。變數的值就存放在內存空間中! 如int a = 1; //假設a 的地址為0x 00121001 則這個地址的內存中就放有1這個數據

6. CF編譯器常用的符號怎麼打、斜杠0 等、

得把打字法退到中文(中國)最初的打字法,就是一個小鍵盤,就能打出來了\\\\\\\\\/////////看

7. 如何讓編譯器將特殊符號(比如)視為字元常量輸出

通常情況下,再特殊符號前邊加字元'\',如果要輸出的是「%d」則要在前面加上字元'%'

8. C++中 \ 符號是什麼意思,對編譯器有影響嗎

續行符 , 一行太長 要拆成兩行寫 ,但要讓編譯器知道這兩行 其實是 「一行」

9. 哪位大牛能告訴我,c語言中的'&'這個符號,到底編譯器是怎麼識別並運用它的

'&'是多功能運算符,至於如何解釋該符號,編譯器是根據「上下文」來判斷的。
由於在C中每個變數必須先聲明後使用,比如有聲明 :
int x = 3,y = 5,z;
int *p,fun(int &, int &); // 這里顯然是引用操作符啦!
對於
z = x & y; // 很明顯的,這是邏輯與(and)運算
x &= y; // 這里也是
p = &x; // 這是取址運算,注意,新版的C中沒有 =& 雙目運算符
-----------------------------------------------------------------------------------------------------------------------
在C++中,有運算符重載函數,比如
aClass operator&(const aClass &x,const aClass &y);,功能是實施類x和y的邏輯與,並返回aClass的實例,這里operator&中的「&」是被重載的運算符,&x,&y中的「&」是引用操作符。
----------------------------------------------------------------------------------------------------------------------
如果你希望了解編譯程序的細節,請參考相關書籍。

10. 全局變數的定義,以及如何處理頭文件包含關系

首先測試#ifndef #define #endif 在頭文件編譯中到底能夠起到什麼作用能?1.能夠控制整個工程對於該頭文件的包含,也就是說對於添加了#ifndef #define #endif
的頭文件一個工程只會包含一次該頭文件。2.只能控制一個.c文件只包含這個頭文件一次。下面我們定義一個testGlobal.h文件和兩個包含該.h文件的.cpp文件,testGlobal.cpp和
testGlobal2.cpp內容如下:
testGlobal.h

#ifndef TESTGLOBAL_H#define TESTGLOBAL_Hint GlobalCount;#endif

testGlobal.cpp

#include "testGlobal.h"

testGlobal2.cpp

#include "testGlobal.h"
#include <iostream>
void main()
{
std::cout<<GlobalCount<<std::endl;
}

此時編譯器會提示,redefined這說明兩個C文件中都直接包含了頭文件的內容。

接下來我們分析#ifndef #define #endif在防止一個C文件將同一個頭文件包含兩次的作用。這里重新定義一個文件testGlobal2.h

#ifndef TESTGLOBAL2_H
#define TESTGLOBAL2_H
#include "testGlobal.h"
int GlobalCount2 = 5;
#endif

將testGlobal.h和testGlobal2.h都包含到testGlobal.cpp中,並清除testGlobal2.cpp,此時可以順利編譯。可見#ifndef的聲明只對一個.cpp文件而言。
基於上述問題,一般在使用全局變數時,都將全局變數定義到某一個.cpp文件中,在.h文件使用extern從而避免出現重定義的問題。
對於.h文件中的宏定義是有編譯器直接替換為常值的,不會編譯到.obj文件中,所以不會出現重復定義。同時也可以在.h文件中定義結構體,枚舉因為這些都是由
有編譯器處理,直接在編譯時候替換的,所以也不會報錯。
實際上有關全局變數重定義的問題在《深入理解計算機系統》一書中有敘述:鏈接器在解析全局符號時,會遵循以下原則:
1.不允許有多個強符號
2.強弱符號都有選強
3.多個弱符號,任選其中一個
強符號是指:函數和已初始化的全局變數;成員函數如果定義在類外面,那麼是強符號;模板函數的特化版本是強的;
弱符號是指:未初始化的全局變數;成員函數如果定義在類裡面,那麼是弱符號;模板類中的成員函數無論定義在類內還是類外,都是弱類型;模板函數是弱類型;
實際上強弱符號判斷是可能出現問題的。因為編譯器實際操作的全局變數可能並不是你希望的,可能造成錯誤。
如果想在全局變數重復定義就發出警告的話,對於GCC可以添加GCC-warn-common選項。通過我的測試在CCS的c編譯器上面,在同一個.c文件中重復定義變數
不會報錯編譯器是按照強弱符號進行判斷的,但是要是在不同文件中定義了相同的變數就會報錯。而使用g++編譯的C++程序,後綴.cpp上述兩種情況都會報錯,通不
過編譯。
通過以上分析,在定義全局變數不應該定義在.h文件中。

熱點內容
清理outlook2010緩存 發布:2025-02-13 15:43:30 瀏覽:54
ohem演算法 發布:2025-02-13 15:40:10 瀏覽:930
java編程課程 發布:2025-02-13 15:36:08 瀏覽:475
cs編譯 發布:2025-02-13 15:36:07 瀏覽:55
高級語言都要編譯解析型語言 發布:2025-02-13 15:06:32 瀏覽:304
openwrt源碼下載 發布:2025-02-13 15:01:59 瀏覽:644
linux刪除一個目錄 發布:2025-02-13 15:00:29 瀏覽:539
螞蟻存儲 發布:2025-02-13 15:00:25 瀏覽:918
腳本師傳奇 發布:2025-02-13 14:45:48 瀏覽:481
我的世界lce伺服器剪輯 發布:2025-02-13 14:40:50 瀏覽:625