用C語(yǔ)言制作一個(gè)編譯器 一 DEBUG
工欲善其事,必先利其器。在我們開始制作編程之前,我們要先制作一個(gè)簡(jiǎn)易的 Debug 工具。
預(yù)設(shè)
首先我們要先建立多個(gè)文件,結(jié)構(gòu)如下
將 CMakeLists.txt 改為
將 scripts/CMakeLists.txt 設(shè)為
將 scripts/helpers/CMakeLists.txt 設(shè)為

我們一切 debug 有關(guān)的程序都將集中到 logger 中編寫
logger.h
以上是我的logger藍(lán)圖,設(shè)計(jì)上我參考了python中的logging模塊
報(bào)告等級(jí)
我在這設(shè)計(jì)了四個(gè)報(bào)告等級(jí),用于應(yīng)對(duì)各種不同的狀況
通常級(jí):LOGGER_MESSAGE_LEVEL_INFO
診斷級(jí):LOGGER_MESSAGE_LEVEL_DEBUG
警告級(jí):LOGGER_MESSAGE_LEVEL_WARNING
致命級(jí):LOGGER_MESSAGE_LEVEL_ERROR
為這四個(gè)報(bào)告等級(jí),我定義了一個(gè)類別
這行代表類別 LOGGER_MESSAGE_FN 是一個(gè)函數(shù)指針。
它不會(huì)返回任何東西,它需要struct logger指針,一個(gè)String數(shù)據(jù),以及各種其他變量
然后在 struct logger 里面添加四個(gè)函數(shù)通道
這樣就可以實(shí)現(xiàn)
通用函數(shù)
該函數(shù)會(huì)返回一個(gè)struct logger的指針。
引用該函數(shù)時(shí),系統(tǒng)會(huì)尋找是否已經(jīng)存在同名的 logger,如果有就返回該 logger,反之創(chuàng)建新的 logger。
刪除指定的 logger
void kill_all_logger();
刪除全部的 logger
將一個(gè)字符轉(zhuǎn)換成更加易讀的文字
logger.c
在創(chuàng)建各種函數(shù)之前,我們需要引用一些模塊以方便后續(xù)的編程
報(bào)告等級(jí)
首先我們需要制作一個(gè)簡(jiǎn)易的顯示報(bào)告等級(jí)的函數(shù),代碼我就不贅述了
再來我們需要制作一個(gè)簡(jiǎn)易的報(bào)告函數(shù)
該函數(shù)用于輸出數(shù)據(jù)到指定的流文件中,基本上什么文件都可以。
stderr 是系統(tǒng)預(yù)設(shè)用于輸出錯(cuò)誤的流文件。
va_list 是在C語(yǔ)言中解決變參問題的一組宏,在這情況我們能假設(shè)這里面已經(jīng)存儲(chǔ)了無(wú)限量的變量。
針對(duì)于 va_list 制作的輸出函數(shù),會(huì)結(jié)合 format 和 ap 中的數(shù)據(jù)生成格式化數(shù)據(jù)并將其輸出到指定的流文件中。
然后寫出四個(gè)通用函數(shù)
這四個(gè)函數(shù)都是同樣的事情:讀取潛在的無(wú)限變量,并引用 logger_message 函數(shù)
create_logger
考慮到不同的函數(shù)會(huì)引用同一個(gè)logger,所以我決定讓logger以全局變量的形式出現(xiàn)在代碼里,這樣可能會(huì)有內(nèi)存短缺的風(fēng)險(xiǎn),但如果要徹底的解決該問題就很花時(shí)間,且復(fù)雜。所以本系列不會(huì)太考慮這種事。
首先我們創(chuàng)建一個(gè)兩層指針 logger_list 用于存儲(chǔ)新生成的 logger,初始大小設(shè)定為8;
然后尋找最初的空閑空間
如果已經(jīng)沒有空間了,就加大空間,并將新增的空間設(shè)為NULL
如果一切狀態(tài)如常,就建立一個(gè)新的 logger
get_logger
如果沒有 logger 那就創(chuàng)建 logger
kill_logger
刪除特定 logger
kill_all_logger
清空 logger
display_char
If a switch contains more than five items, it's implemented using a lookup table or a hash list. This means that all items get the same access time, compared to a list of if:s where the last item takes much more time to reach as it has to evaluate every previous condition first.
雖然現(xiàn)在的編譯器已經(jīng)進(jìn)化到了能夠把爛代碼優(yōu)化到神代碼,但我?guī)讉€(gè)理由不選擇用 if-else
判斷具備離散性:是1就是1,是2就是2,不存在1和2之間的情況
顯而易見的易讀性
switch方法只會(huì)讀取一次 c 變量,在大量的判斷情況下速度會(huì)優(yōu)于 if-else
驗(yàn)證
把 main.c 修改
得到下列結(jié)果就是成功