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。大家根据自己的喜好,选择自己顺手的工具就好。