|
|
|
|
@ -5,7 +5,7 @@
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 一、实验内容
|
|
|
|
|
## 1、实验内容
|
|
|
|
|
|
|
|
|
|
| 实验 | 名称 | 任务/目标 |
|
|
|
|
|
| :--- | :------------------- | :---------------------------------------------------------- |
|
|
|
|
|
@ -17,8 +17,108 @@
|
|
|
|
|
| Lab6 | 并行与循环优化 | 面向循环的优化(循环变换/并行化等),进一步提升程序性能 |
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
## 2. 参考资料
|
|
|
|
|
|
|
|
|
|
## 二、关于 Rust
|
|
|
|
|
本仓库提供的示例代码和实验文档只是参考。我们非常鼓励大家在阅读当前仓库实现的同时,也结合自己的理解重新设计框架并完成实现,而不是机械照搬。
|
|
|
|
|
|
|
|
|
|
如果希望进一步参考编译相关项目和往届优秀实现,可以查看编译比赛官网的技术支持栏目:<https://compiler.educg.net/#/index?TYPE=26COM>。其中的“备赛推荐”整理了一些编译相关项目,也能看到往届优秀作品的开源实现,这些内容都很值得参考。
|
|
|
|
|
|
|
|
|
|
## 3. 头歌平台协作流程
|
|
|
|
|
|
|
|
|
|
头歌平台的代码托管方式与 GitHub/Gitee 类似。如果你希望基于当前仓库快速开始协作,可以参考下面这套流程。
|
|
|
|
|
|
|
|
|
|
### 3.1 组长 fork 课程仓库
|
|
|
|
|
|
|
|
|
|
组长打开课程仓库页面,点击右上角的 `Fork`,创建你们小组自己的仓库副本。后续组内开发统一基于这个 fork 后的仓库进行。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
### 3.2 组长邀请组员加入仓库
|
|
|
|
|
|
|
|
|
|
fork 完成后,组长进入自己的仓库页面,在右侧可以看到邀请码。把邀请码发给组员即可,组员不需要再 fork 课程仓库。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
### 3.3 组员申请加入,组长审批通过
|
|
|
|
|
|
|
|
|
|
组员拿到邀请码后,可以在页面右上角的 `+` 菜单里选择 `加入项目`,然后提交加入申请。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
申请发出后,组长到个人主页的待办事项中审批成员申请,同意后组员就可以正常参与仓库协作。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
### 3.4 在本地克隆小组仓库并配置远端
|
|
|
|
|
|
|
|
|
|
组长和组员在成功加入小组仓库后,就可以从仓库页面复制 HTTPS 地址,在本地克隆代码:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
下面示例使用 HTTPS 方式:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
git clone <仓库 HTTPS 地址>
|
|
|
|
|
cd nudt-compiler-cpp
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
如果希望后续同步课程仓库更新,可以额外把课程主仓库配置为 `upstream`:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
git remote add upstream https://bdgit.educoder.net/NUDT-compiler/nudt-compiler-cpp.git
|
|
|
|
|
git remote -v
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
配置完成后,常见的远端分工如下:
|
|
|
|
|
|
|
|
|
|
- `origin`:你们小组 fork 后的仓库,日常提交代码、推送分支都使用这个远端。
|
|
|
|
|
- `upstream`:课程主仓库,通常用于查看或同步课程团队发布的更新。
|
|
|
|
|
|
|
|
|
|
如果后续需要同步主仓库更新,可以先抓取远端信息:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
git fetch upstream
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3.5 提交与协作建议
|
|
|
|
|
|
|
|
|
|
借助 Git 进行协作开发,是当前软件开发中非常常见的一种工作方式,也是这门课程里需要大家掌握的基本能力。如果你对 Git 还不太熟悉,可以先看一下网络上的 Git 教程,例如:<https://liaoxuefeng.com/books/git/introduction/index.html>。
|
|
|
|
|
|
|
|
|
|
当然也没有必要一开始学得特别深入,只需要记住常见操作即可,例如 `clone`、`status`、`add`、`commit`、`pull`、`push`、分支切换与合并。遇到具体报错或不会处理的冲突时,可以把现象和命令发给大模型帮你分析。
|
|
|
|
|
|
|
|
|
|
Git Commit 提交的信息建议尽量写清楚,推荐使用下面的格式:
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
<type>(<scope>): <subject>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
常见的 `type` 有:
|
|
|
|
|
|
|
|
|
|
- `feat`:新增功能
|
|
|
|
|
- `fix`:修复 bug
|
|
|
|
|
- `refactor`:重构但不改变外部行为
|
|
|
|
|
- `docs`:文档修改
|
|
|
|
|
- `test`:测试相关
|
|
|
|
|
- `chore`:杂项维护
|
|
|
|
|
|
|
|
|
|
`scope` 用来说明改动的大致范围,例如 `frontend`、`irgen`、`backend`、`test`、`doc`。
|
|
|
|
|
|
|
|
|
|
`subject` 用一句简短的话说明“这次改了什么”。
|
|
|
|
|
|
|
|
|
|
例如:
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
feat(irgen): 支持一元表达式生成
|
|
|
|
|
fix(frontend): 修复空语句解析错误
|
|
|
|
|
docs(doc): 补充实验环境配置说明
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
除了提交代码本身,也推荐大家把头歌平台上的协作功能真正用起来:
|
|
|
|
|
|
|
|
|
|
- `Issue` 适合用来拆分任务、记录 bug、整理讨论结果和跟踪待办。
|
|
|
|
|
- `PR` / `Merge Request` 适合用来做分支合并和代码评审。比较推荐的流程是:每个人在自己的分支上开发,完成一个相对独立的小功能后提交 PR,再由组内其他同学帮忙检查实现思路、代码质量和测试结果。
|
|
|
|
|
|
|
|
|
|
## 4、关于 Rust
|
|
|
|
|
|
|
|
|
|
Rust 是一门由 Mozilla 开发的现代系统级编程语言,其特点在于能够在保证与 C/C++ 相媲美的性能(无垃圾收集和运行时)的同时,通过所有权系统和借用检查器,在编译期杜绝内存安全和并发安全方面的常见错误(如空指针、悬垂指针和数据竞争)。此外,Rust 还提供零成本抽象、模式匹配、包管理器 Cargo 以及友好的编译器错误提示。
|
|
|
|
|
|
|
|
|
|
@ -37,13 +137,13 @@ Rust 是一门由 Mozilla 开发的现代系统级编程语言,其特点在于
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 三、实验环境配置
|
|
|
|
|
## 5、实验环境配置
|
|
|
|
|
|
|
|
|
|
### 3.1 系统建议
|
|
|
|
|
### 5.1 系统建议
|
|
|
|
|
|
|
|
|
|
建议使用 **Ubuntu 22.04** 或 **WSL(Ubuntu 22.04 环境)**。虽然 Rust 在 Windows 和 Linux 上均可方便配置,但后续可能使用 ARM 或 RISC-V 工具链,在 Linux 环境下配置更为便捷。
|
|
|
|
|
|
|
|
|
|
### 3.2 Rust 环境配置
|
|
|
|
|
### 5.2 Rust 环境配置
|
|
|
|
|
|
|
|
|
|
在 Ubuntu 中安装 Rust 环境:
|
|
|
|
|
|
|
|
|
|
@ -59,7 +159,7 @@ rustc --version
|
|
|
|
|
|
|
|
|
|
建议搭配 VSCode 使用,并安装插件 `rust-analyzer`。
|
|
|
|
|
|
|
|
|
|
### 3.3 安装 LLVM 工具链
|
|
|
|
|
### 5.3 安装 LLVM 工具链
|
|
|
|
|
|
|
|
|
|
LLVM 工具链可用于生成中间表示(IR),若输出的 IR 符合 LLVM-IR 语法,可在 IR 层验证中间代码生成和优化的正确性,便于与后端开发解耦。
|
|
|
|
|
|
|
|
|
|
@ -68,7 +168,7 @@ sudo apt update
|
|
|
|
|
sudo apt install -y llvm clang
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3.4 安装 ARM64 交叉编译工具链与 QEMU
|
|
|
|
|
### 5.4 安装 ARM64 交叉编译工具链与 QEMU
|
|
|
|
|
|
|
|
|
|
后续实验将生成 ARM64/AArch64 汇编代码,并使用 ARM64 交叉编译工具链完成汇编与链接;通过 QEMU 用户态模拟器运行生成的 ARM 可执行文件。
|
|
|
|
|
|
|
|
|
|
@ -83,7 +183,7 @@ sudo apt install qemu-user
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 四、目录结构
|
|
|
|
|
## 6、目录结构
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
.
|
|
|
|
|
@ -91,6 +191,8 @@ sudo apt install qemu-user
|
|
|
|
|
│ └── Git Commit Message 规范.md
|
|
|
|
|
├── src
|
|
|
|
|
│ ├── backend
|
|
|
|
|
│ │ ├── peephole
|
|
|
|
|
│ │ ├── schedule
|
|
|
|
|
│ │ ├── mir
|
|
|
|
|
│ │ ├── regalloc
|
|
|
|
|
│ │ ├── asm2string.rs
|
|
|
|
|
|