第二章:开发环境搭建
好,咱们正式开始动手了。写编译器这事儿,工具链选不对,后面全是坑。我这些年折腾过不少语言和工具,踩过的雷能绕地球一圈。今天就把我觉得最靠谱的一套方案分享给你。
2.1 选择开发语言
先聊语言。你可能会问:「到底用 C、C++、Rust 还是 Go?」
我个人习惯用 C++。为什么?
- 性能够硬。编译器本身就是个性能敏感的系统软件,C++ 能让你精确控制内存和 CPU。
- 生态成熟。LLVM、GCC 这些底层工具全是 C++ 写的,你直接复用它们的 API 非常方便。
- 抽象能力适中。比 C 多了类和模板,比 Rust 少了借用检查器的束缚,写起来顺手。
当然,Rust 也很香。如果你追求内存安全,又不怕学习曲线陡峭,Rust 是未来趋势。Go 呢?说实话,写小玩具可以,但做生产级编译器,GC 和 goroutine 调度带来的不确定性会让你头疼。
2.2 安装编译器工具链
工具链选哪个?LLVM 是首选。
我记得第一次用 GCC 写编译器时,被它的中间表示折腾得够呛。LLVM 的 IR 设计得干净、文档齐全,而且有丰富的 Pass 框架。说白了,LLVM 就是为编译器开发者准备的瑞士军刀。
安装步骤很简单:
# Ubuntu / Debian
sudo apt install llvm clang lld
# macOS (Homebrew)
brew install llvm
# Windows
# 去 https://releases.llvm.org 下载预编译包
验证安装:
clang --version
llvm-config --version
2.3 配置 IDE
编辑器这块,我推荐 VS Code。轻量、插件丰富、调试方便。
必装插件:
- C/C++ (微软官方)
- CMake Tools
- GitLens
- Clangd (代码补全和诊断)
如果你喜欢重型 IDE,CLion 也不错。CMake 集成做得很好,但启动慢、吃内存。我平时写小项目用 VS Code,做大项目才切 CLion。
配置 VS Code 的 settings.json:
{
"C_Cpp.default.compilerPath": "/usr/bin/clang++",
"cmake.configureOnOpen": true,
"editor.formatOnSave": true
}
2.4 版本控制:Git
写编译器,版本控制是命根子。你改一行代码,可能整个语法分析器就崩了。没有 Git,你连回退的机会都没有。
我建议你养成一个习惯:每实现一个功能点就 commit 一次。比如:
git init
git add .
git commit -m "feat: 添加词法分析器基础框架"
分支策略用简单的 main + dev 就行。别整 Git Flow,咱们写课程项目,不是搞企业级发布。
2.5 构建工具:CMake
Makefile 太原始,手写容易出错。CMake 是业界标准,跨平台、可读性强。
一个简单的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.20)
project(MyCompiler VERSION 0.1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(mycc
src/main.cpp
src/lexer.cpp
src/parser.cpp
)
target_link_libraries(mycc PRIVATE LLVM)
构建命令:
mkdir build && cd build
cmake ..
make -j$(nproc)
嗯,这里要注意:-j$(nproc) 能利用多核加速编译。我第一次写编译器时不知道这个参数,每次编译都干等 5 分钟,后来同事提醒才恍然大悟。
2.6 知识体系总览
下面这张图,是我用 SVG 画的本章核心逻辑。你一看就明白各个工具之间的关系:
你看,整个环境搭建就是这六个模块。它们互相配合,缺一不可。语言是基础,工具链是引擎,IDE 是操作台,Git 是安全网,CMake 是调度员,调试器是放大镜。
2.7 快速验证
环境搭好了,咱们写个 Hello World 试试:
// hello.cpp
#include <iostream>
int main() {
std::cout << "Hello, Compiler!" << std::endl;
return 0;
}
用 CMake 构建:
mkdir build && cd build
cmake ..
make
./hello
如果看到 Hello, Compiler! 输出,恭喜你,环境搭建成功!
cmake -DCMAKE_BUILD_TYPE=Debug ..
好了,环境就绪。接下来咱们就可以真正进入编译器的核心世界了。