Compiler Explorer 上手:在线看汇编、切换编译器与执行代码

推荐网址49秒前发布 一方
0 00

Compiler Explorer 是一个跑在浏览器里的编译器观察工具:左边写代码,右边实时看到编译出的汇编。它回答的问题很具体——这段 C 或 C++ 最后变成了哪些指令。项目 2012 年起步,如今每周处理超过 300 万次编译,代码以 BSD 许可证开源。下面写清怎么用、能解决什么问题,以及它不适合做什么。

Compiler Explorer 是什么:把源码与汇编放在一屏

打开 Compiler Explorer 官网,默认是左右分栏:左边是代码编辑器,给了一段 C++ 示例;右边是当前编译器输出的汇编。两边用同一种颜色标出对应关系,鼠标停在任一侧的某一行,另一侧会跟着高亮。把鼠标移到一条汇编指令上会浮出说明,右键还能打开指令文档。

有一个默认值要留意:编译器默认不加优化参数,输出又长又啰嗦。要看接近真实场景的表现,先在编译器输出右上角的参数框里补上 -O2 这类开关,再看差异,否则很容易得出「这段代码没优化」的错误结论。

支持的语言超过 30 种,C、C++、Rust、Go、D、Haskell、Swift、Pascal、Python、Java、C#、F# 都在列表里,ispc 这类偏门选项也有。同一门语言可以挂多个编译器版本,GCC 与 Clang 各自的若干版本并列,方便横向比较。项目用 TypeScript 写在 Node.js 上,源码在 compiler-explorer 仓库,许可是 BSD-2-Clause。

官方给了三个域名:godbolt.org、godbo.lt、compiler-explorer.com。子域名会带独立的本地状态,例如访问 rust 开头的子域名,进去直接是 Rust。想把 C++ 和 Rust 分成两个工作区,用子域名比反复切下拉省事。

上手:三步看懂一屏汇编

Compiler Explorer 打开后左侧源码与右侧汇编的对照界面
截图来源:godbolt.org(2026-11-01)

不用注册,打开就能用。第一次接触的话,按下面三步走:

  1. 选语言与编译器。编辑器右上角的下拉切语言,编译器窗口左上角的下拉切编译器与版本;常用的点黄色星标收藏,下次直接出现在顶部。
  2. 写一段最小代码,补编译参数。想验证优化效果,把 -O2 或 -O3 填进参数框;想减少干扰,勾选输出旁边的过滤选项,比如隐藏注释、折叠模板展开。
  3. 对着颜色读对应关系。源码行与汇编行同色高亮,判断某个函数体生成了几条指令,比从头读整页输出快得多。

练手建议拿一段熟悉的简单函数:一次加法、一个循环、一次 vector 追加。改动优化参数后看输出的行数怎么变,比读文档更快建立直觉。

六个常见使用场景

下面这些事它做得比较顺手:

  • 确认优化有没有生效。同一个函数分别用 -O1、-O2、-O3 编译,观察循环展开、常量折叠、函数内联是否发生,判断性能变化来自代码还是来自编译器。
  • 跨编译器、跨版本对比。把同一段代码挂到 GCC 与 Clang 的不同版本上,看同一语义生成的指令差异,排查「本机没问题、换台机器就崩」这类问题。
  • 看 ABI 与参数传递。函数入参进了寄存器还是栈、返回值放在哪、结构体按值传递被拆成几个寄存器,这类问题在汇编里一目了然。
  • 验证未定义行为的实际结果。越界访问、有符号溢出、严格别名相关的写法,开高优化后可能被编译器直接删掉,汇编会告诉你它并没有按你想的执行。
  • 检查向量化。循环有没有被编译成 SIMD 指令、有没有生成额外的运行时检查,扫一眼输出就能初步判断。
  • 教学与代码评审。把一段小例子做成短链接发出去,对方打开看到的是同样的编译器、同样的参数、同样的汇编,讨论不用来回截图。

想把汇编读顺,前置知识还是数据结构和算法,站内《Hello 算法》的阅读顺序可以按章节补;正在规划学习路线的话,roadmap.sh 的路径选择能帮你定位该补哪一块;在本地反复跑编译对照,终端命令行工具清单里的工具能省不少手工步骤。

进阶:库、执行、工具面板与短链接

用过几次之后,这几个入口值得打开,官方入门文档里有逐项说明:

  • 库。编译器窗口的 Libraries 面板可以挂官方预置的第三方库,不必先把源码下载到本地就能验证某个库的行为;完整清单可以通过 /api/libraries/语言 查询。
  • 执行。编译器选项里勾上 Execute the code,就能看到程序的实际输出;想单独跑一个程序,用 Add new 里的 Execution only 视图,还能传命令行参数与标准输入。
  • 工具面板。clang 系的编译器可以加 Opt Pipeline,看优化器每一步做了什么;Control Flow Graph 生成控制流图;另有 strings 这类对编译产物运行的独立工具。
  • 短链接。界面上的分享按钮会生成 /z/编号 形式的短链,状态存在服务端,打开即还原代码、编译器与参数。
  • 姊妹站点。它和 CPP Insights、Quick-Bench 有集成入口,前者展示 C++ 语法糖展开后的样子,后者做微基准测试。

另外还能调整面板布局:编辑区、编译输出、工具窗口都可以拖动、叠加、放大到整屏,习惯之后可以把一屏排成自己顺手的形状。

接到工作流:REST API 与本地部署

接口是给脚本用的,把「改代码—点编译—贴汇编」的循环搬到命令行。按官方 API 文档,常用的端点是两个:GET /api/compilers/语言 列出该语言可用的编译器与 id,POST /api/compiler/编译器 id/compile 提交源码。请求头带 Accept: application/json 返回结构化结果,否则直接返回纯文本汇编。

一个最小例子,编译器 id 从上一个端点取:

curl 'https://godbolt.org/api/compiler/g63/compile?options=-O2' 
  --data-binary 'int square(int n) { return n * n; }'

提交 JSON 体可以带更多开关:userArguments 放编译参数,libraries 指定库与版本,filters 控制输出过滤,executeParameters 传运行参数与标准输入。所有编译由公共实例的编译节点完成,节点本身没有外网,所以把远程 URL 写进 include 这种用法不被支持。

本地部署也不复杂:装好 Node.js 后在 Linux 上跑 make,会在 10240 端口起一个实例;只想开 C++,加参数 make EXTRA_ARGS='--language c++' 即可。它是一套配置驱动的编译器清单,把自己机器上的 GCC 路径写进 etc/config 就能接管。

局限与常见问题

它的定位是「观察」而不是「开发」,几件事不要指望:

  • 没有调试器、断点和单步,也不能跑完整的项目构建。CMake 项目有专门的接口端点,但依赖管理、构建脚本这些它不管。
  • 公共实例是共享资源,请求要排队,代码很长或调用很密时会明显变慢;接口文档里也写明将来可能加限流。
  • 代码会提交到官方编译集群。内部代码、密钥、客户数据不适合贴进去,这是使用前就该明确的一条。
  • 结论有时效。编译器版本会更新,几个月后同一段代码可能生成不同指令,记结论时把编译器版本与参数一起记下来。

无需登录这一点有第三方测评做过核对,nologin.tools 的条目记录了免登录、免费、开源许可这几点,适合用来判断它是否适合放进受限环境。

需要注册账号吗

不需要。浏览、编译、执行、生成短链都不用登录。只有遇到限流,或者需要长期保留的实例与更长历史的链接时,才涉及账户或自建部署。

能编译整个项目吗

单文件最稳。多文件可以用接口的 files 数组传附加源文件,CMake 项目有对应端点,但它不做依赖管理与构建编排,工程级任务还是放回本地工具链。

汇编看不懂怎么入门

先把优化关掉看 -O0 的朴素版本,再逐级加 -O1、-O2 对照;把鼠标停在指令上看说明,配合调用约定理解寄存器分工。看懂「参数怎么传、值放哪、循环怎么跳」这三件事,就能覆盖多数日常判断。

适合三类人:想搞清楚编译器到底做了什么优化的系统开发者、讲编译原理与系统课的教师、需要把编译结果对比做成自动检查的团队。上手建议:先用一段真实的小函数跑通 -O0 到 -O2 的对照,再把短链接用起来替代截图;需要批量比较时直接走接口,别再手工点。看汇编是手段不是目的,最终判断标准仍然是性能测试数据。

© 版权声明

相关文章