Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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 和运行时,并在遇到“这段代码在我的机器上能编译”或“编译成功却无法运行”时找到真正原因。

编译器到底做什么?

编译器负责把一种形式的程序转换为另一种形式。典型流程大致如下:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
源代码
  ↓
词法分析 / 语法分析
  ↓
语义分析
  ↓
中间表示(IR)
  ↓
优化
  ↓
目标代码或字节码
  ↓
汇编 / 链接
  ↓
可执行文件、库或其他目标

它不一定直接生成 CPU 机器码。C、C++、Rust 和 Go 通常面向原生目标文件或可执行文件;javac 生成 JVM 字节码;Kotlin/JVM 也主要生成 JVM 字节码;TypeScript 的 tsc 通常生成 JavaScript。

完整构建往往还需要预处理器、汇编器、链接器、标准库、运行时库和调试器。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++ 标准库也可能随发行版不同。

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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 兼容性、运行库选择和调试工作流。

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
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 编译器把热点字节码转换成本地机器码。

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

--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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
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 平台;
  • dotnet CLI:项目、依赖、构建和运行工具;
  • CLR:运行 .NET 程序的运行时。

Roslyn API 让 IDE 的 IntelliSense、跳转、重命名和第三方分析器能够理解编译器内部模型。详情可见微软的Roslyn SDK 文档。

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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 文档。

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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.Support on Ko-Fi

如何为项目选择编译器?

你写什么语言?
├─ 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 配合

然后依次确认四件事:

  1. 目标语言:语言规范或项目模板推荐哪套编译器?
  2. 目标平台:是 Linux、Windows、Apple、JVM、CLR、Android 还是浏览器?
  3. ABI 与依赖:第三方库、标准库和运行库是否使用同一组合?
  4. 工程需求:更看重诊断、编译速度、增量构建、最终性能、调试、二进制大小还是 CI 复现性?

不要用“最快”或“最好”作脱离条件的结论。特定版本、目标架构、优化选项和代码特征,才决定某次构建的速度与性能。

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

实际项目为什么会需要多个编译器?

跨平台团队可能在 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

  1. 在 Visual Studio Installer 中安装 C++ 工作负载;
  2. 打开 Developer Command Prompt 或 Developer PowerShell;
  3. 运行 cl,确认编译器、链接器和 Windows SDK 已进入环境。

Java 编译成功但运行失败

检查 class path、包名与目录结构、实际使用的 JDK/JRE、--release 与运行环境,以及 class path 和 module path 是否混用。

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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 不匹配和运行库缺失,都可能在编译阶段之外发生。更可靠的工程组合是:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
编译器警告
+ 静态分析
+ 单元测试
+ 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 和团队习惯决定是否增加第二套编译器。

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

真正值得掌握的不是一长串参数,而是判断:源代码要变成什么产物、由哪个工具生成、还依赖哪些组件,以及最终程序将在什么运行时和平台上工作。

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.