【发布时间】:2018-01-21 16:50:09
【问题描述】:
我很好奇 cout 函数是怎么写的,我应该去哪里找呢?
我的第二个问题是,我真的可以剖析语言的每个组成部分以理解它吗?
例如,我可以看看编译器是如何读取运算符的吗?即使它是机器代码,我如何在其中找到自己?
【问题讨论】:
标签: c++ compiler-construction machine-code
我很好奇 cout 函数是怎么写的,我应该去哪里找呢?
我的第二个问题是,我真的可以剖析语言的每个组成部分以理解它吗?
例如,我可以看看编译器是如何读取运算符的吗?即使它是机器代码,我如何在其中找到自己?
【问题讨论】:
标签: c++ compiler-construction machine-code
我很好奇 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。
【讨论】:
C++ 的很大一部分是标准库,它是用 C++ 编写的。如果你想检查它的一部分,没有问题 - 只需查看相应的头文件 - 对于cout,它是iostream,位于文件系统中的某个位置。
如果您使用的是调试器(例如 MS Visual Studio 或 gdb),您可以“步入”实现,就好像它是您自己的代码一样。例如,在 Visual Studio 中,同时调试以下代码行
std::cout << "hello";
你按下F11,它会显示相关operator<<的实现。
不能以这种方式检查“核心”C++ 语言的某些部分。但是,您可以改为检查生成的机器代码。例如,你是否好奇你的编译器是如何实现虚函数的?在 Visual Studio 中按 Ctrl+F11,它会显示代码。
“核心”功能和“库”功能之间的界限有点模糊。 dynamic_cast 之类的东西可能由特殊的 C/C++ 函数或机器代码实现——你必须自己去发现它。无论哪种方式,调试/检查都很容易。
【讨论】:
学习一门汇编语言,可能不是 x86,因为那已经变得非常复杂。选择 RISC 芯片,例如 Raspberry PI。
您会看到诸如 C 之类的语言很容易映射到汇编语言。几乎每个 C 语句都有一个等价物,即一个或两个汇编语句。当语言可以被定义为只允许 += 1 时,甚至还有 ++ 匹配到 INC(汇编增量)。
Javascript 等高级语言不那么容易匹配。它们旨在简化编程而不是提高效率。 C++ 是一个难点,它确实可以编译成非常高效的机器码,但这仅仅是因为编译器非常复杂。
【讨论】:
【讨论】: