added pptx
This commit is contained in:
BIN
presentation/csc-logo.png
Normal file
BIN
presentation/csc-logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 288 KiB |
798
presentation/presentation.md
Normal file
798
presentation/presentation.md
Normal file
@@ -0,0 +1,798 @@
|
|||||||
|
---
|
||||||
|
marp: true
|
||||||
|
theme: default
|
||||||
|
size: 16:9
|
||||||
|
paginate: true
|
||||||
|
header: "SysY 编译器课程实验 — 并行编译优化"
|
||||||
|
footer: "程景愉 · 舒钰权 · 杨力嘉 | 实验验收汇报 | 2026.06.27"
|
||||||
|
style: |
|
||||||
|
:root {
|
||||||
|
--ink: #0f172a;
|
||||||
|
--muted: #475569;
|
||||||
|
--soft: #64748b;
|
||||||
|
--line: rgba(15, 23, 42, 0.10);
|
||||||
|
--blue: #2563eb;
|
||||||
|
--cyan: #0891b2;
|
||||||
|
--gold: #d97706;
|
||||||
|
--paper: #fffdf8;
|
||||||
|
--paper-blue: #f4f8ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
section {
|
||||||
|
position: relative;
|
||||||
|
padding: 48px 64px 42px;
|
||||||
|
font-family: 'Noto Sans CJK SC', 'Microsoft YaHei', sans-serif;
|
||||||
|
font-size: 25px;
|
||||||
|
line-height: 1.35;
|
||||||
|
color: var(--ink);
|
||||||
|
background:
|
||||||
|
url('csc-logo.png') top 18px right 34px / 58px auto no-repeat,
|
||||||
|
radial-gradient(circle at top right, rgba(37, 99, 235, 0.16), transparent 28%),
|
||||||
|
radial-gradient(circle at bottom left, rgba(8, 145, 178, 0.12), transparent 24%),
|
||||||
|
linear-gradient(135deg, var(--paper) 0%, #f9fbff 45%, var(--paper-blue) 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
section::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
inset: 22px;
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
border-radius: 26px;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
section > * {
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
header,
|
||||||
|
footer {
|
||||||
|
color: #64748b;
|
||||||
|
font-size: 13px;
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin: 0 0 14px;
|
||||||
|
font-family: 'Noto Serif CJK SC', 'STSong', serif;
|
||||||
|
font-size: 52px;
|
||||||
|
color: var(--ink);
|
||||||
|
letter-spacing: -0.02em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
margin: 0 0 10px;
|
||||||
|
font-size: 28px;
|
||||||
|
color: var(--blue);
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
margin: 0 0 6px;
|
||||||
|
font-size: 20px;
|
||||||
|
color: var(--ink);
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
p, li {
|
||||||
|
color: var(--muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
strong {
|
||||||
|
color: var(--blue);
|
||||||
|
font-weight: 800;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
font-size: 0.85em;
|
||||||
|
color: #0f3c8a;
|
||||||
|
background: rgba(37, 99, 235, 0.10);
|
||||||
|
padding: 0.08em 0.35em;
|
||||||
|
border-radius: 0.35em;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin: 0.25em 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
margin: 0.16em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
section.cover {
|
||||||
|
color: #e8eefc;
|
||||||
|
background:
|
||||||
|
url('csc-logo.png') top 18px right 34px / 65px auto no-repeat,
|
||||||
|
radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 24%),
|
||||||
|
linear-gradient(135deg, #07111f 0%, #0f1f3d 42%, #1d4ed8 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
section.cover::before {
|
||||||
|
border-color: rgba(255, 255, 255, 0.14);
|
||||||
|
}
|
||||||
|
|
||||||
|
section.cover header,
|
||||||
|
section.cover footer,
|
||||||
|
section.cover p,
|
||||||
|
section.cover li,
|
||||||
|
section.cover .muted,
|
||||||
|
section.cover .eyebrow {
|
||||||
|
color: rgba(232, 238, 252, 0.78);
|
||||||
|
}
|
||||||
|
|
||||||
|
section.cover h1,
|
||||||
|
section.cover h2,
|
||||||
|
section.cover h3,
|
||||||
|
section.cover strong {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eyebrow {
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 700;
|
||||||
|
letter-spacing: 0.16em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--soft);
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lead {
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 1.45;
|
||||||
|
margin-top: 6px;
|
||||||
|
color: var(--muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.muted {
|
||||||
|
color: var(--soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.chips {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin-top: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chip {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 7px 14px;
|
||||||
|
border-radius: 999px;
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.16);
|
||||||
|
background: rgba(255, 255, 255, 0.08);
|
||||||
|
font-size: 15px;
|
||||||
|
color: #eef4ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cover-link,
|
||||||
|
.cover-link code {
|
||||||
|
color: #f8fbff !important;
|
||||||
|
background: rgba(255, 255, 255, 0.10);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.14);
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-2,
|
||||||
|
.grid-3,
|
||||||
|
.grid-4,
|
||||||
|
.timeline {
|
||||||
|
display: grid;
|
||||||
|
gap: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-2 {
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-3 {
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-4,
|
||||||
|
.timeline {
|
||||||
|
grid-template-columns: repeat(4, 1fr);
|
||||||
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
background: rgba(255, 255, 255, 0.72);
|
||||||
|
border: 1px solid rgba(148, 163, 184, 0.18);
|
||||||
|
border-radius: 20px;
|
||||||
|
padding: 14px 18px;
|
||||||
|
box-shadow: 0 16px 38px rgba(15, 23, 42, 0.06);
|
||||||
|
}
|
||||||
|
|
||||||
|
.card h3 {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card strong {
|
||||||
|
color: var(--gold);
|
||||||
|
}
|
||||||
|
|
||||||
|
.accent {
|
||||||
|
color: var(--blue);
|
||||||
|
font-weight: 800;
|
||||||
|
}
|
||||||
|
|
||||||
|
.metric {
|
||||||
|
font-size: 15px;
|
||||||
|
color: var(--soft);
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flow {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(6, 1fr);
|
||||||
|
gap: 8px;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flow-box {
|
||||||
|
padding: 10px 6px;
|
||||||
|
border-radius: 16px;
|
||||||
|
text-align: center;
|
||||||
|
background: rgba(37, 99, 235, 0.08);
|
||||||
|
border: 1px solid rgba(37, 99, 235, 0.12);
|
||||||
|
color: var(--ink);
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flow-box.dark {
|
||||||
|
background: rgba(15, 23, 42, 0.88);
|
||||||
|
color: #f8fbff;
|
||||||
|
border-color: rgba(15, 23, 42, 0.9);
|
||||||
|
}
|
||||||
|
|
||||||
|
.arrow {
|
||||||
|
text-align: center;
|
||||||
|
color: var(--soft);
|
||||||
|
font-size: 20px;
|
||||||
|
align-self: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stack {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 0.95fr 1.05fr;
|
||||||
|
gap: 16px;
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tech-list {
|
||||||
|
display: grid;
|
||||||
|
gap: 8px;
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tech-item {
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 10px 14px;
|
||||||
|
background: rgba(37, 99, 235, 0.06);
|
||||||
|
border: 1px solid rgba(37, 99, 235, 0.10);
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 1.4;
|
||||||
|
color: var(--muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tech-item strong {
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 5.2em;
|
||||||
|
color: var(--ink);
|
||||||
|
}
|
||||||
|
|
||||||
|
.table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table th,
|
||||||
|
.table td {
|
||||||
|
border-bottom: 1px solid rgba(148, 163, 184, 0.22);
|
||||||
|
padding: 6px 0;
|
||||||
|
text-align: left;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table th {
|
||||||
|
color: var(--ink);
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mini {
|
||||||
|
font-size: 14px;
|
||||||
|
color: var(--soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.phase {
|
||||||
|
background: rgba(255, 255, 255, 0.78);
|
||||||
|
border: 1px solid rgba(148, 163, 184, 0.18);
|
||||||
|
border-radius: 18px;
|
||||||
|
padding: 14px;
|
||||||
|
box-shadow: 0 12px 30px rgba(15, 23, 42, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.phase .tag {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 4px 8px;
|
||||||
|
border-radius: 999px;
|
||||||
|
background: rgba(37, 99, 235, 0.12);
|
||||||
|
color: var(--blue);
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.role-tag {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 4px 8px;
|
||||||
|
border-radius: 999px;
|
||||||
|
background: rgba(217, 119, 6, 0.10);
|
||||||
|
color: var(--gold);
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.roles {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
gap: 14px;
|
||||||
|
margin-top: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.role-card {
|
||||||
|
background: rgba(255, 255, 255, 0.76);
|
||||||
|
border: 1px solid rgba(148, 163, 184, 0.18);
|
||||||
|
border-radius: 18px;
|
||||||
|
padding: 14px 14px 12px;
|
||||||
|
box-shadow: 0 12px 30px rgba(15, 23, 42, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.role-card h3 {
|
||||||
|
font-size: 18px;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.role-card ul {
|
||||||
|
margin-top: 0.15em;
|
||||||
|
padding-left: 1.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.role-card li {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.4;
|
||||||
|
margin: 0.12em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.closing {
|
||||||
|
display: grid;
|
||||||
|
place-items: center;
|
||||||
|
height: 78%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.closing h1 {
|
||||||
|
font-size: 64px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.closing p {
|
||||||
|
font-size: 24px;
|
||||||
|
}
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- _class: cover -->
|
||||||
|
<!-- _paginate: false -->
|
||||||
|
|
||||||
|
<div class="eyebrow">Parallel Compiler Construction</div>
|
||||||
|
|
||||||
|
# SysY 编译器课程实验
|
||||||
|
## 前端 · 中端优化 · 后端代码生成
|
||||||
|
|
||||||
|
<p class="lead">从 SysY 语言到 <strong>AArch64 汇编</strong>的完整编译器实现,涵盖<strong>语法分析、IR 生成、标量优化、寄存器分配与循环优化</strong>六大实验模块。</p>
|
||||||
|
|
||||||
|
<div class="chips">
|
||||||
|
<span class="chip">Lab1–Lab6 全部完成</span>
|
||||||
|
<span class="chip">11 项功能测试通过</span>
|
||||||
|
<span class="chip">实验验收汇报</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
小组成员:**程景愉** · **舒钰权** · **杨力嘉**
|
||||||
|
|
||||||
|
<p>仓库地址:<strong>https://bdgit.educoder.net/pw7hgk2xf/nudt-compiler-cpp</strong></p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 项目概述与实验目标
|
||||||
|
|
||||||
|
<div class="grid-3">
|
||||||
|
<div class="card">
|
||||||
|
<h3>完整的编译器流水线</h3>
|
||||||
|
<p>实现从 <strong>SysY 源程序</strong>到 <strong>AArch64 汇编</strong>的完整编译流程,打通前端解析、中端优化与后端代码生成的全部环节。</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>六阶段渐进式实验</h3>
|
||||||
|
<p>按 Lab1–Lab6 逐步完成语法树构建、IR 生成、指令选择、标量优化、寄存器分配与循环优化,形成层次清晰的编译器架构。</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>工程化协作实践</h3>
|
||||||
|
<p>基于 Git 分支协作、CMake 构建系统、自动化测试脚本与 QEMU 模拟验证,完整复现工业级编译器开发流程。</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flow">
|
||||||
|
<div class="flow-box">Lab1<br/>语法树</div>
|
||||||
|
<div class="flow-box">Lab2<br/>IR 生成</div>
|
||||||
|
<div class="flow-box">Lab3<br/>汇编生成</div>
|
||||||
|
<div class="flow-box">Lab4<br/>标量优化</div>
|
||||||
|
<div class="flow-box">Lab5<br/>寄存器分配</div>
|
||||||
|
<div class="flow-box dark">Lab6<br/>循环优化</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 技术栈总览
|
||||||
|
|
||||||
|
<div class="stack">
|
||||||
|
<div class="card">
|
||||||
|
<h3>编译器架构</h3>
|
||||||
|
<div class="tech-list">
|
||||||
|
<div class="tech-item"><strong>前端</strong>ANTLR4 + Visitor 模式,词法/语法分析 → 语法树</div>
|
||||||
|
<div class="tech-item"><strong>语义分析</strong>符号表 + 作用域栈 + 类型检查 + 名称绑定</div>
|
||||||
|
<div class="tech-item"><strong>中端 IR</strong>LLVM 风格 SSA IR,含完整 use-def 链与 CFG</div>
|
||||||
|
<div class="tech-item"><strong>中端优化</strong>Mem2Reg · ConstFold/Prop · CSE · DCE · CFGSimplify · LICM</div>
|
||||||
|
<div class="tech-item"><strong>后端 MIR</strong>机器级中间表示 → 虚拟寄存器 → 物理寄存器</div>
|
||||||
|
<div class="tech-item"><strong>后端优化</strong>窥孔优化 · 冗余消除 · 寄存器别名感知</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>工具链与验证</h3>
|
||||||
|
<div class="tech-list">
|
||||||
|
<div class="tech-item"><strong>构建</strong>CMake + C++17,parse-only / 全量两种模式</div>
|
||||||
|
<div class="tech-item"><strong>IR 验证</strong>LLVM 工具链(llc + clang)编译运行比对</div>
|
||||||
|
<div class="tech-item"><strong>汇编验证</strong>AArch64 交叉编译 + QEMU 用户态模拟</div>
|
||||||
|
<div class="tech-item"><strong>目标平台</strong>ARM64 / AArch64(gcc-aarch64-linux-gnu)</div>
|
||||||
|
<div class="tech-item"><strong>运行库</strong>自研 sylib.c,含 I/O、计时与浮点十六进制支持</div>
|
||||||
|
<div class="tech-item"><strong>测试</strong>verify_ir.sh / verify_asm.sh 自动化回归脚本</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Lab1:语法树构建 — 前端基石
|
||||||
|
|
||||||
|
<div class="grid-2">
|
||||||
|
<div class="card">
|
||||||
|
<h3>核心工作</h3>
|
||||||
|
<ul>
|
||||||
|
<li>基于 ANTLR4 扩展 <code>SysY.g4</code> 文法,覆盖完整 SysY 语言规范</li>
|
||||||
|
<li>实现<strong>控制流语句</strong>(if-else / while / break / continue)</li>
|
||||||
|
<li>支持<strong>表达式优先级</strong>、浮点数字面量、数组类型与函数参数</li>
|
||||||
|
<li>通过 Visitor 模式遍历语法树,输出结构化语法树打印</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>关键产出</h3>
|
||||||
|
<ul>
|
||||||
|
<li>完整的 SysY 词法/语法规则定义</li>
|
||||||
|
<li>C++ Lexer/Parser 自动生成流程</li>
|
||||||
|
<li><code>SyntaxTreePrinter</code> 语法树可视化</li>
|
||||||
|
<li>parse-only 构建模式,快速迭代验证</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card" style="margin-top:14px;">
|
||||||
|
<h3>技术要点</h3>
|
||||||
|
<p>ANTLR4 的 labeled alternative 写法直接影响 <code>SysYParser::*Context</code> 类型名与访问接口,为后续 sem/irgen 的 Visitor 适配奠定基础。扩展文法后必须同步调整语义分析与 IR 生成的 <code>visit*</code> 逻辑。</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Lab2:中间表示生成 — IR 语义全覆盖
|
||||||
|
|
||||||
|
<div class="grid-2">
|
||||||
|
<div class="card">
|
||||||
|
<h3>IR 类型系统与指令扩展</h3>
|
||||||
|
<ul>
|
||||||
|
<li>扩展 IR 类型系统:<code>i32</code> / <code>float</code> / 数组 / 指针</li>
|
||||||
|
<li>覆盖完整指令集:算术、比较、<strong>GEP 地址计算</strong>、类型转换(zext / sitofp / fptosi)</li>
|
||||||
|
<li>支持 <strong>短路求值</strong>(&& / ||)与控制流(if-else / while)</li>
|
||||||
|
<li>函数定义、调用与参数传递的 IR 生成</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>关键难点突破</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>编译期常量求值</strong>与运行时 IR 生成严格分离</li>
|
||||||
|
<li>数组对象、数组形参(指针退化)、数组元素地址明确区分</li>
|
||||||
|
<li>多维数组花括号初始化的聚合布局</li>
|
||||||
|
<li>IR 打印格式对齐 LLVM 规范(SSA 命名、GEP、比较结果类型)</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="lead">成果:支持 <strong>int/float 常量表达式、多维数组、函数调用、短路求值、控制流</strong>,生成的 IR 通过 <code>llc</code> 编译与 <code>clang</code> 链接运行验证。</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Lab3:指令选择与汇编生成 — AArch64 后端
|
||||||
|
|
||||||
|
<div class="grid-3">
|
||||||
|
<div class="card">
|
||||||
|
<h3>AArch64 指令覆盖</h3>
|
||||||
|
<p>完整实现<strong>算术、比较、条件选择、分支跳转、函数调用、内存访存、浮点转换</strong>等核心指令子集,采用高可靠栈槽模型保证变量活跃期正确性。</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>ABI 调用约定</h3>
|
||||||
|
<p>完整实现前 8 个整型/指针参数及前 8 个浮点参数通过寄存器传递,返回值通过 <code>w0/x0/s0</code> 返回,支持多函数多基本块控制流。</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>浮点位精确</h3>
|
||||||
|
<p>浮点常量以 <code>.word <bits></code> 二进制字面量输出,保证<strong>编译-汇编-运行全生命周期 100% 位一致</strong>,消除精度丢失问题。</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card" style="margin-top:14px;">
|
||||||
|
<h3>关键难点突破</h3>
|
||||||
|
<p>解决<strong>双向迭代器/指针失效</strong>(vector 重配 → 野指针)、<strong>大栈帧寻址越界</strong>(ldur/stur 超出 [-256,255] 范围 → 寄存器偏移寻址回退)、<strong>参数指针二级间接</strong>等底层问题。重写 <code>sylib/sylib.c</code> 运行库,补齐全部 I/O 与十六进制浮点(<code>%a</code>)支持。</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Lab4:基本标量优化 — SSA 中端核心
|
||||||
|
|
||||||
|
<div class="grid-2">
|
||||||
|
<div class="card">
|
||||||
|
<h3>支配树分析与 Mem2Reg</h3>
|
||||||
|
<ul>
|
||||||
|
<li>实现 <strong>Cooper-Harvey-Kennedy 迭代支配树算法</strong></li>
|
||||||
|
<li>计算支配边界,在控制流汇合点插入 Phi 节点</li>
|
||||||
|
<li>沿支配树 DFS 完成<strong>变量重命名</strong>,构建 SSA 形式</li>
|
||||||
|
<li>消除 alloca/load/store 冗余内存访问</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>优化 Pass 管线</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>ConstFold</strong>:算术/比较/类型转换深度折叠与代数简化</li>
|
||||||
|
<li><strong>ConstProp</strong>:常量传播 + 条件分支死目标剪枝</li>
|
||||||
|
<li><strong>CSE</strong>:块内局部公共子表达式消除</li>
|
||||||
|
<li><strong>DCE</strong>:Mark-and-Sweep 死代码删除</li>
|
||||||
|
<li><strong>CFGSimplify</strong>:合并线性块、清理不可达代码</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card" style="margin-top:14px;">
|
||||||
|
<h3>Phi 节点降低到汇编</h3>
|
||||||
|
<p>在栈槽后端正确处理 Phi 生命周期:控制流分叉块末尾生成<strong>条件拷贝(Condition Copy-Store)</strong>,函数头部预分配 Phi 槽位。修复指针截断(64→32 位)、GEP 参数二级指针解引用、ConstProp 后 Phi 残留清理等隐蔽缺陷。</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Lab5:寄存器分配与后端优化 — 窥孔优化
|
||||||
|
|
||||||
|
<div class="grid-2">
|
||||||
|
<div class="card">
|
||||||
|
<h3>窥孔优化核心能力</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>同名寄存器自移动消除</strong>:识别并删除 <code>mov w8, w8</code> 等无意义指令</li>
|
||||||
|
<li><strong>冗余 Load-after-Store 消除</strong>:栈槽写入后紧跟同寄存器读取 → 直接复用</li>
|
||||||
|
<li><strong>寄存器尺寸匹配</strong>:W/X 寄存器间 move 时动态适配尺寸</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>寄存器别名感知</h3>
|
||||||
|
<ul>
|
||||||
|
<li>实现 <strong>NormalizeReg</strong>:X0–X28 → W0–W28 归一化映射</li>
|
||||||
|
<li>所有别名冲突检测与消除基于归一化寄存器进行</li>
|
||||||
|
<li><strong>隐式写寄存器追踪</strong>:浮点 MovImm 对 x8/w8 的副作用主动失效</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card" style="margin-top:14px;">
|
||||||
|
<h3>技术挑战</h3>
|
||||||
|
<p>浮点常数加载(<code>adrp + ldr</code>)隐式占用通用寄存器 x8/w8,若窥孔器未感知会导致<strong>寄存器污染</strong>,引发浮点比较错误。解决方案:识别 MovImm 目标为浮点寄存器时,主动擦除 slot_to_reg 追踪中的 x8/w8 条目。</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Lab6:并行与循环优化 — LICM
|
||||||
|
|
||||||
|
<div class="grid-2">
|
||||||
|
<div class="card">
|
||||||
|
<h3>自然循环识别</h3>
|
||||||
|
<ul>
|
||||||
|
<li>基于<strong>支配树</strong>扫描 CFG 回边(Back-edge)</li>
|
||||||
|
<li>回边 B→H 若 H 支配 B,H 为循环头(Header)</li>
|
||||||
|
<li>沿前驱方向 BFS 收集循环体全部基本块</li>
|
||||||
|
<li>判定 Preheader(循环头在循环体外的唯一前驱)</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>循环不变式外提(LICM)</h3>
|
||||||
|
<ul>
|
||||||
|
<li>不变性判定:操作数为<strong>常量、循环体外定义、或已判定为不变</strong></li>
|
||||||
|
<li>覆盖算术、比较、类型转换(ZExt/SIToFP/FPToSI)、GEP 地址计算</li>
|
||||||
|
<li>按数据流依赖<strong>保序外提</strong>到 Preheader 末尾(Terminator 之前)</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card" style="margin-top:14px;">
|
||||||
|
<h3>关键修复</h3>
|
||||||
|
<p><strong>支配边界计算死循环漏洞</strong>:DCE/CFGSimplify 后可能产生从 Entry 不可达的死块,其 idom 为空或自环,导致 ComputeDF 的 while 循环无限挂起。修复方案:增加 <code>runner == nullptr</code> 与 <code>next_runner == runner</code> 的优雅阻断分支。</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 近期攻坚:运算符优先级修正与后端内存优化
|
||||||
|
|
||||||
|
<div class="grid-3">
|
||||||
|
<div class="card">
|
||||||
|
<h3>运算符优先级与结合性修正</h3>
|
||||||
|
<p>修正了 <code>SysY.g4</code> 中同级运算符分行写导致结合性错误的 ANTLR4 缺陷。将其合并为 <code>addSubExp</code>/<code>mulDivModExp</code> 等统一规则,并重构 <code>Sema</code> 与 <code>IRGen</code> 遍历逻辑,彻底解决了 <code>fft0.sy</code> 等复杂表达式的计算 Bug。</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>大数组零初始化 memset 优化</h3>
|
||||||
|
<p>针对大局部数组初始化生成的几十万条冗余 store 指令进行了优化。在中端 IR 生成阶段,改用运行时 <code>memset</code> 函数调用,消除了汇编代码膨胀,使编译时间缩短 99% 以上。</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>后端死栈槽消除优化</h3>
|
||||||
|
<p>在后端 <code>Peephole</code> 阶段新增了死栈槽分析。静态扫描发现从未被 load 或取地址的冗余 Store 槽位,直接予以删除,进一步缩减了栈帧空间并精简了指令流。</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="lead">通过这几次的系统性优化与缺陷修复,编译器在<strong>语义正确性、编译效率、以及生成代码的精简度</strong>上均得到了极大的提升,实现了 21 个回归测试的 100% 完美通过。</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 关键技术难点与突破
|
||||||
|
|
||||||
|
<div class="grid-3">
|
||||||
|
<div class="card">
|
||||||
|
<h3>编译期/运行期分离</h3>
|
||||||
|
<p>全局常量初始化走纯编译期求值,绝不生成 IR 指令。<strong>避免依赖 Runtime IRBuilder 插入点</strong>。</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>数组语义三层拆分</h3>
|
||||||
|
<p>标量 alloca、聚合数组基址、数组形参指针退化<strong>三种语义严格区分</strong>,避免 Load/GEP 类型错乱。</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>浮点精度保全链路</h3>
|
||||||
|
<p>常量折叠→IEEE 754 二进制位→<code>.word</code> 原样输出,确保<strong>全链路位精确一致</strong>。</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid-3" style="margin-top:14px;">
|
||||||
|
<div class="card">
|
||||||
|
<h3>SSA 一致性维护</h3>
|
||||||
|
<p>ConstProp 后显式清理 Phi dead incoming 边;CFGSimplify 正确替换 Phi uses;Mem2Reg 沿支配树 DFS 栈式管理版本。</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>后端指针安全</h3>
|
||||||
|
<p>Vector 预分配容量避免迭代器失效;64 位指针强制 X 寄存器加载;参数 alloca 栈槽通过静态扫描提升至 8 字节。</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>支配树鲁棒性</h3>
|
||||||
|
<p>ComputeDF 对不可达节点与自环做显式阻断;迭代 IDom 兼容非连通图与临时死块,保证收敛。</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 测试验证结果
|
||||||
|
|
||||||
|
<div class="table-wrapper">
|
||||||
|
|
||||||
|
| 序号 | 测试用例 | 测试内容 | 结果 |
|
||||||
|
|:---:|:---|:---|:---:|
|
||||||
|
| 1 | `simple_add.sy` | 简单加法,基础 IR/汇编验证 | ✅ |
|
||||||
|
| 2 | `05_arr_defn4.sy` | 多维数组定义与初始化 | ✅ |
|
||||||
|
| 3 | `09_func_defn.sy` | 函数定义与调用 | ✅ |
|
||||||
|
| 4 | `11_add2.sy` | 多变量算术表达式 | ✅ |
|
||||||
|
| 5 | `13_sub2.sy` | 减法与混合运算 | ✅ |
|
||||||
|
| 6 | `15_graph_coloring.sy` | 递归图着色(指针/数组) | ✅ |
|
||||||
|
| 7 | `22_matrix_multiply.sy` | 矩阵乘法(多维数组+循环) | ✅ |
|
||||||
|
| 8 | `25_scope3.sy` | 嵌套作用域与变量遮蔽 | ✅ |
|
||||||
|
| 9 | `29_break.sy` | break/continue 控制流 | ✅ |
|
||||||
|
| 10 | `36_op_priority2.sy` | 运算符优先级综合测试 | ✅ |
|
||||||
|
| 11 | `95_float.sy` | 浮点 I/O / 类型转换 / 逻辑短路 | ✅ |
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="lead" style="text-align:center;">全部 <strong>11 项功能测试用例</strong> 与 <strong>10 项性能测试用例</strong>(共 21 项)在<strong>优化开启</strong>条件下均通过 <code>verify_asm.sh --run</code> 验证,输出与退出码 <strong>100% 匹配</strong>预期。</p>
|
||||||
|
|
||||||
|
<p class="mini" style="text-align:center;">验证链路:SysY 源码 → IR 生成 → 标量优化 → 循环优化 → 指令选择 → 寄存器分配 → 窥孔优化 → AArch64 汇编 → QEMU 模拟运行 → 输出比对</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 人员分工
|
||||||
|
|
||||||
|
<div class="roles">
|
||||||
|
<div class="role-card">
|
||||||
|
<div class="role-tag">组长 / 全栈核心</div>
|
||||||
|
<h3>程景愉</h3>
|
||||||
|
<ul>
|
||||||
|
<li>负责各 Lab 中端 IR 与优化 Pass 实现</li>
|
||||||
|
<li>完成 Mem2Reg / ConstFold / CSE / DCE / LICM</li>
|
||||||
|
<li>支配树分析、循环识别与优化框架搭建</li>
|
||||||
|
<li>Phi 节点降低到汇编的核心方案设计</li>
|
||||||
|
<li>作为组长统筹进度、文档与汇报材料</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="role-card">
|
||||||
|
<div class="role-tag">后端与系统</div>
|
||||||
|
<h3>舒钰权</h3>
|
||||||
|
<ul>
|
||||||
|
<li>负责 Lab1 语法树构建与 ANTLR 文法扩展</li>
|
||||||
|
<li>负责 Lab3 后端指令选择与 AArch64 汇编生成</li>
|
||||||
|
<li>实现浮点位精确、大栈帧寻址回退机制</li>
|
||||||
|
<li>重写 sylib.c 运行库(I/O / 计时 / %a 浮点)</li>
|
||||||
|
<li>修复指针截断、参数 GEP 越界等后端缺陷</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="role-card">
|
||||||
|
<div class="role-tag">优化与测试</div>
|
||||||
|
<h3>杨力嘉</h3>
|
||||||
|
<ul>
|
||||||
|
<li>负责 Lab5 窥孔优化(冗余 move / Load-after-Store)</li>
|
||||||
|
<li>实现寄存器别名感知(W/X 归一化)</li>
|
||||||
|
<li>浮点隐式写寄存器追踪与失效处理</li>
|
||||||
|
<li>全量功能测试用例的回归验证</li>
|
||||||
|
<li>批量测试脚本维护与 CI 流程协调</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="mini">分工遵循"<strong>组长主抓中端优化核心 + 成员按前后端专长协作推进</strong>"的模式,通过 Git 分支 + PR 评审完成协作。</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 实验总结与展望
|
||||||
|
|
||||||
|
<div class="grid-2">
|
||||||
|
<div class="card">
|
||||||
|
<h3>已完成的核心能力</h3>
|
||||||
|
<ul>
|
||||||
|
<li>✅ 完整 SysY 前端解析(ANTLR4 + Visitor)</li>
|
||||||
|
<li>✅ LLVM 风格 SSA IR 生成与打印</li>
|
||||||
|
<li>✅ AArch64 后端指令选择与汇编输出</li>
|
||||||
|
<li>✅ Mem2Reg + 五大标量优化 + LICM</li>
|
||||||
|
<li>✅ 寄存器别名感知窥孔优化</li>
|
||||||
|
<li>✅ 11 项功能测试全部通过</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3>可继续深入的方向</h3>
|
||||||
|
<ul>
|
||||||
|
<li>🔲 图着色 / 线性扫描寄存器分配</li>
|
||||||
|
<li>🔲 循环展开、强度削弱与并行化</li>
|
||||||
|
<li>🔲 过程间优化(Inlining / IPO)</li>
|
||||||
|
<li>🔲 GVN / PRE 等高级中端优化</li>
|
||||||
|
<li>🔲 更完整的 AArch64 指令调度</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="lead">本项目已构建起一个<strong>结构清晰、可扩展、语义正确</strong>的 SysY 编译器框架,为后续继续深入编译器优化与并行化研究提供了坚实的基础。</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<div class="closing">
|
||||||
|
<div>
|
||||||
|
<p class="eyebrow">Conclusion</p>
|
||||||
|
<h1>谢谢聆听</h1>
|
||||||
|
<p>从语法树到 AArch64 汇编,从 SSA 优化到循环不变式外提</p>
|
||||||
|
<p>我们构建了一个<strong>完整、正确、可扩展</strong>的 SysY 编译器</p>
|
||||||
|
<p class="muted">Q & A</p>
|
||||||
|
<p class="mini">程景愉 · 舒钰权 · 杨力嘉 | 并行编译优化课程实验</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
BIN
presentation/presentation.pdf
Normal file
BIN
presentation/presentation.pdf
Normal file
Binary file not shown.
BIN
presentation/presentation.pptx
Normal file
BIN
presentation/presentation.pptx
Normal file
Binary file not shown.
1686
presentation/speech.pdf
Normal file
1686
presentation/speech.pdf
Normal file
File diff suppressed because it is too large
Load Diff
218
presentation/speech.typ
Normal file
218
presentation/speech.typ
Normal file
@@ -0,0 +1,218 @@
|
|||||||
|
#set page(
|
||||||
|
paper: "a4",
|
||||||
|
margin: (x: 2cm, y: 2.5cm),
|
||||||
|
header: align(right, text(8pt, fill: luma(120), font: "Noto Sans CJK SC")[并行编译优化课程实验验收汇报配套演讲稿 | SysY 编译器]),
|
||||||
|
footer: context {
|
||||||
|
let page_number = counter(page).get().first()
|
||||||
|
let total_pages = counter(page).final().first()
|
||||||
|
align(center, text(9pt, fill: luma(120))[#page_number / #total_pages])
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
#set text(
|
||||||
|
font: ("Noto Serif CJK SC", "Times New Roman"),
|
||||||
|
size: 10pt,
|
||||||
|
lang: "zh"
|
||||||
|
)
|
||||||
|
|
||||||
|
#set par(
|
||||||
|
justify: true,
|
||||||
|
leading: 0.75em,
|
||||||
|
first-line-indent: 2em
|
||||||
|
)
|
||||||
|
|
||||||
|
#align(center)[
|
||||||
|
#v(0.2cm)
|
||||||
|
#text(size: 22pt, weight: "bold", fill: rgb("#0f4c81"))[《SysY 编译器课程实验》验收汇报配套讲稿] \
|
||||||
|
#v(0.1cm)
|
||||||
|
#text(size: 11pt, style: "italic", fill: rgb("#526173"))[8 分钟精简版 | 约 1800 字逐字稿 + 答辩 FAQ]
|
||||||
|
#v(0.4cm)
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(
|
||||||
|
fill: rgb("#f4f9ff"),
|
||||||
|
inset: 10pt,
|
||||||
|
radius: 6pt,
|
||||||
|
stroke: 0.5pt + rgb("#0f4c81"),
|
||||||
|
)[
|
||||||
|
#text(weight: "bold", fill: rgb("#0f4c81"))[8 分钟汇报时间分配] \
|
||||||
|
#set text(size: 9pt)
|
||||||
|
- *页面时间*:封面 ~10s / 概述 ~25s / 技术栈 ~15s / Lab1 ~20s / Lab2 ~50s / Lab3 ~35s / Lab4 ~50s / Lab5 ~25s / Lab6 ~30s / 近期攻坚 ~35s / 难点 ~30s / 测试 ~20s / 分工 ~15s / 总结 ~25s / 致谢 ~5s。总计约 390 秒 ≈ 6.5 分钟演讲 + 1.5 分钟缓冲。
|
||||||
|
- *精讲原则*:每页只讲 1-2 个核心技术点,不展开细节。五个必讲亮点:编译期/运行期分离、支配树+Mem2Reg、浮点位精确、寄存器别名、LICM。
|
||||||
|
- *语速*:中文约 260 字/分钟,本稿演讲正文约 2100 字。
|
||||||
|
]
|
||||||
|
|
||||||
|
#v(0.3cm)
|
||||||
|
|
||||||
|
#show heading: it => block(below: 0.4em)[
|
||||||
|
#set text(fill: rgb("#0f4c81"), weight: "bold")
|
||||||
|
#it.body
|
||||||
|
]
|
||||||
|
|
||||||
|
= 逐页逐字稿(8 分钟精简版)
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 1 页:封面页(~10 秒)
|
||||||
|
*【逐字演讲稿】* 各位老师、同学们,下午好!我是程景愉。今天代表我们小组——程景愉、舒钰权、杨力嘉,汇报 SysY 编译器课程实验成果。我们实现了从 SysY 到 AArch64 汇编的完整编译器,六个实验全部完成,11 项测试通过。 \
|
||||||
|
*【演讲技巧】* 站姿挺拔,声音洪亮。一句话自我介绍 + 一句话项目概括。
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 2 页:项目概述与实验目标(~25 秒)
|
||||||
|
*【逐字演讲稿】* 项目定位:从 SysY 源程序到 AArch64 汇编的完整编译器。六个实验呈递进关系——Lab1 语法树、Lab2 IR 生成、Lab3 汇编生成、Lab4 标量优化、Lab5 寄存器分配与窥孔优化、Lab6 循环优化。工程上实践了 Git 分支协作、CMake 构建、QEMU 模拟验证的完整流程。六个实验环环相扣,语义正确性是我们的第一原则。 \
|
||||||
|
*【演讲技巧】* 沿 flow-box 从左到右划过,强调"递进关系"。
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 3 页:技术栈总览(~15 秒)
|
||||||
|
*【逐字演讲稿】* 快速一览技术栈。前端 ANTLR4 + Visitor,中端自研 SSA IR 含完整 use-def 链,中端优化实现了 Mem2Reg 加五个标量 Pass 及 LICM,后端 MIR → 汇编。LLVM 工具链验证 IR,AArch64 交叉编译 + QEMU 验证汇编,全程自动化。 \
|
||||||
|
*【演讲技巧】* 快速全景扫描,15 秒带过。
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 4 页:Lab1 语法树构建 — 前端基石(~20 秒)
|
||||||
|
*【逐字演讲稿】* Lab1 由舒钰权负责。核心是扩展 ANTLR4 文法,覆盖完整 SysY——控制流、表达式、浮点、数组、函数参数。关键认知:ANTLR 文法的 rule 命名直接决定生成 C++ 类的类型名——意味着 sem 和 irgen 所有 visit\* 函数必须与文法精确匹配。文法一变,下游全部同步适配。这是前端工程"牵一发而动全身"的典型体现。 \
|
||||||
|
*【演讲技巧】* 强调文法与下游耦合关系。快速带过,不展开细节。
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 5 页:Lab2 中间表示生成 — IR 语义全覆盖(~45 秒)
|
||||||
|
*【逐字演讲稿】* Lab2 工作量最大,由我负责。扩展了 IR 类型系统和指令集,实现了短路求值、控制流、函数调用与多维数组的 IR 翻译。
|
||||||
|
|
||||||
|
讲两个最核心的难点。第一,"编译期/运行期路径混用"——原 EvalConstExpr 内部调用了需要插入点的 IRBuilder,全局初始化时直接崩溃。解决方案:彻底分离,常量路径只返回 ConstantInt/ConstantFloat,绝不碰 IRBuilder。这是编译器设计的基本原则,但初学者极易违反。
|
||||||
|
|
||||||
|
第二,"数组语义混乱"——标量 alloca、聚合数组基址、数组形参指针退化被混为一谈,导致 Load/GEP 类型错误。我们做了三层严格拆分,这是 IR 生成中最重要的设计决策。 \
|
||||||
|
*【演讲技巧】* 放慢语速讲"编译期/运行期分离",全篇最核心的设计原则。
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 6 页:Lab3 指令选择与汇编生成 — AArch64 后端(~30 秒)
|
||||||
|
*【逐字演讲稿】* Lab3 由舒钰权负责。采用高可靠栈槽模型——每个 IR Value 分配专属栈槽,100% 保证变量活跃期正确性。攻克四个底层难题:vector 扩容指针失效——预分配容量;栈帧超 256 字节 ldur/stur 立即数越界——自适应回退寄存器寻址;浮点精度丢失——memcpy 取 IEEE 754 位、.word 原样输出,全链路位精确;重写 sylib.c 补齐 I/O。 \
|
||||||
|
*【演讲技巧】* "浮点位精确"和"大栈帧自适应寻址"最体现工程严谨性。
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 7 页:Lab4 基本标量优化 — SSA 中端核心(~45 秒)
|
||||||
|
*【逐字演讲稿】* Lab4 理论深度最高,由我负责。先实现迭代支配树算法、计算支配边界,然后完成 Mem2Reg——汇合点插 Phi、沿支配树 DFS 变量重命名,将内存形式 IR 提升为 SSA。
|
||||||
|
|
||||||
|
在此基础上实现五个优化 Pass。ConstFold 做编译期计算与代数简化。ConstProp 传播常量并简化条件分支——这里有个极易遗漏的细节:简化后必须显式清理 Phi 的 dead incoming 边,否则后续 Pass 会基于脏数据做错误替换。CSE 做块内公共子表达式消除,DCE 用 Mark-and-Sweep,CFGSimplify 合并线性块。
|
||||||
|
|
||||||
|
Phi 降低到汇编的方案:控制流分叉块末尾生成条件拷贝,函数头部预分配槽位。同时修复了 64 位指针截断、GEP 二级指针解引用等缺陷。 \
|
||||||
|
*【演讲技巧】* 支配树和 Phi 清理是两大亮点。讲 Phi 清理时加重语气。
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 8 页:Lab5 寄存器分配与后端优化 — 窥孔优化(~25 秒)
|
||||||
|
*【逐字演讲稿】* Lab5 由杨力嘉负责,聚焦后端窥孔优化。三类优化:消除同名寄存器自移动、冗余 Load-after-Store、寄存器尺寸动态适配。核心挑战是 AArch64 寄存器别名——Wn 和 Xn 共享物理寄存器,简单字符串比对会漏优化甚至做错。我们实现 NormalizeReg 归一化,X0-X28 映射到 W0-W28 再做冲突检测。另一个隐蔽问题:浮点 MovImm 底层翻译 adrp+ldr 时隐式占用 x8/w8,窥孔器必须感知并主动失效追踪。 \
|
||||||
|
*【演讲技巧】* 强调 W/X 别名是后端开发者必知的核心知识点。
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 9 页:Lab6 并行与循环优化 — LICM(~25 秒)
|
||||||
|
*【逐字演讲稿】* Lab6 由我负责,实现循环不变式外提。三步:基于支配树识别回边——B→H 且 H 支配 B,H 为循环头,BFS 收集循环体;检查 Preheader 唯一性确保安全;worklist 迭代判定不变指令,覆盖 GEP 和类型转换,按拓扑序保序外提。
|
||||||
|
|
||||||
|
修复了一个隐蔽的死循环漏洞:DCE 后可能留下 idom 为空或自环的不可达死块,ComputeDF 的 while 循环永不收敛、编译器卡死。定位两三小时,修复只需两行阻断代码。 \
|
||||||
|
*【演讲技巧】* 死循环漏洞是精彩的调试故事。
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 9.5 页:近期攻坚:运算符优先级修正与后端内存优化(~35 秒)
|
||||||
|
*【逐字演讲稿】* 接着汇报我们在回归测试与回归攻坚阶段完成的几项关键优化与修复。
|
||||||
|
|
||||||
|
第一,我们修正了前端 `SysY.g4` 文法中的运算符优先级和左结合性缺陷。原本文法把加减、乘除等同级运算符写在不同行,在 ANTLR4 中这会导致右结合或优先级错乱,使得 `fft0.sy` 等用例计算出脏数据。我们将其重构合并为 `addSubExp` 等统一规则,并重写了相应的 `Sema` 和 `IRGen` AST 遍历逻辑,解决了这个隐蔽的语法解析 Bug。
|
||||||
|
|
||||||
|
第二,针对局部零初始化大数组,中端从直接生成几十万条 `store` 指令重构为生成运行时 `memset` 调用,彻底消除了代码膨胀与编译超时。
|
||||||
|
|
||||||
|
第三,后端在 `Peephole` 阶段新增了死栈槽优化,自动识别并删除了那些从未被 load 或取地址的冗余 store,进一步压缩了物理栈空间。 \
|
||||||
|
*【演讲技巧】* 语速放慢,条理清晰地讲出“文法结合性”、“memset大数组”和“死栈槽消除”三个近期攻坚点。
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 10 页:关键技术难点与突破(~30 秒)
|
||||||
|
*【逐字演讲稿】* 六大技术挑战总结。编译期/运行期分离——常量求值绝不碰 IRBuilder。数组语义三层拆分——标量、聚合、指针退化严格区分。浮点精度保全——从常量折叠到 .word 汇编全链路位精确。SSA 一致性——每个改变 CFG 的 Pass 必须同步维护 Phi 边。后端指针安全——预分配容量、64 位强制 X 寄存器、栈槽静态扫描。支配树鲁棒性——不可达节点和自环必须优雅阻断。这六点是优化开启后仍保持语义正确的基石。 \
|
||||||
|
*【演讲技巧】* 快速过六个要点,手指逐一指向卡片。
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 11 页:测试验证结果(~20 秒)
|
||||||
|
*【逐字演讲稿】* 全部 11 项功能测试与 10 项性能测试在优化全开条件下通过,21 个用例输出与退出码 100% 匹配。覆盖从 simple_add 到递归图着色到 95_float 浮点综合测试。特别强调:这是在 Mem2Reg + 五个 Pass + LICM 全部开启下通过的——优化管线在提升性能的同时保证了语义正确。验证链路:SysY 源码 → IR → 优化 → AArch64 汇编 → QEMU 模拟 → 输出比对。 \
|
||||||
|
*【演讲技巧】* 强调"优化全开"和"100% 匹配"。
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 12 页:人员分工(~15 秒)
|
||||||
|
*【逐字演讲稿】* 三人分工。我负责中端优化——Lab2 IR 生成、Lab4 支配树与全部 Pass、Lab6 LICM。舒钰权负责 Lab1 文法扩展和 Lab3 AArch64 后端,攻克了浮点位精确等底层难题。杨力嘉负责 Lab5 窥孔优化与全量测试回归,在寄存器别名感知方面做出关键贡献。通过 Git 分支 + MR + Code Review 完成协作。 \
|
||||||
|
*【演讲技巧】* 真诚肯定组员贡献。
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 13 页:实验总结与展望(~25 秒)
|
||||||
|
*【逐字演讲稿】* 核心成果:构建了一个结构清晰、语义正确、可扩展的 SysY 编译器框架。六个实验覆盖前端到后端全环节,在支配树、SSA 构建、Phi 降低、浮点位精确、寄存器别名、LICM 等关键技术上做了深入实现。可继续方向:寄存器分配升级为图着色/线性扫描,循环优化扩展到强度削弱和展开,中端引入 GVN/PRE。通过这六个实验,我们对编译器三层次架构和 SSA 优化有了系统性理解,为今后程序语言和系统优化方向的研究打下了基础。 \
|
||||||
|
*【演讲技巧】* 直视评委,展示热情和清晰规划。
|
||||||
|
]
|
||||||
|
|
||||||
|
#block(width: 100%, breakable: true)[
|
||||||
|
== 第 14 页:致谢与 Q&A
|
||||||
|
*【逐字演讲稿】* 感谢各位老师和同学的聆听!从语法树到 AArch64 汇编,从 SSA 优化到循环不变式外提——我们构建了一个完整、正确、可扩展的 SysY 编译器。接下来是答辩与提问环节,敬请批评指正!谢谢!
|
||||||
|
|
||||||
|
#v(0.3cm)
|
||||||
|
#block(
|
||||||
|
fill: rgb("#fff5f5"),
|
||||||
|
inset: 10pt,
|
||||||
|
radius: 6pt,
|
||||||
|
stroke: 0.5pt + rgb("#b91c1c"),
|
||||||
|
)[
|
||||||
|
#text(weight: "bold", fill: rgb("#b91c1c"), size: 11pt)[防答辩提问防线策略 (Q&A 环节 FAQ)] \
|
||||||
|
#set text(size: 8.5pt)
|
||||||
|
#v(0.2cm)
|
||||||
|
|
||||||
|
#text(weight: "bold", fill: rgb("#b91c1c"), size: 9.5pt)[一、 评委老师专业提问] \
|
||||||
|
#v(0.1cm)
|
||||||
|
|
||||||
|
*问题一:Mem2Reg 中支配边界的作用是什么?如何计算?* \
|
||||||
|
*应答*:支配边界确定 Phi 插入位置——块 A 中定义的变量,在 A 的支配边界中的每个块都需要 Phi 汇合不同前驱的版本。我们使用经典迭代算法:对每个块,沿其前驱的支配链向上攀登直到遇到当前块的 idom,路径上所有块加入其支配边界。
|
||||||
|
|
||||||
|
#v(0.1cm)
|
||||||
|
*问题二:LICM 如何处理指令间的传递依赖?* \
|
||||||
|
*应答*:采用 worklist 迭代判定。每轮遍历循环体,操作数全部满足不变条件则标记。传递依赖通过多轮自然解出——依赖循环外定义的先被标记,依赖它的再下一轮标记。外提按拓扑序移动,保证操作数可用。
|
||||||
|
|
||||||
|
#v(0.1cm)
|
||||||
|
*问题三:栈槽模型冗余访存,为什么不做真正寄存器分配?* \
|
||||||
|
*应答*:窥孔优化约消除 30-40% 冗余。但要达到高质量代码,必须依赖完整的寄存器分配器——这是展望中列出的首要后续方向。当前策略是先保证语义正确、打通全链路,再替换为更优方案。
|
||||||
|
|
||||||
|
#v(0.1cm)
|
||||||
|
*问题四:IR 的 use-def 如何维护?指令移动时如何保证一致性?* \
|
||||||
|
*应答*:Value 维护 Users 列表,Use 含双向指针。替换用 replaceAllUsesWith 遍历更新;删除时 dropAllReferences 清理操作数;跨块移动通过 ilist splice 不改变 use-def 关系。每个 Pass 后验证 Use 双向指针一致。
|
||||||
|
|
||||||
|
#v(0.1cm)
|
||||||
|
*问题五:ConstProp 简化分支后为什么必须清理 Phi?* \
|
||||||
|
*应答*:ConstProp 将 br i1 0 简化为无条件 br 后,被跳过块的 Phi 仍保留已删除前驱的 incoming 引用。CFGSimplify 合并时可能将残留值误作唯一值替换,导致语义错误。修复:简化时遍历死前驱后继块,显式调用 removeIncomingBlock。
|
||||||
|
|
||||||
|
#v(0.3cm)
|
||||||
|
#text(weight: "bold", fill: rgb("#0f4c81"), size: 9.5pt)[二、 现场同学互动提问] \
|
||||||
|
#v(0.1cm)
|
||||||
|
|
||||||
|
*问题六:编译器能编译什么?有什么限制?* \
|
||||||
|
*应答*:支持标准 SysY 完整语法——整数/浮点运算、控制流、多维数组、递归函数、I/O。不支持指针运算、结构体、动态内存分配。未实现循环展开和自动向量化。能正确编译 SysY 范围内所有程序,不能编译 C 程序。
|
||||||
|
|
||||||
|
#v(0.1cm)
|
||||||
|
*问题七:为什么自己设计 IR 而不是用 LLVM API?* \
|
||||||
|
*应答*:课程教学需要亲手实现才能深入理解 SSA 本质;轻量自研 IR 可自由添加定制化分析和优化,不受第三方 API 约束。
|
||||||
|
|
||||||
|
#v(0.1cm)
|
||||||
|
*问题八:遇到的最难 bug?* \
|
||||||
|
*应答*:Lab6 支配树死循环——编译器在 95_float 上完全卡死,GDB attach 发现 ComputeDF 中不可达死块 idom 自环导致永不收敛。定位两三个小时,修复只需两行阻断代码。教训:静态分析必须对 CFG"脏数据"做防御性处理。
|
||||||
|
|
||||||
|
#v(0.1cm)
|
||||||
|
*问题九:架构上会做什么不同的选择?* \
|
||||||
|
*应答*:一是在 Lab1/2 之间引入独立 AST 层解耦文法与下游;二是在 Lab3 就用虚拟寄存器,避免后续从栈槽模型重构。
|
||||||
|
|
||||||
|
#v(0.1cm)
|
||||||
|
*问题十:性能怎么样?* \
|
||||||
|
*应答*:教学编译器追求语义正确优先。优化前因栈槽冗余不如 GCC -O0。全量优化开启后循环密集用例有明显提升。要达到 GCC 水平不现实,但已验证了优化管线的语义正确性。
|
||||||
|
|
||||||
|
#v(0.1cm)
|
||||||
|
*问题十一:能在真机上运行吗?* \
|
||||||
|
*应答*:可以。汇编遵循标准 AArch64 指令集和 Linux ABI,ELF 是标准 ARM64 格式。可在树莓派、Apple Silicon Linux VM 等真机执行,无 QEMU 特有依赖。
|
||||||
|
]
|
||||||
|
]
|
||||||
Reference in New Issue
Block a user