找回密码
 立即注册
楼主: peitianyu

c51编译器编写日记

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2026-02-16 10:18:15

3

主题

71

回帖

675

积分

高级会员

积分
675
发表于 2026-2-3 10:33:27 | 显示全部楼层
STC应该赞助一下这样的项目,比那些什么赛,有意义多了。STC32G系列需要个好编译器。

点评

附议+1  发表于 2026-2-3 14:02
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2026-03-27 17:06:42

17

主题

67

回帖

473

积分

中级会员

积分
473
发表于 2026-2-6 12:24:29 | 显示全部楼层

0.xxx.xxx 处于初步研发版本, 暂无法投入使用, 预计1.0.0会有一个真实可以用的版本

version: 0.0.1

基本完成hex文件的初步输出

version: 0.0.2

修复:修复 while/for 循环中的 phi 问题
修复:修复复杂表达式与类型转换的 SSA 输出错误
修复:修复 Win/Linux 编辑差异导致的解析异常
修复:修复函数递归中的 bug
修复:修复复杂流图的 phi 问题
修复:修复 SSA 生成的大部分问题
修复:修复打印 instr 崩溃问题
修复:修复 print_link_summary 编译问题
修复:修复 while(1); 崩溃
优化:优化精简 pp.c 代码
优化:优化 asm 测试代码
优化:优化 ssa_opt
优化:优化 SSA(分支折叠、死块清除、多余 addr、多余 const)
优化:优化 while 的 SSA 处理
优化:双重 for 循环的 SSA 输出优化
优化:优化 SSA 中函数类型的真实打印
优化:优化测试项,删除 c51_link.c
优化:初步优化 hex_verify.c
优化:根据 Keil 优化 hex_verify.c 输出
优化:增加 ssa_pass
优化:优化强度削弱代码
优化:精简 phi
优化:优化控制流
优化:优化循环不变量外提
优化:优化数组常数折叠
优化:整理 ssa_pass 代码
特性:添加 <<= >>= &= |= ^= += -= \*= /= %= 支持
特性:添加函数式宏展开、多行宏、do{...}while(0) 宏
特性:添加 #if/#elif 支持
特性:添加 # 与 ## 运算符支持
特性:添加变参宏
特性:添加预定义宏
特性:添加 #error/#warning
特性:添加 #pragma once/#pragma message(...)
特性:添加 asm(...)
特性:将 obj 与 link 模块提出来
特性:添加串口测试代码
特性:在 asm 中添加 SSA 打印用于调试
特性:SSA 中添加 do-while 支持

version: 0.0.3

优化: test_bool_convert测试, 并基本完成所有测试, 存在常量条件, 与指针优化测试未通过
特性: 添加ssa中switch支持(应该还存在问题)
修复: 删除不可达块时误删除还在使用的块bug
修复: 处理exit被删除时没有ret的bug
优化: 多用组合优化
优化: 添加分支被折叠优化
优化: 添加指针移动中的常数折叠
优化: 添加避免重复load指针优化
优化: 添加取地址再解引用ssa优化

version: 0.0.4

修复: 初步修复指针参数
修复: 修复由于小端导致的链接器问题
修复: 修复neg v输出bug
优化: 修复for循环中16位寄存器选择问题
优化: 初步优化bit参数调用
优化: 优化bit参数调用寄存器约定
优化: 优化参数调用寄存器约定
优化: 简化c51后端代码结构
优化: 将c51obj模块合并到asm中, 减少不必要的模块

version: 0.0.5

特性:
- 添加 SFR/SBIT 支持与解析,加入针对 sbit 判断的优化
- 增强后端指令实现,添加 asm 输出相关特性
- 初步添加线性扫描寄存器分配与特殊寄存器支持
- 添加对 idata/xdata 的读取与处理支持

修复:
- 处理误删除函数标签的 bug
- 修复由于 ssa_pass 导致的数组处理问题
- 修复左移/右移的汇编输出问题
- 修补 c51_isel.c 中 emit_mov 的加载序列问题
- 处理若干编译相关的问题

优化:
- 优化指令选择与多次 add、立即数、sub、call 返回值等的指令输出
- 优化全局/局部变量与 data/idata/xdata 的处理与输出
- 优化 putc、delay 等函数的特化与生成逻辑
- 优化 while/select/数组使用相关的生成与性能
- 优化 spill 策略(包含拓展到 idata/xdata 区)与 SSA 生成(x+0/x-0 等)
- 临时禁用并规范窥孔优化以保证正确性

移除/回退:
- 删除对简单循环的特殊处理
- 暂时回退对双重循环的部分优化

version: 0.0.6

特性: 添加对于ssa指令的基本测试
修复: 处理ifelse
修复: 修复逻辑判断bug
修复: 修复左右移问题
修复: 由于int四则运算存在问题, 暂时标志不支持
修复: 处理char的四则运算问题
优化: 优化isel代码结构, 将庞大的isel分离出来几个子模块
修复: 处理char中乘除法bug
修复: 处理输出char时额外对r6处理的bug
特性: 添加对于指针的支持

version: 0.0.7

特性: 添加16位整形对于加减乘除的支持
优化: 将指令选择模块分割成算术与逻辑运算两个模块
添加: 添加更多的运算符测试
优化: 优化寄存器分配
修复: 处理控制指令中的bug(phi指令, || &&支持等)

version: 0.0.8

特性:
- 新增对字符串指针运算的支持(提高对指针/字符串相关代码的处理能力)
- 扩展后端 ASM 功能,增强汇编输出与后端指令实现
- 增加对不同地址空间(如 idata/xdata 等)的更好支持

优化:
- 添加若干简单的窥孔(peephole)优化以改善指令输出

修复:
- 修复读取相关的若干 bug(包括 SFR 寄存器读取问题)
- 修复链接多文件时的若干问题
- 修复和回归处理控制指令与部分指令生成的问题
- 修复与函数调用相关的多个错误

version: 0.1.0

说明: 0.1.0 版本为较为完整的里程碑发布,整合了编译流程、后端输出、hex 生成与构建脚本的多项改进。

特性:
- 支持在命令行编译时指定 `-ast -ssa -asm -hex -o` 等输出选项,增强 `main` 编译能力
- 添加 Windows 下的构建/编译支持(`build.bat` / win 下的编译功能)
- 添加预编译与多链接器支持,改进多文件构建流程
- 添加启动文件(startup)并验证流水灯示例可运行
- 初步完成 `hex` 输出功能的实现

优化:
- 使用驱动表(driver table)优化部分生成代码,改进代码大小与性能
- 补充并修复了若干缺失或不完整的编码实现
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
  • +1

    楼主威武~

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2026-03-27 17:06:42

17

主题

67

回帖

473

积分

中级会员

积分
473
发表于 2026-2-9 13:38:54 | 显示全部楼层
peiti*** 发表于 2026-2-6 12:24
0.0.xxx 处于初步研发版本, 暂无法投入使用, 预计1.0.0会有一个真实可以用的版本
version: 0.0.1
基本完成h ...

暂时完成了 流水灯测试通过, 关于指针的串口测试暂时未完成, 接下来过年了, 有时间继续更新
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2026-03-27 17:06:42

17

主题

67

回帖

473

积分

中级会员

积分
473
发表于 2026-3-27 17:06:42 | 显示全部楼层
总结一下:
    今天我看了一下, 从开发到现在大概花了不到三个月, 是有些累的, 幸好最近工作还不算忙, 不然真的整不来.
    如果让我重新做的话应该不会考虑做c语言了, 前端处理起来太复杂了, 语法糖太多了, 每一个type处理起来简直是灾难.
    挺开心的是这次使用了braun算法(而且可以自己设计指令), 这真的是很有趣的设计思路.
    最不满意的就是后端了, 虽然刚开始的时候设计了框架, 到后来越跑越飞了.
    (想着c251对于数据的处理应该简单些, c51中u8, u16每个都需要分支处理真的很麻烦.^_^)

之后待优化:
1. 会添加更加合适的ssa指令集, 现在的指令集对于c51而言很不友好
2. 对于c51后端而言应该更加精简优雅一些, 现在的设计很多都是凑合
3. 应该每个模块直接更加分离一些, 现在的type中的sub_type中其实还是存在传到下层的操作
4. 后端中的encode应该与指令选择同步, 这样会避免很多不必要的代码
5. 应该添加更多针对于c51的优化
6. 虽然支持了-O0/-O1/-O2的优化, 但实际上代码中并没有区分, 都是一样的优化
7. 之后应该添加对于c251的支持
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-6 00:17 , Processed in 0.114703 second(s), 59 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表