欢迎光临散文网 会员登陆 & 注册

用C语言制作一个编译器 一 DEBUG

2023-02-17 20:08 作者:Sperenza  | 我要投稿

工欲善其事,必先利其器。在我们开始制作编程之前,我们要先制作一个简易的 Debug 工具。


预设

首先我们要先建立多个文件,结构如下


将 CMakeLists.txt 改为


将 scripts/CMakeLists.txt 设为


将 scripts/helpers/CMakeLists.txt 设为

我们一切 debug 有关的程序都将集中到 logger 中编写


logger.h

以上是我的logger蓝图,设计上我参考了python中的logging模块


报告等级

我在这设计了四个报告等级,用于应对各种不同的状况

  • 通常级:LOGGER_MESSAGE_LEVEL_INFO

  • 诊断级:LOGGER_MESSAGE_LEVEL_DEBUG

  • 警告级:LOGGER_MESSAGE_LEVEL_WARNING

  • 致命级:LOGGER_MESSAGE_LEVEL_ERROR

为这四个报告等级,我定义了一个类别

这行代表类别 LOGGER_MESSAGE_FN 是一个函数指针。

它不会返回任何东西,它需要struct logger指针,一个String数据,以及各种其他变量

然后在 struct logger 里面添加四个函数通道

这样就可以实现


通用函数

该函数会返回一个struct logger的指针。

引用该函数时,系统会寻找是否已经存在同名的 logger,如果有就返回该 logger,反之创建新的 logger。



删除指定的 logger


void kill_all_logger();

删除全部的 logger


将一个字符转换成更加易读的文字


logger.c

在创建各种函数之前,我们需要引用一些模块以方便后续的编程


报告等级

首先我们需要制作一个简易的显示报告等级的函数,代码我就不赘述了


再来我们需要制作一个简易的报告函数

该函数用于输出数据到指定的流文件中,基本上什么文件都可以。


stderr 是系统预设用于输出错误的流文件。


va_list 是在C语言中解决变参问题的一组宏,在这情况我们能假设这里面已经存储了无限量的变量。


针对于 va_list 制作的输出函数,会结合 format 和 ap 中的数据生成格式化数据并将其输出到指定的流文件中。


然后写出四个通用函数


这四个函数都是同样的事情:读取潜在的无限变量,并引用 logger_message 函数


create_logger

考虑到不同的函数会引用同一个logger,所以我决定让logger以全局变量的形式出现在代码里,这样可能会有内存短缺的风险,但如果要彻底的解决该问题就很花时间,且复杂。所以本系列不会太考虑这种事。

首先我们创建一个两层指针 logger_list 用于存储新生成的 logger,初始大小设定为8;

然后寻找最初的空闲空间

如果已经没有空间了,就加大空间,并将新增的空间设为NULL

如果一切状态如常,就建立一个新的 logger


get_logger

如果没有 logger 那就创建 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.

虽然现在的编译器已经进化到了能够把烂代码优化到神代码,但我几个理由不选择用 if-else

  1. 判断具备离散性:是1就是1,是2就是2,不存在1和2之间的情况

  2. 显而易见的易读性

  3. switch方法只会读取一次 c 变量,在大量的判断情况下速度会优于 if-else


验证

把 main.c 修改

得到下列结果就是成功


用C语言制作一个编译器 一 DEBUG的评论 (共 条)

分享到微博请遵守国家法律