『壹』 在編譯的整個過程中對符號表做的操作有哪些
符號表在編譯程序工作的過程中需要不斷收集、記錄和使用源程序中一些語法符號的類型和特徵等相關信息。這些信息一般以表格形式存儲於系統中。如常數表、變數名表、數組名表、過程名表、標號表等等,統稱為符號表。對於符號表組織、構造和管理方法的好壞會直接影響編譯系統的運行效率。
『貳』 如何把依賴關系的模塊的符號表導出到一個Mole.symvers 文件里
如何把依賴關系的模塊的符號表導出到一個Mole.symvers 文件里
一個項目有多個模塊,它們之間有依賴關系,怎麼寫一個Makefile 才能把這些模塊的符號表導出到一個Mole.symvers 文件里,寫了很久,就是沒搞出來。現在的辦法是根據依賴關系去拷指定的Mole.symvers 文件,感覺不是很方便,如果有的模塊依賴多個其他的模塊,經常就會出錯,如果能把所有的符號表導出到一個或是所有模塊的Mole.symvers 文件里就好了。不知道可不可行
源文件數目多嗎
不多的話,全量編譯得了呵
測試的例子,輸出符號表到map文件
gcc -o mtest -I ./ main.cpp -L . -ltest -lstdc++ -Wl,-Map,aa.map
gcc -o hello hello.c -Wl,-Map,test.map
你不就是想把所有的符號表導出到一個文件中嗎?為什麼一定要在MAKEFILE上做文章呢?、
換個思路想想,其實只需要編譯完成後,把生成的符號表文件合並到一個統一的符號表文件中就行了。合並文件應該比較簡單吧,隨便找個腳本工具就能輕松搞定了
『叄』 怎麼查看makefile編譯依賴關系
目標,依賴,命令(規則),第一項目標,然後會有個:號,後面的就是依賴了
例如 hello.o : hello.c, a.o, b.o
gcc hello.c hello.o
hello.c, a.o,b.o就都是依賴,就這樣
『肆』 編譯器在編譯階段,究竟做哪些事情
1. 預處理首先源代碼文件(.c/.cpp)和相關頭文件(.h/.hpp)被預處理器cpp預編譯成.i文件(C++為.ii)。預處理命令為:gcc –E hello.c –o hello.i預編譯過程主要處理那些源代碼中以#開始的預編譯指令,主要處理規則如下:u 將所有的#define刪除,並且展開所有的宏定義;u 處理所有條件編譯指令,如#if,#ifdef等;u 處理#include預編譯指令,將被包含的文件插入到該預編譯指令的位置。該過程遞歸進行,及被包含的文件可能還包含其他文件。u 刪除所有的注釋//和 /**/;u 添加行號和文件標識,如#2 「hello.c」 2,以便於編譯時編譯器產生調試用的行號信息及用於編譯時產生編譯錯誤或警告時能夠顯示行號信息;u 保留所有的#pragma編譯器指令,因為編譯器須要使用它們。2. 編譯編譯過程就是把預處理完的文件進行一系列詞法分析,語法分析,語義分析及優化後生成相應的匯編代碼文件(.s)。編譯的命令為:gcc –S hello.i –o hello.s或者從源文件直接輸出匯編代碼文件:gcc –S hello.c –o hello.s現在版本的GCC把預編譯和編譯兩個步驟合並成一個步驟,由程序cc1來完成(C++為cc1plus)。3. 匯編匯編就是將匯編代碼轉變成機器可以執行的命令,生成目標文件(.o),匯編器as根據匯編指令和機器指令的對照表一一翻譯即可完成。匯編的命令為:gcc –c hello.s –o hello.o或者從源文件直接輸出目標文件:gcc –c hello.c –o hello.o4. 鏈接鏈接就是鏈接器ld將各個目標文件組裝在一起,解決符號依賴,庫依賴關系,並生成可執行文件。鏈接的命令為:ld –static crt1.o crti.o crtbeginT.o hello.o –start-group –lgcc –lgcc_eh –lc-end-group crtend.o crtn.o一般我們使用一條命令就可以完成上述4個步驟:gcc hello.c實際上gcc只是一些其它程序的包裝,它會根據不同參數去調用預編譯編譯程序cc1、匯編器as、鏈接器ld。
『伍』 6.2、android Studio 添加編譯依賴
文章摘要
1、 三種依賴類型
2、庫依賴關系配置
3、遠程倉庫
4、查看依賴關系樹
英文文獻
Android Studio中的搖籃構建系統可以很容易地包括外部的二進制文件或其他庫模塊到您的構建與依賴。該依賴性可以位於您的計算機上或遠程倉庫中,他們宣布任何傳遞依賴將自動包括在內。
要添加一個依賴於你的項目,指定諸如依賴配置compile在dependencies您的塊build.gradle文件。
例如,下面build.gradle為應用模塊文件包括三種不同類型的依賴關系:
每個這些要求不同類型的依賴關系如下:
此聲明一有依賴性 的Android庫模塊 名為「在MyLibrary」(此名稱必須定義為庫名稱相匹配include你的 settings.gradle 文件)。它需要構建系統編譯庫模塊與應用模塊,並在您的APK所產生的AAR文件。
由於Gradle讀取相對路徑的build.gradle 文件,這告訴構建系統添加您的項目內的所有JAR文件 mole_name/libs/的目錄的依賴。
或者,您可以指定單獨的文件如下:
這實際上是以下簡寫:
這宣告了「應用程序魔」庫的12.3版本的依賴,在「code.example.android」命名空間組內。
內側dependencies塊,可以聲明使用幾種不同的一個庫依賴依賴關系配置(諸如compile上面示出)。每個相關配置提供了搖籃有關如何使用圖書館不同的指令。下面的列表描述了每個可使用在你的Android項目庫依賴的配置。
以上配置適用於項目的主要來源集,它適用於所有的構建變種。
如果你不是想聲明的依賴只有特定的 構建變數 源設置或更改一個 測試源設置 ,你必須利用配置名稱以及與構建變數或測試源集的名稱前綴它。
例如,在添加compile
依賴關系只為您的「免費」產品的風味(使用遠程二進制依賴),它看起來像這樣:
但是,如果你想添加一個依賴於結合了產品的風味變體和構建類型,那麼你必須初始化的配置名稱configurations塊。下面的示例增加了一個apk依賴於你的「freeDebug」打造變種(使用本地二進制依賴):
要添加compile為本地測試和儀表測試的依賴性,它看起來像這樣:
如果你的 庫模塊提供了多個變種 ,你可以添加不同的庫變體像這樣不同的應用程序變數:
當你的依賴比當地的圖書館或文件樹以外的東西,搖籃會在哪個在線存儲庫中指定的文件 repositories的塊build.gradle文件。
默認情況下,新的Android Studio項目申報JCenter作為該項目的頂級存儲庫位置build.gradle的文件,如下圖所示:
如果你想從Maven的中央倉庫的東西,然後再添加 mavenCentral(),或本地存儲庫使用mavenLocal():
參考配置:
有些直接依賴可能有自己的依賴。這些被稱為 傳遞依賴 。而不是要求您手動聲明每個傳遞依賴,搖籃自動收集,並增加了它們。為了形象化兩個項目的直接和傳遞依賴,對於搖籃的Android插件提供了生成依賴關系樹為每個搖籃任務 構建變數 和 測試源集合 。
要生成此報告,步驟如下:
下面的示例報告顯示調試構建變數的依賴關系樹,包括前面例子中的本地庫模塊依賴和遠程依賴性。
『陸』 符號表和抽象語法樹是什麼關系兩者在編譯器設計中是否必需
一般的編譯器可能包含下面這些模塊:
1, 詞法分析器:
輸入: 源代碼
輸出: token
2, 語法分析器:
輸入: token
輸出: AST
在這個過程中, 可以識別出不符合語法規則的語句, 就可以報syntax錯誤, 如果有syntax錯誤, 編譯結束
3, 語義分析器:
輸入: AST
輸出: 無
在這個過程中, 根據語言的語義規則來識別語義錯誤, 要識別語義錯誤 就必須編譯AST, 因為是樹的遍歷, 假如你先遍歷到了int a 這個節點, 接著又遍歷到了一個表達式a = 4這個節點, 你需要檢查變數a有沒有聲明啊, 變數a和4的類型批不匹配呢? 這時你如果沒有保存變數a的信息, 那麼你怎麼檢查? 所以就需要符號表來保存這些信息了.
4, 代碼優化:
最簡單的就是常量折疊優化了, 比如: a = 1 + 2 這個語句可以直接換成: a = 3了, 也就是說在編譯階段就把一些必要的運算先計算完成, 在程序運行的時候就不需要計算這些了, 就提高了程序的運行效率. 這部分是最復雜的了, 還有各種各樣各樣的優化
5, 代碼生成:
輸入: AST
輸出: 可以是虛擬機代碼, 可以是本地匯編代碼
『柒』 編譯原理對符號表進行操作有哪些
//----------------------------符號表---------------------------------------
//預定義
struct snode;
struct stable;
//符號表結點
struct snode
{
string text; //符號名稱
string type; //符號類型
union {int ival;double rval;}value; //值------------
int offset; //偏移量
snode *nextn; //指向下一個節點
stable *header; //指向下屬符號表的表頭
};
//符號表表頭
struct stable
{
stable *previous; //指向先前創建的符號表表頭
snode *firstnode; //指向第一個結點
stable *ifnoelements;//如果此表為空,則用它指向下一個表頭
};
//當前表頭
stable *currtab;
//建立新表,返回表頭指針
//參數:當前的節點的表頭
stable *mktable(stable *previous)
{
stable *newtable =new stable;
newtable->previous=previous;
newtable->ifnoelements=0;
newtable->firstnode=0;
if(previous->firstnode==0)
{
previous->ifnoelements=newtable;
}
else
{
snode* ininode=previous->firstnode;
while(ininode->nextn!=0)
{
ininode=ininode->nextn;
}
ininode->header=newtable;
}
currtab=newtable;
return newtable;
}
//在node指向的符號表中為text建立一個新表項,返回新建立的結點
//參數:node為當前的節點的表頭,text名稱,type類型,offset偏移
snode *enter(stable *table,string text,string type,int offset,double value)
{
//創建節點
snode *newnode = new snode;
newnode->text=text;
newnode->type=type;
newnode->offset=offset;
newnode->nextn=0;
newnode->header=0;
if(type=="int")
{
newnode->value.ival=value;
}
else if(type=="real")
{
newnode->value.rval=value;
}
//判斷此表是否無元素
if(currtab->firstnode==0)
{
currtab->firstnode=newnode;
currtab->ifnoelements=0;
}
else
{
snode* addnode=currtab->firstnode;
while(addnode->nextn!=0)
{
addnode=addnode->nextn;
}
addnode->nextn=newnode;
}
return newnode;
}
//初始化符號表,返回表頭節點
void inittab()
{
stable *initable = new stable;
initable->firstnode=0;
initable->previous=0;
initable->ifnoelements=0;
currtab=initable;
}
//查找指針,表示結果
snode *searchresult;
//查找變數,返回指向該變數的指針
//查找變數,返回指向該變數的指針
snode* search(string name)
{
//檢查表是否空
bool isempty=true;
stable* checktab=currtab;
if(checktab->firstnode!=0)
{isempty=false;}
while(checktab->previous!=0)
{
if(checktab->firstnode!=0)
{isempty=false;}
checktab=checktab->previous;
}
if(checktab->firstnode!=0)
{isempty=false;}
if(isempty)
{
return 0;
}
snode* lastnode;
if(currtab->firstnode==0)
{
//移到非空的表頭
stable* notnullhead=currtab;
while(notnullhead->firstnode==0)
{
notnullhead=notnullhead->previous;
}
snode* tmpnode=notnullhead->firstnode;
//移到最後的元素
while(tmpnode->nextn!=0)
{
tmpnode=tmpnode->nextn;
}
lastnode=tmpnode;
}
else
{
lastnode=currtab->firstnode;
while(lastnode->nextn!=0)
{
lastnode=lastnode->nextn;
}
}
//移到表頭
stable* fronttab=currtab;
while(fronttab->previous!=0)
{
fronttab=fronttab->previous;
}
snode* nownode=0;
while(nownode!=lastnode)
{
while(fronttab->ifnoelements!=0)
{
fronttab=fronttab->ifnoelements;
}
nownode=fronttab->firstnode;
while(nownode->nextn!=0)
{
if(nownode->text==name)
{
searchresult=nownode;
return searchresult;
}
nownode=nownode->nextn;
}
if(nownode->text==name)
{
searchresult=nownode;
return searchresult;
}
fronttab=nownode->header;
}
if(nownode->text==name)
{
searchresult=nownode;
return searchresult;
}
return 0;
}
//消毀符號表
void delNode()
{
//more codes here......
}
『捌』 linux怎麼編譯兩個相互依賴的模塊
insmod不過最好是modprobe這個命令會檢測模塊之間的功能依賴關系一同載入。不過需要在/lib/moles裡面有模塊的信息(這個信息怎麼寫怎麼生成我不清楚)。