C語言代碼重構(gòu)器設(shè)計(jì)

前言
????代碼重構(gòu)的目的是讓代碼更容易被人看懂. 反編譯過程中需要大量的代碼重構(gòu). 隨著可執(zhí)行程序的體積增大, 反編譯的工作量成指數(shù)趨勢(shì)增長(zhǎng). 通常, 可手動(dòng)反編譯的程序體積在 1 MB 以下.
????所以, 我打算實(shí)現(xiàn)一個(gè)代碼重構(gòu)器. 技術(shù)上應(yīng)該是沒問題的, 但是能不能實(shí)現(xiàn)還取決于時(shí)間, 經(jīng)濟(jì)(沒找到工作)等其他因素. 如果實(shí)現(xiàn)不了, 也可以在此提供一個(gè)思路.
????主要需要編譯原理的知識(shí).

目標(biāo)
????輸入一個(gè)符合C99標(biāo)準(zhǔn)的C語言函數(shù)的代碼文本, 輸出一個(gè)與該函數(shù)等價(jià)并且更易懂的函數(shù)文本.
????等價(jià)是指 : 對(duì)于任何參數(shù), 輸出的運(yùn)行函數(shù)的結(jié)果都與輸入函數(shù)的運(yùn)行結(jié)果相等, 包括副作用(也就是打印字符串這些不影響結(jié)果的操作).
????更易懂是指 : (1) 代碼量盡可能減少(特殊情況也可以增大代碼量提高可讀性) ; (2) 執(zhí)行流程更加簡(jiǎn)單, 盡可能去除goto語句; (3) 塊的深度盡可能地低, 也就是 {} 的嵌套程度盡可能低.

模塊
1. 詞法分析模塊
????將輸入的函數(shù)文本轉(zhuǎn)為成單詞序列, 所謂單詞, 就是英語中的單詞的意思. 比如, 以字母或下劃線開頭的任意多個(gè)的字母, 數(shù)字或下劃線可以構(gòu)成一個(gè)標(biāo)識(shí)符, 標(biāo)識(shí)符就是一類單詞. 單詞通常分為標(biāo)識(shí)符, 關(guān)鍵字, 分隔符, 運(yùn)算符四大類.
2. 語法分析模塊
????將詞法分析模塊輸出的單詞序列組合成語句序列. 只有知道是什么語句, 才能分析代碼的語義(要做什么).
????比如?c = a + b; 這個(gè)語句的語法是 標(biāo)識(shí)符 = 標(biāo)識(shí)符 + 標(biāo)識(shí)符, 語義是將 = 右邊的兩個(gè)標(biāo)識(shí)符的值相加, 結(jié)果賦值給 = 左邊的標(biāo)識(shí)符.
3. 數(shù)據(jù)庫模塊
????用于保存管理分析出來的數(shù)據(jù).
????比如要保存某個(gè)變量的名字, 定義位置, 使用位置等信息.?
4. 代碼優(yōu)化模塊
????分析數(shù)據(jù)庫中的數(shù)據(jù), 執(zhí)行代碼優(yōu)化.
????也就是判斷是否符合某個(gè)模式, 如果符合, 就執(zhí)行相應(yīng)的優(yōu)化策略來改寫函數(shù)代碼.
????比如 : 分析出來某個(gè)變量沒有使用到, 那么就執(zhí)行去掉這個(gè)變量的策略.