【问题标题】:Dissecting functions [closed]解剖功能[关闭]
【发布时间】:2018-01-21 16:50:09
【问题描述】:

我很好奇 cout 函数是怎么写的,我应该去哪里找呢?

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

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

【问题讨论】:

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


    【解决方案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

    【讨论】:

      【解决方案2】:

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

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

      std::cout << "hello";
      

      你按下F11,它会显示相关operator&lt;&lt;的实现。

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

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

      【讨论】:

      • 标准库主要不是用 C++ 编写的,因为没有标准库的 实现。它可以主要用 C++ 编写。这是一个相当重要的区别。当然,该标准并不要求以文件的形式实现标头,尽管这是最合乎逻辑和最简单的实现。
      【解决方案3】:

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

      您会看到诸如 C 之类的语言很容易映射到汇编语言。几乎每个 C 语句都有一个等价物,即一个或两个汇编语句。当语言可以被定义为只允许 += 1 时,甚至还有 ++ 匹配到 INC(汇编增量)。

      Javascript 等高级语言不那么容易匹配。它们旨在简化编程而不是提高效率。 C++ 是一个难点,它确实可以编译成非常高效的机器码,但这仅仅是因为编译器非常复杂。

      【讨论】:

        【解决方案4】:

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

        https://godbolt.org/

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

        【讨论】:

          猜你喜欢
          • 2017-09-07
          • 2023-03-20
          • 2015-12-01
          • 2018-09-04
          • 1970-01-01
          • 2011-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多