CPU眼里的C/C++
上QQ阅读APP看书,第一时间看更新

1.1 工具介绍

●Compiler Explorer

工欲善其事必先利其器,为了从CPU的视角审视代码,我们必须将平时写的代码,转变成CPU可以直接运行的机器语言,但我们不可能直接阅读0101这样的机器码,相反,我们会阅读、分析这些机器码对应的汇编指令,也叫CPU指令,汇编语言。

虽然市面上已经有很强大的工具(例如:GCC、Visual Studio),都可以实现C/C++语言到汇编语言的转换,但Compiler Explorer无疑是最具艺术创造性的。它能干净、整洁、一一对应地列出每行源代码对应的汇编指令,是真正能帮助开发者一眼就能找到有用信息的在线编译/反编译工具,可以扫描右侧二维码在线使用。

夸张地说,阿布也是在亲身体验过这款工具后,才决定制作《CPU眼里的编程知识》这个系列的视频。一个干净、清爽的工具,能最有效率地展现最关键的知识点,避免让读者迷失在细节的汪洋大海之中。

最后,Compiler Explorer也是一个开源项目,可以扫描右侧二维码学习。

Compiler Explorer

GitHub链接

●使用方法

耳听为虚,眼见为实。让我们实际体验一下Compiler Explorer的效果。先用浏览器打开Compiler Explorer的网址,然后编写一个最简单的main函数,如图1-1、图1-2所示。

图1-1

图1-2

如你所见,通过颜色的对应关系,我们一眼就能看出,左边的源代码:return 0,对应的CPU指令就是:mov eax,0。

我想此时,无级阿布多言,你都可以猜出,return 0对应的CPU指令,是要把数值0,写入寄存器eax,而eax就是用来存放main函数的函数返回值的。

然而,Compiler Explorer不仅仅可以呈现C/C++语言的汇编指令,还能翻译出RUST,GO,Swift,Python,Java的汇编指令或字节码。

相信,当大家在学完本书后,也能用同样的方法,快速掌握其他编程语言背后的秘密。同时,Compiler Explorer还支持某个编译器的不同版本,你可以选择自己需要的版本进行试验,如图1-3所示。

如果需要查阅机器码,还可以单击“Output Options”按钮,在下拉菜单中选择“Compiler to binary”复选框,如图1-4所示。

这样,右边的窗口,不仅会现实汇编指令,还会附加显示对应的机器码和机器码存放的内存地址;如果需要修改编译选项,也可以单击Compiler options输入框,手动填写编译选项。

图1-3

图1-4

除了编译,Compiler Explorer还提供了运行环境,只需在“Output Options”的下拉菜单中选择“Execute the code”复选框,就可以在Output窗口里面看到程序的输出结果。

●总结

(1)Compiler Explorer是一个非常优秀、简单、轻量的反编译工具,相比常规的编译软件,它更加直观、生动,能够快速定位任意一行源代码对应的汇编指令,十分便于大家了解、认识源代码背后的实现逻辑。

(2)再好的工具,也不能代替人去思考和洞察代码背后的逻辑。开发者的水平越高,越能发掘出工具的价值。

最后,在随后的学习中,我们将重复使用Compiler Explorer,请大家跟随阿布的节奏,在实践中,不断熟悉这个工具,发挥工具的作用。

●热点问题

Q1:我可以用Visual Studio来查阅汇编代码吗?

A1:当然可以!在使用Compiler Explorer之前,阿布也经常用Visual Studio、GCC来探究程序的运行原理和Debug。大家根据自己的喜好,选择自己顺手的工具就好。