Commit 494d8b58 authored by stackoverflow_16384's avatar stackoverflow_16384
Browse files

Merge branch 'main' into 'master'

补充学习资料&文档介绍

See merge request 202310007111211/project1466467-175713!7
No related merge requests found
Showing with 48 additions and 35 deletions
+48 -35
......@@ -93,7 +93,14 @@
## 2.3 项目的意义
TCC编译速度快和可制作C脚本的特性,决定了其适合于进行大型项目的调试和快速的样本实现。在LoongArch架构下移植TCC,可以扩充LoongArch开发工具链,促进LoongArch生态的发展
1. 拓展TCC编译器的支持架构,增加LoongArch平台的可用工具链。TCC**编译速度快和支持生成C语言脚本**的特性,决定了其适合于进行大型项目的**调试****快速的样本实现**。在LoongArch架构下移植TCC,可以扩充LoongArch**开发工具链**,促进LoongArch**生态**的发展。开发者可以利用TCC更便捷地进行LoongArch平台的应用开发。
2.**嵌入式系统**提供了一个选项。TCC编译速度快,软件体积小,非常适合应用在**资源受限**的嵌入式系统开发中。而LoongArch作为一种新兴的通用CPU架构,在嵌入式领域有广阔的应用前景。因此,该项目能帮助开发者能够在基于LoongArch的嵌入式系统上方便的进行开发。
3. 作为LoongArch架构相关教学、开发的实践案例。该项目覆盖交叉编译环境搭建、编译原理、架构差异适配等知识点,可以深化对这些知识的理解。项目的代码和文档,可以作为架构、编译器相关课程的**教学案例**,也可以为其他开发者在LoongArch平台上移植软件提供**经验参考**
4. 项目成功后,经过进一步优化提升,可以考虑向TCC社区提交代码,推动编译器技术在不同架构之间的共享和协作。
# 3 工作思路
......@@ -133,8 +140,8 @@ TCC编译速度快和可制作C脚本的特性,决定了其适合于进行大
- 这几个文件之间耦合性较强,并不是简单的顺序执行
- 关键数据结构
- 符号表和token序列(在编译前端生成,在tccgen.c, xxx-gen.c中使用)
- SValue型栈(在TCC开发者文档中有写)(在xxx-gen.c中使用,暂存目标代码生成时的临时数据)
- 这个数据结构实时记录了代码生成过程中暂存的若干数据的信息(包括静态数据、局部变量、全局变量、外部数据、临时数据等),这是TCC能够单趟完成编译的重要数据结构
- **SValue**型栈(在TCC开发者文档中有写)(在xxx-gen.c中使用,暂存目标代码生成时的临时数据)
- 这个数据结构**实时记录**了代码生成过程中暂存的若干数据的信息(包括静态数据、局部变量、全局变量、外部数据、临时数据等),这是TCC能够单趟完成编译的**重要数据结构**
- 通过维护包含这些数据的堆栈,TCC才得以生成相匹配的机器指令
- 在此过程中,TCC也跟符号表和section表进行交互
- Section(对应目标代码文件中的section)
......@@ -251,10 +258,10 @@ sltui d,d,1 ;最后将寄存器d(表示差值)以无符号数身份与1进
## 4.4 技术难点的突破
1. TCC代码耦合度高带来的困难(如编译后端程序的流程和接口)
- 由于tcc编译器前后端耦合性较强,且开发时间有限,因此读懂整体流程较困难(这也给设计和调试留下了隐患)
- 解决方法:借用tcc官方仓库中最近的risc v架构代码文件结构,再此基础上,同时参考arm64等文档来逐步理解和仿写
2. 与riscv存在参数差异的部分(如部分生成代码的参数调整)
1. TCC代码**耦合度高**带来的困难(如编译后端程序的流程和接口)
- 由于tcc编译器前后端耦合性较强,且开发时间有限,因此读懂**整体流程**较困难(这也给设计和调试留下了隐患)
- 解决方法:借用tcc官方仓库中最近的risc v架构代码文件结构,再此基础上,同时**参考arm64等文档来逐步理解和仿写**
2. 与riscv存在差异的部分(如部分生成代码的参数调整)
- 由于代码框架是基于riscv实现的,因此遇到两者参数不同的情况时,需要额外的分析处理
- 解决方法:其一是用gcc编译相同的程序之后进行反编译,对照其机器指令,结合调试信息进行模仿修改;其二是扩大阅读和理解的源代码范围,了解其上层和底层模块的实现原理和流程,从而推理得出正确的代码
3. 和RISCV等已有架构不同,且没有找到文档参考的部分
......@@ -361,21 +368,26 @@ tcc:
可以看出,即便在debug选项启动的劣势条件下,TCC编译器仍然表现出了比GCC高得多的编译效率
# 6 经验、体会和展望
# 6 经验体会
- 通过完成这个项目,我对**编译器的运行原理****操作系统中程序运行的流程**有了更深入的了解
- 我更加切实的了解了操作系统中程序运行的流程,特别是操作系统**加载**可执行文件的方式以及可执行文件中**各部分的作用**。这些知识对深入了解计算机系统的运行原理很有帮助。
- 我了解了**指令集和ABI**(应用程序二进制接口)的相关知识,了解了不同指令集架构和ABI规范的区别。这让我深入了解了指令集
- 在编写和调试过程中,我对实际工程**项目的管理和阅读**经验逐渐丰富,提升了我的开发能力
- 由于龙芯平台主要运行**linux**系统,在此过程中,我对linux运维工具的使用逐渐熟悉,了解了linux的系统结构,了解了linux的系统调用接口
- 在学习过程中,我体会到了**学习他人代码**的作用。阅读TCC中arm,x86_64,riscv的实现代码,对我对龙芯代码平台的编写带来了不少的收益,也让我体会到了优秀的开源项目常用的编写方法和思路。
# 7 未来展望
- 经验体会
- 通过完成这个项目,我对**编译器的运行原理****操作系统中程序运行的流程**有了更深入的了解
- 我更加切实的了解了操作系统中程序运行的流程,特别是操作系统**加载**可执行文件的方式以及可执行文件中**各部分的作用**。这些知识对深入了解计算机系统的运行原理很有帮助。
- 我了解了**指令集和ABI**(应用程序二进制接口)的相关知识,了解了不同指令集架构和ABI规范的区别。这让我深入了解了指令集
- 在编写和调试过程中,我对实际工程**项目的管理和阅读**经验逐渐丰富,提升了我的开发能力
- 由于龙芯平台主要运行**linux**系统,在此过程中,我对linux运维工具的使用逐渐熟悉,了解了linux的系统结构,了解了linux的系统调用接口
- 在学习过程中,我体会到了**学习他人代码**的作用。阅读TCC中arm,x86_64,riscv的实现代码,对我对龙芯代码平台的编写带来了不少的收益,也让我体会到了优秀的开源项目常用的编写方法和思路。
- 未来展望
- 实现正确的链接器,并整理交叉编译功能
- 扩大样例范围,发现更多程序现有功能的bug
- 争取实现long double, vla等更复杂的功能
1. 实现正确的链接器,并整理交叉编译功能
2. 扩大样例范围,发现更多程序现有功能的bug
3. 争取实现long double, vla等剩余C90中的功能
4. 提升编译速度,采用更高效的代码生成,来进一步提升TCC在LoongArch上的编译速度
5. 支持更多C语言特性和GNU扩展
6. 经过充分的测试之后,考虑向TCC社区提交代码,争取合并到TCC的主线分支
7. 测试更多领域的应用,将LoongArch+TCC的组合,与python, java结合,尝试其C语言脚本等额外功能
# 7 参考资料
# 8 参考资料
- [proj216题目](https://github.com/oscomp/proj216-la-tcc)
- tcc资料
......@@ -419,21 +431,21 @@ tcc:
- 其他资料
- pass
# 8 过程记录
- 比赛进程中的重要进展
- 2023.3.30开始召集成员
- 2023.4.24项目正式启动
- 2023.5.4完成开发环境配置(Archlinux for loongarch64),启动资料调研计划
- 2023.5.12进行了第一次项目知识研讨,首次添加项目文件
- 2023.5.14标准化项目文档
- 2023.5.20完成代码框架设计和试编译
- 2023.7.1讨论成员暑期安排
- 2023.8.2进行下阶段比赛安排
- 2023.8.9链接器编写遇到困难,改变目标
- 2023.8.10修复了整数运算代码,成功运行全部的example程序
- 2023.8.11完成了浮点数运算测试
- 2023.8.15完成了大部分tests样例的测试,并完成了文档
# 9 过程记录
## 比赛进程中的重要进展
- 2023.3.30开始召集成员
- 2023.4.24项目正式启动
- 2023.5.4完成开发环境配置(Archlinux for loongarch64),启动资料调研计划
- 2023.5.12进行了第一次项目知识研讨,首次添加项目文件
- 2023.5.14标准化项目文档
- 2023.5.20完成代码框架设计和试编译
- 2023.7.1讨论成员暑期安排
- 2023.8.2进行下阶段比赛安排
- 2023.8.9链接器编写遇到困难,改变目标
- 2023.8.10修复了整数运算代码,成功运行全部的example程序
- 2023.8.11完成了浮点数运算测试
- 2023.8.15完成了大部分tests样例的测试,并完成了文档
## 开发日志
......@@ -456,6 +468,7 @@ tcc:
- 2023.8.2记录
- 学习会,关于svalue和目标代码生成问题
- 忙完其他事务,讨论决赛安排
- [学习总结](./record/学习总结-目标代码生成&Svalue.docx)
- [记录文档](./record/0802记录.md)
- 2023.7.9,7.17补充记录
- 学习会,关于链接、目标代码生成中的寄存器问题
......
File added
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment