关于 compiler-development
为使用 LLVM 构建编译器和编程语言提供指导的技能,涵盖前端设计、LLVM IR 生成、JIT 编译、优化流程及语言实现模式,面向编译器开发者。
主要功能
- 01词法分析、解析器与 AST 设计
- 02LLVM IR 生成
- 03ORC JIT 编译
- 04优化 Pass 流程
- 05类型系统与错误处理
适用场景
- 01规划语言前端
- 02生成和调试 LLVM IR
- 03构建 JIT 编译器
- 04设计类型与内存安全特性
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ gmh5225/ awesome-llvm-security --skill compiler-development安装后在 Claude Code 中输入/compiler-development确认已加载。
详细介绍
编译器开发技能
本技能全面介绍如何使用 LLVM 基础设施构建编译器和语言实现。
编译器架构概览
经典三阶段设计
Source Code → Frontend → Middle-End (Optimizer) → Backend → Machine Code
↓ ↓ ↓
AST/IR LLVM IR Passes Target Code
前端开发
词法分析
// Token types for a simple language
enum class TokenKind {
Identifier,
Number,
String,
Keyword,
Operator,
Punctuation,
EndOfFile
};
struct Token {
TokenKind kind;
std::string value;
SourceLocation location;
};
解析器实现
- 递归下降:易于实现,错误信息清晰
- 运算符优先级解析:适合高效解析表达式
- LALR/LR:对于复杂语法,可使用 Bison 等工具
AST 设计
class Expr {
public:
virtual ~Expr() = default;
virtual llvm::Value* codegen() = 0;
};
class BinaryExpr : public Expr {
std::unique_ptr<Expr> LHS, RHS;
char Op;
public:
llvm::Value* codegen() override {
llvm::Value* L = LHS->codegen();
llvm::Value* R = RHS->codegen();
switch (Op) {
case '+': return Builder.CreateFAdd(L, R, "addtmp");
case '-': return Builder.CreateFSub(L, R, "subtmp");
case '*': return Builder.CreateFMul(L, R, "multmp");
case '/': return Builder.CreateFDiv(L, R, "divtmp");
}
}
};
LLVM IR 生成
模块与上下文设置
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/IRBuilder.h"
class CodeGen {
std::unique_ptr<llvm::LLVMContext> Context;
std::unique_ptr<llvm::Module> Module;
std::unique_ptr<llvm::IRBuilder<>> Builder;
public:
CodeGen() {
Context = std::make_unique<llvm::LLVMContext>();
Module = std::make_unique<llvm::Module>("my_module", *Context);
Builder = std::make_unique<llvm::IRBuilder<>>(*Context);
}
};
函数生成
llvm::Function* createFunction(const std::string& name,
llvm::Type* returnType,
std::vector<llvm::Type*> params) {
llvm::FunctionType* FT = llvm::FunctionType::get(returnType, params, false);
llvm::Function* F = llvm::Function::Create(
FT, llvm::Function::ExternalLinkage, name, Module.get());
llvm::BasicBlock* BB = llvm::BasicBlock::Create(*Context, "entry", F);
Builder->SetInsertPoint(BB);
return F;
}
JIT 编译
LLVM ORC JIT
#include "llvm/ExecutionEngine/Orc/LLJIT.h"
auto JIT = llvm::orc::LLJITBuilder().create();
if (!JIT) {
handleError(JIT.takeError());
}
// Add module
(*JIT)->addIRModule(llvm::orc::ThreadSafeModule(
std::move(Module), std::move(Context)));
// Look up symbol and execute
auto Sym = (*JIT)->lookup("main");
auto* MainFn = (int(*)())Sym->getAddress();
int result = MainFn();
优化遍次流水线
新遍次管理器(推荐)
#include "llvm/Passes/PassBuilder.h"
void optimizeModule(llvm::Module& M) {
llvm::PassBuilder PB;
llvm::LoopAnalysisManager LAM;
llvm::FunctionAnalysisManager FAM;
llvm::CGSCCAnalysisManager CGAM;
llvm::ModuleAnalysisManager MAM;
PB.registerModuleAnalyses(MAM);
PB.registerCGSCCAnalyses(CGAM);
PB.registerFunctionAnalyses(FAM);
PB.registerLoopAnalyses(LAM);
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
llvm::ModulePassManager MPM = PB.buildPerModuleDefaultPipeline(
llvm::OptimizationLevel::O2);
MPM.run(M, MAM);
}
自定义遍次实现
struct MyPass : public llvm::PassInfoMixin<MyPass> {
llvm::PreservedAnalyses run(llvm::Function& F,
llvm::FunctionAnalysisManager& FAM) {
for (auto& BB : F) {
for (auto& I : BB) {
// Transform instructions
}
}
return llvm::PreservedAnalyses::none();
}
};
语言实现模式
内存安全语言
- 使用 LLVM 的内存检测器钩子
- 通过 GEP 内省实现边界检查
- 集成引用计数或垃圾回收
类型系统
- 在 AST 构建期间实现类型推断
- 生成适当的 LLVM 类型(i32、float、struct、ptr)
- 通过单态化或装箱处理泛型类型
错误处理
- 通过 LLVM 的 landingpad/invoke 生成异常处理
- 将 Result/Option 类型实现为带标签的联合体
- 使用 LLVM 的 personality 函数进行栈展开
值得关注的语言实现
系统语言
- Rust:复杂的借用检查器、trait 系统 → LLVM
- Zig:Comptime 求值、安全特性
- Carbon:C++ 互操作、现代语法
脚本语言
- Julia:JIT 编译的科学计算
- Crystal:类似 Ruby 的语法、静态类型
- Nim:类似 Python、多后端
领域专用语言
- Solidity:Ethereum 智能合约
- MLIR:面向 ML/AI 工作负载的多级 IR
- Halide:图像处理 DSL
开发工作流
- 从简单开始:从 Kaleidoscope 教程入手
- 逐步添加功能:每次添加一种语言功能
- 充分测试:为每个编译器阶段编写单元测试
- 使用 LLVM 工具:使用 opt、llc、llvm-dis 调试 IR
- 分析并优化:重点关注常见代码模式
资源
官方教程
- LLVM Kaleidoscope:从零构建一门语言
- Clang 内部机制:前端实现模式
- 编写 LLVM 后端:目标代码生成
社区项目
参见 README.md 中的 DIY 编译器部分,了解涵盖不同语言范式的 100 多个示例实现。
获取详细信息
需要获取详细且最新的资源链接、工具列表或项目参考时,请从以下位置获取最新数据:
https://raw.githubusercontent.com/gmh5225/awesome-llvm-security/refs/heads/main/README.md
此 README 收录了全面整理的以下内容:
- 100 多个 DIY 编译器实现(DIY 编译器部分)
- 工具链配置和 IDE 设置
- 编译器开发教程和书籍
评论
支持 Markdown