BUAA 2025编译实验
BUAA 2025 编译器设计说明
实现词法分析 + 递归下降语法分析 + 语义分析(符号表与约束检查)+ LLVM IR 中间代码生成 + 中端优化 + Mips 目标代码生成
仓库地址:wrongization/compile: 2025BUAA编译代码仓库
1. 总体目标
该项目实现一个精简 C / SysY 风格语言的编译器五个核心阶段:
词法分析—— 将源代码字符流转换为 Token 序列,并进行最基本的错误分类。
语法分析—— 基于递归下降结构 + FIRST 集判断与有限回溯,将 Token 序列还原为抽象/混合语法树(目前更接近具体语法树 )。
语义分析—— 基于作用域栈构建符号表,完成重定义、未定义引用、函数调用实参与形参检查、左值可赋性、return 规则、循环控制语句使用、printf 占位符数量等检查。
中间代码生成和优化—— 遍历语法树生成 LLVM IR 中间代码,包含基本块管理、寄存器分配、控制流处理、优化 pass 框架等。
目标代码生成—— 将 LLVM IR 转换为 MIPS 汇编代码。
设计强调:
模块化:frontend 下按阶段与节点 ...
BUAA 2025数据库大作业
github仓库:wrongization/codefuse: BUAA2025数据库大作业
CodeFuse —— 编程学习系统设计文档
一、需求分析
1.1 需求描述
1.1.1 背景调研
通过积极调研信息类相关专业学生在编程学习过程中遇到的困境,了解未来职业素养需求,我们发现传统的编程学习平台单向答题 + 低效讨论的模式存在一定弊端。
1.1.2 用户调研
通过对信息类专业学生和互联网从业者的问卷调查,我们初步总结需求如下:
信息类专业本科生
信息类专业研究生
互联网从业者
问题和讨论能及时得到反馈
能够得到面向就业机试的系统训练
团队协作开发能力
能有相对独立的思考和作答空间
问题和讨论能及时得到反馈
便捷,轻量,高效的学习工具
1.1.3 需求总结
系统,专业的训练资源的需求
协作开发和即时讨论的需求
轻量,便捷,容易上手的需求
独立思考作答的需求
其他
1.1.4 项目优势
通过上述需求分析可见,当前主流编程学习平台单向答题 + 低效协作的模式已经很难满足未来强调团队协作的职业需求。同时,其低效的反馈模式也很难帮助初学者解决学习中遇到的困难。 ...
Python-CUDA-CuDNN-Pytorch-Jupyter配置合集
Python CUDA CuDNN Pytorch Jupyter配置合集
本文主要内容为使用 uv 搭建隔离的 Python 环境,设置VSCode Jupyter 相关配置,安装匹配显卡的 CUDA 与 cuDNN,并配置并验证 PyTorch GPU 加速。本文拆分为四个部分:
环境与依赖管理(uv)
VSCode Jupyter 相关配置
CUDA / cuDNN 组件
PyTorch 安装、验证与优化
一:uv 环境与依赖管理
1. 了解 uv
uv 是用 Rust 编写的超快 Python 包与环境管理工具,集成:
Python 版本安装 (多版本共存)
虚拟环境管理
依赖解析与锁定
pip + pip-tools + virtualenv 的组合替代
项目地址:https://github.com/astral-sh/uv
官方教程:https://uv.doczh.com/
uv(以及 virtualenv、venv 等工具)的核心工作原则:隔离。
uv 管理的 Python:干净的“模板库”
当您使用 uv tool install python 安装了多个 ...
Java多版本环境配置
在 Windows 环境配置多版本 Java
无论是为了准备 OO 课程,还是游玩 Minecraft,多版本 Java 的需求都不可避免。接下来将介绍在 Windows 环境下配置多版本 Java 环境的教程,帮助读者方便地进行配置和切换。
当然,IDEA 可以读取所有 Java 运行环境,并且通过 GUI 界面简单地切换,并且高版本的 Java 可以设置语言级别以满足 OO 课程对 Java 1.8(JDK8)的要求。本文目的是为了便于管理多版本 Java,以及配置默认的命令行界面 Java 版本。
安装前必读
关于 JDK 和 JRE
在配置 Java 环境时,常常会遇到 JDK 和 JRE 两个概念。JDK(Java Development Kit)是 Java 的开发工具包,包含了编译器(javac)、调试工具等开发所需的全部内容。JRE(Java Runtime Environment)则是 Java 的运行环境,仅包含运行 Java 程序所需的库和虚拟机(JVM),不包括编译器。
一般来说,如果你只是运行 Java 程序,安装 JRE 即可;但如果需要开发 Java ...
BUAA-OS-shell
BUAA OS LAB6-SHELL 大作业报告
前言
本来一开始准备写swap,但在长达四天的swap奋战后,OS大作业取得了惊人的突破:转战shell
总计增删代码量为 2176 行。
相比于swap里的云里雾里,shell指导书相对清晰有逻辑。
然后,感谢懒鱼提供思路,对于内核态的修改路径帮助很大,虽然解析还是使用课程组的史山。不过能有OO纯正则解决表达式难?
BUAA-OO-unit1 | wrongization
北航2025 OS shell挑战性任务实现指导 | Lazyfish & chilly_river
实现要求
参见:任务要求
完整代码
参见:代码下载
功能实现
不带 .b 后缀指令
修改spawn.c
12345678910111213141516171819int spawn(char *prog, char **argv) { // Step 1: Open the file 'prog' (the path of the program). // Return the error if 'open' ...
BUAA-OO-unit4
OO Unit4 Summary
回顾一下第四单元完成的任务:利用UML进行正向建模,并完成一个小型的图书馆管理系统
hw13:实现借阅,预约,预约取书,还书等基本流程
hw14: 实现图书室借阅功能,并增加热门书架与普通书架
hw15:引用用户信用积分限制
一、正向建模与开发
正向建模与开发是一种软件工程方法,主要用于系统设计和实现过程中,特别是在软件开发和硬件设计领域。这种方法从高层次的需求和概念开始,逐步细化和分解,直到实现细节,整个过程类似于从宏观到微观的构建方式。正向建模与开发强调从抽象到具体、从整体到部分的设计思想,有助于确保系统设计的连贯性和完整性,便于团队成员理解整个系统的工作原理。
OO作业是迭代性任务,一个良好的初期架构对于后期作业的顺利完成是十分重要的,本单元中,课程组的初衷是先绘制UML类图等进行正向建模,并据此进行后续开发。对此,我的做法是首先设计整体框架,抽象出主要类例如书架、借还处、预约处等类,将类聚合到一个总体类图书馆中,对不同操作抽象出一些大的方法,得到一开始的粗略图。在图书馆类中针对不同操作抽象方法,调用不同的组成部分调用其内部具体实现方法, ...
BUAA-OS-LAB6
BUAA OS LAB6 实验报告
Thinking
Thinking 6.1
Q:
示例代码中,父进程操作管道的写端,子进程操作管道的读端。
如果现在想 让父进程作为“读者”,代码应当如何修改?
A:
1234567891011121314151617switch (fork()) { case -1: break; case 0: /* 子进程 - 作为管道的写者 */ close(fildes[0]); /* 关闭不用的读端 */ write(fildes[1], "Hello world\n", 12); /* 向管道中写数据 */ close(fildes[1]); /* 写入结束,关闭写端 */ exit(EXIT_SUCCESS); default: /* 父进程 - 作为管道的写者 */ close(fildes[1]); /* 关闭不用的写端 */ read(fildes[0], buf, 100); / ...
BUAA-OS-LAB5
BUAA OS LAB5 实验报告
Thinking
Thinking 5.1
Q:
如果通过 kseg0 读写设备,那么对于设备的写入会缓存到 Cache 中。这是 一种错误的行为,在实际编写代码的时候这么做会引发不可预知的问题。
请思考:这么做 这会引发什么问题?对于不同种类的设备(如我们提到的串口设备和IDE磁盘)的操作会 有差异吗?可以从缓存的性质和缓存更新的策略来考虑。
A:
当外部设备更新数据时,Cache中旧的数据可能刚刚缓存,那么完成缓存的这一部分无法完成更新,则会发生错误。
对于串口设备来说,读写更加频繁,信号密集,在相同的时间内发生错误的可能性远高于IDE磁盘。
Thinking 5.2
Q:
查找代码中的相关定义,试回答一个磁盘块中最多能存储多少个文件控制 块?一个目录下最多能有多少个文件?我们的文件系统支持的单个文件最大为多大?
A:
一个文件控制块的大小为256B ,那么一个磁盘块4KB最多存储4KB/256B=16 个文件控制块。
一个目录 = 一个磁盘块全部用来存目录项,又一个目录项32位=4B;则一个目录 4KB ,一个目录中有 4KB/4B=1 ...
BUAA-OO-unit3
OO Unit3 Summary
架构设计梳理:
HW9:
重点架构设计:
第一次作业整体上难度不大,但是需要对jml的实现细节考虑周全,对于一些开销较大的方法需要动态维护以降低时间复杂度,容器尽量使用HashMap等速度较快的。以下列出一些重点方法的实现。
iscircle:
采用朴素bfs加一个visited的map实现去重访问。
queryTripleSum:
采用动态维护,对于添加关系和删除关系,相当于增加或者删除了两人的公共好友数量的三元环。
queryBestAcquaintance:
加入时动态维护最大值,删除时如果删除了最大值重新遍历得到最大值。
getAgeavg/var:
方差和平均数动态维护,注意方差的书写需要考虑整除带来的影响
1return (agesquaresum - 2 * agesum * mean + n * mean * mean) / n;
bug分析和遇到的问题:
第一次测试和舍友对拍了许多测试点,公测功能没出现问题,性能卡了一个点,原因是queryTripleSum一开始采用一种将无向图根据度数转换为有向图的方法,复杂度为O($n\sqrt{ ...
BUAA-OS-LAB4
BUAA OS LAB4 实验报告
Thinking
Thinking 4.1
Q:
思考并回答下面的问题:
•内核在保存现场的时候是如何避免破坏通用寄存器的?
•系统陷入内核调用后可以直接从当时的$a0-$a3参数寄存器中得到用户调用msyscall 留下的信息吗?
•我们是怎么做到让sys开头的函数“认为”我们提供了和用户调用msyscall时同样 的参数的?
•内核处理系统调用的过程对Trapframe做了哪些更改?这种修改对应的用户态的变化是什么?
A:
在 SAVE_ALL 中:
先 move k0,sp,先把通用寄存器的sp复制到$k0 ;
再 sw k0,TF_REG29(sp)、sw $2,TF_REG2(sp):保存现场需要使用$v0作为协寄存器到内存的中转寄存器,写到内存时需要sp ,所以在正式保存协寄存器和通用寄存器前先保存这两个寄存器。
可以。
从用户函数 syscall_*() 到内核函数 sys_*() 时,$a1−$a3 未改变,$a0在handle_sys() 的时候被修改为内核函数的地址,但在内核函数 sys_*() 仅为占位符,不会被用到。同时 ...










