Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.
先给结论:你不需要安装或精通所有编译器,但应该知道它们分别服务什么语言、生成什么产物,以及依赖哪些平台工具。Linux 上常见 GCC 和 Clang,Windows 原生开发离不开 MSVC,Java 使用 javac,Rust 使用 rustc,而 Go、Swift、C#、Kotlin 和 TypeScript 也各有自己的编译器体系。
这份名单并不是“谁最好”的排名。它更像一张工具链地图:帮助你区分编译器、LLVM、链接器、构建系统、IDE 和运行时,并在遇到“这段代码在我的机器上能编译”或“编译成功却无法运行”时找到真正原因。
编译器到底做什么?
编译器负责把一种形式的程序转换为另一种形式。典型流程大致如下:
Quick wins for a faster PC:
Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Repair Windows errors before they cause bigger problemsFix Now →Scan for outdated or missing drivers - takes under a minuteDriver Scan →源代码
↓
词法分析 / 语法分析
↓
语义分析
↓
中间表示(IR)
↓
优化
↓
目标代码或字节码
↓
汇编 / 链接
↓
可执行文件、库或其他目标
它不一定直接生成 CPU 机器码。C、C++、Rust 和 Go 通常面向原生目标文件或可执行文件;javac 生成 JVM 字节码;Kotlin/JVM 也主要生成 JVM 字节码;TypeScript 的 tsc 通常生成 JavaScript。
#1 Best Overall
完整构建往往还需要预处理器、汇编器、链接器、标准库、运行时库和调试器。Clang 的工具链文档对这些组件的关系有清晰说明。IDE 只是编辑、调试和调用这些工具的工作环境;构建系统负责组织依赖和命令;JVM、CLR 或 JavaScript 运行时则负责运行程序。
10 种编译器快速总览
| 编译器或体系 | 主要语言 | 典型输出 | 常见生态 |
|---|---|---|---|
| GCC | C、C++、Fortran 等 | 原生目标文件、可执行文件 | Linux、Unix-like、嵌入式 |
| Clang | C、C++、Objective-C、OpenCL | 原生目标文件、可执行文件 | LLVM、macOS、Linux、Windows |
| MSVC | C、C++ | Windows 原生程序 | Visual Studio、Windows SDK |
javac |
Java | JVM .class 字节码 |
JVM |
rustc |
Rust | 原生程序或库 | Cargo、rustup |
| Go compiler | Go | Go 程序或库 | go build、云服务 |
swiftc |
Swift | 原生程序或库 | Apple 平台、Swift Package Manager |
| Roslyn | C#、Visual Basic | .NET 程序集 | .NET SDK、MSBuild |
| Kotlin compiler | Kotlin | JVM、JavaScript 或 Native 目标 | Gradle、Android |
| TypeScript compiler | TypeScript | JavaScript、声明文件 | Web、Node.js、bundler |
1. GCC:GNU/Linux 工具链的基础
GCC 的全称是 GNU Compiler Collection,不只是一个 C 编译器。gcc 通常作为 C 入口,g++ 通常用于 C++,此外还有 gfortran、Ada 和其他语言前端。可用语言会因发行版和构建配置而不同,具体范围可查阅GCC 官方页面。
gcc hello.c -o hello
g++ hello.cpp -o hello
g++ -std=c++20 -Wall -Wextra -O2 hello.cpp -o hello
g++ -g hello.cpp -o hello-debug
gcc --version
-o指定输出文件;-Wall -Wextra开启常用警告;-O2启用通常适合生产构建的优化;-g加入调试信息;-std=c++20选择 C++ 标准。
GCC 并不等于完整的 Linux 开发环境。实际构建还可能使用 GNU binutils、链接器、标准库、系统头文件以及 Make、CMake 或 Ninja。GCC 版本、默认语言标准和 C++ 标准库也可能随发行版不同。
GCC 适合 Linux 原生开发、嵌入式工具链和需要 GNU 生态兼容性的项目。若代码依赖编译器扩展,换到 Clang 或 MSVC 时可能失败,因此建议使用明确的语言标准和警告选项。
2. Clang:LLVM 生态的现代 C/C++ 入口
Clang 是 C 语言家族前端,支持 C、C++、Objective-C 和 OpenCL,并使用 LLVM 的优化与代码生成能力。它以可读诊断、工具化能力和 IDE 集成为重要特色。常见入口是 clang 和 clang++,Windows 上还会遇到兼容 MSVC 命令行风格的 clang-cl.exe。可从Clang 官网和用户手册了解具体选项。
clang hello.c -o hello
clang++ -std=c++20 -Wall -Wextra hello.cpp -o hello
clang++ -O2 hello.cpp -o hello
clang++ -g hello.cpp -o hello-debug
clang --version
clang-cl /std:c++20 /W4 hello.cpp
Clang 常与 clang-tidy、Clang Static Analyzer、格式化工具和 IDE 代码索引配合使用。它可以使用 libc++,也可以在一些环境中配合 libstdc++。这并不意味着 Clang 一定比 GCC 快,或 GCC 生成的程序一定更快。编译器版本、目标架构、优化参数、标准库、链接器和代码特征都会影响结果。
3. MSVC:Windows 原生 C/C++ 的关键工具
MSVC 通常通过 cl.exe 使用,并与 Visual Studio、Windows SDK、MSVC 运行库、链接器和 PDB 调试信息紧密结合。它的重要性不只在于“能编译 C++”,还在于 Windows ABI、SDK 兼容性、运行库选择和调试工作流。
cl /std:c++20 /W4 /EHsc main.cpp
cl /O2 /EHsc main.cpp
cl /Zi /Od /EHsc main.cpp
cl
建议从 Visual Studio Developer Command Prompt 或 Developer PowerShell 启动命令。普通命令提示符直接运行 cl,可能出现“不是内部或外部命令”的错误,因为编译器、链接器和 Windows SDK 没有加入环境变量。
MSVC 选项使用斜杠,例如 /W4、/O2 和 /Zi,不能直接与 GCC 的 -Wall、-O2 和 -g 混用。clang-cl 能兼容相当一部分 MSVC 风格选项,但不代表所有 ABI、库和工具行为都完全相同。
4. javac:把 Java 编译成 JVM 字节码
javac 读取 Java 源文件并生成运行在 JVM 上的 .class 文件,而不是直接生成某个 CPU 的原生可执行文件。Oracle 的javac 文档介绍了命令、输出目录和 --release 等选项。
javac Hello.java
java Hello
javac -d out src/Hello.java
java -cp out Hello
javac --release 21 -d out src/Hello.java
javac 是编译器,java 是启动 JVM 的命令,Maven 和 Gradle 是构建工具。程序运行时,JVM 还可能通过 JIT 编译器把热点字节码转换成本地机器码。
--release 通常比单独指定 -source 和 -target 更适合同时限制语言级别与可用平台 API。大型工程还会涉及 class path、module path、依赖管理和注解处理器。
5. rustc:Rust 的官方编译器
rustc 负责编译 Rust 的 crate,输出可执行文件、库或其他 crate 类型。实际项目中,大多数开发者通过 Cargo 间接调用它,而不是手写所有 rustc 参数。
rustc hello.rs
./hello
cargo new hello
cd hello
cargo build
cargo run
cargo build --release
cargo build --verbose
cargo build --verbose 能显示 Cargo 实际调用的编译命令。跨平台构建还要关注 target triple、链接器、sysroot 和目标平台库:
rustup target list
cargo build --target x86_64-unknown-linux-gnu
Rust 工具链通常需要系统 C 编译器和链接器。某些 crate 含有 C 代码或原生依赖,Linux 上可能需要 GCC/Clang;Windows 的 *-windows-msvc 目标通常需要 Visual Studio 提供链接器和原生库。Rust 的目标平台支持还有不同等级,“能生成目标文件”不等于完整的官方支持保证。相关信息见平台支持文档。
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
6. Go compiler:由 Go 工具链统一调度
Go 的编译器通常由 go 命令调用。对普通项目而言,go build 比直接操作编译器、汇编器和链接器更符合官方工作流。
go version
go build
go run .
go test ./...
GOOS=linux GOARCH=amd64 go build
Go 工具链把编译器、标准库、链接器和模块系统整合在一起,因此初学者很少需要直接调用底层编译器。跨平台构建通常可以通过 GOOS 和 GOARCH 完成,但 CGO、系统库、链接选项和目标平台会影响最终产物。
不要把 go 命令简单等同于编译器,也不要声称所有 Go 二进制文件都完全静态链接。需要精确控制编译阶段时,可参考Go compiler 文档。
7. Swift compiler:swiftc 与 Apple 工具链
Swift 编译器的命令行入口通常是 swiftc。它可以生成原生代码,但 Apple 平台项目还必须结合 SDK、框架、链接、签名和打包流程。
Free tools Windows power users keep installed
One-click scans. No signup required.
swiftc main.swift -o hello
swift --version
swift package init
swift build
swift run
swift test
swiftc、Swift Package Manager 和 Xcode 不是同一个工具。macOS、iOS 等项目中,Xcode 的构建系统、Apple SDK、部署目标和签名配置往往比单个编译命令更容易导致失败。Linux 上的 Swift 工具链也不等同于 Apple 平台的框架生态。可从Swift 官方文档了解当前平台和工具链要求。
8. Roslyn:把 C# 编译器开放成开发平台
Roslyn 是 .NET Compiler Platform,提供 C# 和 Visual Basic 编译器及 API。它可以把源代码编译成 .NET 程序集,也开放语法树、符号、语义模型、诊断分析器、代码修复、重构和 Source Generator 等能力。
dotnet new console
dotnet build
dotnet run
dotnet test
直接调用 C# 编译器时可能会接触 csc Program.cs,但其路径、默认引用和参数通常由 .NET SDK 或 Visual Studio 管理。普通项目更适合使用 dotnet CLI 和 MSBuild。
csc:C# 编译器;- Roslyn:编译器及开放 API 平台;
dotnetCLI:项目、依赖、构建和运行工具;- CLR:运行 .NET 程序的运行时。
Roslyn API 让 IDE 的 IntelliSense、跳转、重命名和第三方分析器能够理解编译器内部模型。详情可见微软的Roslyn SDK 文档。
Recommended Free Tools
9. Kotlin compiler:同一语言面向多个目标
Kotlin 编译器体现了现代语言的多目标特性:Kotlin/JVM、Kotlin/JavaScript、Kotlin/Native,以及 Android 工具链中的 Kotlin 编译流程。
kotlinc Hello.kt -include-runtime -d hello.jar
java -jar hello.jar
./gradlew build
./gradlew test
kotlinc 不是 Android Studio,也不是 Gradle。Kotlin/JVM 生成 JVM 字节码,仍需要 JVM 运行;Android 项目还会涉及 Android Gradle Plugin、SDK、D8/R8 和打包流程。多平台项目的最终产物、依赖和库能力会随目标平台变化,应查阅Kotlin Multiplatform 文档。
10. TypeScript compiler:源到源编译器的典型案例
tsc 会检查 TypeScript 类型并通常将其转换为 JavaScript,而不是生成 CPU 指令。这说明“编译器”不一定意味着机器码生成。
tsc --init
tsc
tsc --noEmit
tsc --watch
tsc --target ES2022 --module NodeNext
tsc --noEmit 可以只做类型检查。现代 Web 项目可能使用 Babel、SWC、esbuild、Rspack 或 Vite 生成最终 JavaScript,但仍用 tsc 做类型检查。target、module、模块解析策略和运行时环境必须匹配;类型检查通过也不能保证浏览器运行时的数据一定正确。配置细节见TypeScript TSConfig 文档。
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →GCC、Clang 和 MSVC 怎么选?
| 需求 | 优先考虑 | 原因 |
|---|---|---|
| Linux/Unix-like 原生 C/C++ | GCC 或 Clang | 都拥有成熟的系统工具链集成 |
| Windows 原生应用 | MSVC | 与 Windows ABI、SDK、调试器和 Visual Studio 配套 |
| Windows 上使用 LLVM 生态 | Clang-cl | 可采用不少 MSVC 风格参数 |
| Apple C/C++ 项目 | Apple Clang/Xcode toolchain | 便于配合 Apple SDK 和平台构建流程 |
| 检查可移植性 | GCC 与 Clang 都构建 | 有助于发现扩展依赖和标准兼容问题 |
关键差异还包括标准库和 ABI。C++ 项目必须确认第三方库使用的是哪种 ABI、libstdc++ 还是 libc++、哪种运行库链接方式以及哪套编译器构建。能分别编译不代表可以安全地跨库传递 C++ 标准库对象。Clang 的工具链说明对此有专门讨论。
为什么这么多编译器使用 LLVM?
LLVM 是模块化的编译器基础设施项目,不是一个面向单一语言的“C++ 编译器”。它提供优化器、代码生成器以及一系列工具;Clang 是 LLVM 生态中的 C 语言家族前端之一,相关项目可见LLVM 官网。
共享 LLVM 后端意味着不同语言可以复用部分优化和目标架构支持,但不意味着它们是同一个编译器。Rust 仍有自己的语法分析、类型系统和借用检查;Swift 也有自己的语言语义和诊断流程。共享后端不等于共享完整编译流程。
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.如何为项目选择编译器?
你写什么语言?
├─ C/C++
│ ├─ Linux/Unix-like:GCC 或 Clang
│ ├─ Windows 原生:MSVC 或 clang-cl
│ └─ Apple 平台:Apple Clang/Xcode toolchain
├─ Rust:rustc,通常通过 Cargo
├─ Go:go build,底层由 Go compiler 完成
├─ Java:javac,通常由 Maven/Gradle 调用
├─ C#:Roslyn,通常通过 dotnet CLI/MSBuild 调用
├─ Kotlin:kotlinc,项目中通常由 Gradle 调用
├─ Swift:swiftc,Apple 项目通常由 Xcode 调用
└─ TypeScript:tsc,常与 bundler 配合
然后依次确认四件事:
- 目标语言:语言规范或项目模板推荐哪套编译器?
- 目标平台:是 Linux、Windows、Apple、JVM、CLR、Android 还是浏览器?
- ABI 与依赖:第三方库、标准库和运行库是否使用同一组合?
- 工程需求:更看重诊断、编译速度、增量构建、最终性能、调试、二进制大小还是 CI 复现性?
不要用“最快”或“最好”作脱离条件的结论。特定版本、目标架构、优化选项和代码特征,才决定某次构建的速度与性能。
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchPC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11实际项目为什么会需要多个编译器?
跨平台团队可能在 Linux、Windows 和 macOS 上分别使用不同工具链;CI 还可能用 GCC 和 Clang 矩阵构建,以发现非标准扩展、默认宏差异和 ABI 问题。调试构建与发布构建也会采用不同的优化和符号配置。
# GCC
g++ -std=c++20 -Wall -Wextra -pedantic main.cpp
# Clang
clang++ -std=c++20 -Wall -Wextra -pedantic main.cpp
一个编译器通过、另一个失败,常见原因包括默认语言标准不同、预处理宏不同、标准库不同、平台头文件不同、编译器扩展或 ABI 不兼容。两套编译器都能通过,也不能证明程序覆盖了所有平台。
常见失败场景与排查方法
Linux 上 Rust 构建失败
问题可能不在 Rust 代码,而在缺少 C 编译器、链接器、系统开发库或某个 crate 所需的原生依赖。查看 cargo build --verbose 的实际命令,通常比只看 Cargo 的最后一行错误更有帮助。
Windows 上找不到 cl
- 在 Visual Studio Installer 中安装 C++ 工作负载;
- 打开 Developer Command Prompt 或 Developer PowerShell;
- 运行
cl,确认编译器、链接器和 Windows SDK 已进入环境。
Java 编译成功但运行失败
检查 class path、包名与目录结构、实际使用的 JDK/JRE、--release 与运行环境,以及 class path 和 module path 是否混用。
TypeScript 类型检查通过但浏览器报错
类型系统不能覆盖所有运行时问题。还要检查模块格式、bundler 配置、浏览器目标、Node API 是否错误地进入前端,以及外部数据是否经过运行时校验。
Best Value
交叉编译失败
同时核对 target triple、CPU 架构、操作系统、ABI、sysroot、系统库、链接器、外部依赖和部署环境。Rust 官方的平台支持页面还按支持等级区分目标平台。
优化和调试不能混为一谈
# 调试构建
g++ -g -O0 main.cpp -o app-debug
# 发布构建
g++ -O2 main.cpp -o app
优化可能消除变量、重排代码并改变断点位置;因此发布构建的调试体验通常不同。另一方面,生产程序也应根据崩溃分析需要保留或单独归档调试符号。-O0 也不应被理解为完全关闭编译器的所有行为。
编译成功同样不等于程序正确。未定义行为、数据竞争、内存泄漏、越界访问、逻辑错误、ABI 不匹配和运行库缺失,都可能在编译阶段之外发生。更可靠的工程组合是:
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Fix the driver behind crashes, sound loss and screen glitches3Repair Windows errors before they cause bigger problems编译器警告
+ 静态分析
+ 单元测试
+ Sanitizer
+ 调试器
+ 运行时监控
编译器、IDE 和构建工具不要混淆
- Visual Studio 不是 MSVC 的同义词;
- Xcode 不是
swiftc的同义词; - Android Studio 不是 Kotlin compiler;
- IntelliJ IDEA 不是
kotlinc; - VS Code 本身通常不提供 GCC、Clang、Rust 或 Go 编译器。
IDE 负责编辑、导航、调试和项目管理,并调用底层工具链。Maven、Gradle、Cargo、MSBuild、CMake 和 Ninja 负责构建编排;它们可以调用编译器,却不是编译器本身。
安装与版本检查
不要只安装“一个编译器”就认为完整环境已经准备好。还可能缺少链接器、标准库、系统头文件、SDK、运行时、构建系统、调试器、sysroot 或交叉编译目标。
gcc --version
clang --version
java --version
javac --version
rustc --version
cargo --version
go version
swift --version
dotnet --info
kotlinc -version
tsc --version
GCC 和 Clang 通常由操作系统包管理器或官方渠道提供;MSVC 通过 Visual Studio Installer;Java 通过 JDK 发行版;Rust 通常通过 rustup;Go 使用官方发行版;C# 使用 .NET SDK;Kotlin 可通过命令行发行版或 Gradle;Swift 使用 Swift toolchain 或 Xcode;TypeScript 通常通过 npm 安装。版本、下载渠道和许可政策会随发行版、地区和日期变化,应以相应官方页面为准。
最后的选择原则
学习阶段,先使用目标语言官方文档推荐的工具链,掌握基本的编译、运行、测试和调试流程。进入真实项目后,再根据平台、ABI、标准库、第三方依赖、CI 和团队习惯决定是否增加第二套编译器。
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →真正值得掌握的不是一长串参数,而是判断:源代码要变成什么产物、由哪个工具生成、还依赖哪些组件,以及最终程序将在什么运行时和平台上工作。
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

