解剖功能

时间:2018-01-21 16:50:09

标签: c++ compiler-construction machine-code

我很想知道如何编写cout函数,我应该在哪里查找它?

我的第二个问题是,我是否可以真正剖析语言的每个组成部分以便理解它?

例如,我可以看到编译器如何读取运算符?即使它在机器代码中,我如何找到自己?

4 个答案:

答案 0 :(得分:1)

  

我很想知道如何编写cout函数,我应该在哪里查找它?

cout不是一个功能。您的意思是输出流的operator<<成员或非成员函数之一。

无论如何,即使C ++标准没有规定标准库头文件,这些函数通常是根据语言本身实现的,并且驻留在编译器附带的文件中。例如,在我的Windows系统上有一个名为C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\iostream的文件,Visual C ++编译器用它来处理用户代码中的#include <iostream>行。

期望在这些文件中看到许多非标准的,难以阅读的,宏观出现的和未记录的内部伪C ++。

  

我的第二个问题是,我是否可以真正剖析语言的每个组成部分以便理解它?

只有编译器是开源的,例如GCC而不是Visual C ++,并且只有你对编译器编写有足够的了解。

  

例如,我能看到编译器如何读取运算符吗?

只有编译器是开源的,例如GCC而不是Visual C ++,并且只有你对编译器编写有足够的了解。

  

即使它在机器代码中,我如何找到自己?

了解如何在您的系统和工具上view the disassembly

答案 1 :(得分:1)

C ++的很大一部分是标准库,它是用C ++编写的。如果你想检查它的一部分,那么就没有问题 - 只需查看相应的头文件 - cout,它是iostream,位于文件系统的某个位置。

如果您正在使用调试器(例如MS Visual Studio或gdb),您可以在实现中“步入”,就像它是您自己的代码一样。例如,在Visual Studio中,同时调试以下代码行

std::cout << "hello";

F11 ,它会显示相关operator<<的实现。

“核心”C ++语言的某些部分无法以这种方式进行检查。但是,您可以检查生成的机器代码。例如,您是否对编译器如何实现虚函数感到好奇?在Visual Studio中按 Ctrl + F11 ,它将显示代码。

“核心”功能和“库”功能之间的界限虽然有点模糊。 dynamic_cast之类的东西可以通过特殊的C / C ++函数或机器代码实现 - 你必须自己发现它。无论哪种方式,它都很容易调试/检查。

答案 2 :(得分:0)

您可以尝试分析从C ++代码生成的汇编程序代码。

https://godbolt.org/&lt; - 这是一个很好的工具,因为它可以向您展示不同的编译器如何生成相同的东西。你可以比较它们。

如果你想看看它是如何用C ++编写的,你可以在iostream标准库中查看它。

答案 3 :(得分:0)

学习汇编语言,可能不是x86,因为它变得非常复杂。选择一个RISC芯片,例如Raspberry PI。

你会发现像C这样的语言很容易映射到汇编。几乎每个C语句都有一个等价的一个或两个汇编语句。当语言可以被定义为仅允许+ = 1时,甚至有类似于++与INC(汇编增量)匹配的东西。

像Javascript这样的高级语言不容易匹配。它们的设计便于编程而非效率。 C ++是一个很难的,它编译成非常高效的机器代码,但只是因为编译器非常复杂。