编译C++代码如何产生机器码?

How does compiling C++ code produce machine code?

我正在使用网站 learncpp.com 学习 C++。第 0.5 章指出编译器的目的是将人类可读的源代码转换为机器可读的机器代码,由 1 和 0 组成。

我编写了一个简短的 hello-world 程序并使用 g++ hello-world.cpp 对其进行了编译(我使用的是 macOS)。结果是a.out。它确实可以很好地打印“Hello World”,但是,当我尝试查看 vim/less/Atom/... 中的 a.out 时,我没有看到 1 和 0',而是看到了很多这样的:

H�E�H��X�����H�E�H�}���H��X���H9��

为什么 a.out 的内容不像机器代码所预期的那样只是 1 和 0?

它们是二进制位(1 和 0),但无论您使用什么软件查看文件内容,都试图将它们读取为人类可读字符,而不是机器代码。

如果您仔细想想,您在文本编辑器中打开的所有内容都是由存储在裸机上的二进制位组成的。这些 1 和 0 可以用许多不同的方式解释,大多数文本编辑器都会尝试将它们作为字符读入。以字符 'A' 为例。它的ASCII码是65,二进制是01000001。当文本编辑器在您的计算机上读取文件时,它会将这些位作为字符而不是机器指令进行处理,因此它以 01000001 模式读取 8 位(字节),它知道它刚刚读取了一个 'A' .

此过程会导致您在可执行文件中看到混乱的符号。虽然某些内容恰好采用正确的模式来制作人类可读的字符,但其中大部分内容可能不在字符编码认为有效或知道如何打印的范围之外,从而导致您看到的“�”。

我不会在这里深入探讨字符编码的工作原理,但请阅读 Character Encodings for Beginners 了解更多信息。