【问题标题】:What language are the C and C++ standard libraries written in?C 和 C++ 标准库是用什么语言编写的?
【发布时间】:2011-07-08 05:06:01
【问题描述】:

C 和 C++ 本身实际上无法任何事情,它们需要库才能工作。那么这些库是如何创建的呢?汇编语言?

【问题讨论】:

  • 我认为您必须确定您要询问的编译器和版本。许多编译器可以自己编译,即使这样,源代码也可能是多种语言的混合。
  • C and C++ as themselves can't actually do anything。 @其他人,请不要那么认真!
  • “C 和 C++ 本身实际上无能为力,”呸!以下是一些库函数,用纯 C 编写,没有标准库:char *strchr(const char *c, int i) { while(*c != (char)i)) c++; return (char *)c; }size_t strlen(const char *c) { return (size_t)(strchr(c, 0) - c); }
  • @Chris:您的strchr 有错误。如果从未找到该字符,它将在字符串的末尾循环...
  • @R.. - 我没说他们是正确的... ;) char *strchr(const char *c, int i) { for(; *c; c++) if(*c == (char)i) return c; return NULL; }

标签: c++ c assembly standard-library


【解决方案1】:

C 和 C++ 库几乎普遍使用 C 和 C++ 编写,C 和 C++ 编译器也是如此。其实很多编译器甚至都用来自己编译!

这怎么可能?好吧,显然第一个 C 编译器最初不可能是用 C 开发的。但是,一旦存在 C 编译器,就可以使用它来编译另一个编译器。随着编译器的开发,源代码也在开发中。可以同时开发两者。由于大多数编译器都是对其前辈的改进,因此它们通常用于编译更好的版本!

但是,就库而言,这很容易:C 可以 实际做一些事情。虽然一些较低级别的例程可以用汇编程序编写,但绝大多数可以用 C 或 C++ 编写。

【讨论】:

  • 这是正确的。为了编译标准库,编译器不需要自托管。一旦你有了一个标准库,你就可以制作一个自托管编译器。
  • 一些 asm 是强制性的,不仅仅是为了性能。例如,没有办法在 C 中编写 setjmp
  • @R..:我同意在某些情况下 C 不是适合某些任务的语言。但是,这些只是整个库的一小部分。
  • 这让我想起了 Ken Thompson 据说放在 Unix C 编译器中的后门:scienceblogs.com/goodmath/2007/04/15/…
【解决方案2】:

标准库通常是用 C 和 C++ 编写的,使用最少的汇编代码来与操作系统提供的功能进行交互,并且大多数操作系统都是用 C 以及混合的汇编语言编写的一些不能直接在 C 中完成的事情。

一个更具体的例子...

对于 GNU/Linux,标准库是用 C 和 C++ 编写的。对于需要使用内核的各种事情,最终都会调用syscall,它提供了跳转到内核所需的一小部分汇编代码,其中用C和汇编混合编写的代码处理调用.

【讨论】:

    【解决方案3】:

    这里有一点误解:编译器负责将 C 或 C++(或其他任何东西)翻译成机器代码。库本身可以用 C 编写,这没有问题。而且,即使编译器本身也可以用C编写,只要至少存在一个C编译器来编译它。 (最大的笑话是,要在 linux 上“正确”安装 gcc,您需要 gcc 从源代码编译它。)

    也许你可以问“第一个 C 编译器是用什么编写的”。

    【讨论】:

    【解决方案4】:

    它们是用它们的宿主语言编写的,原因很简单,它们需要与操作系统交互以执行它们自己无法执行的操作,它们会使用操作系统提供的 API 来执行此操作。

    C++ 标准库是用 C++ 编写的,因为它的大部分实现都使用模板。

    【讨论】:

      【解决方案5】:

      在典型情况下,C 标准库主要是用 C 编写的,而 C++ 标准库主要是用 C++ 编写的。

      为了给出一些具体的数字,微软的标准库有大约 1050 个 C 和 C++ 文件,以及 37 个汇编语言文件。看看它们,我会说至少有一半的汇编文件可以用 C 或 C++ 编写;他们使用汇编语言是为了优化,而不是出于必要。

      【讨论】:

        【解决方案6】:

        大多数 C 和 C++ 编译器都是用 C 和 C++ 编写的。这是可能的,因为compiler bootstrapping。关于该主题有一个相关的 Stackoverflow 问题:

        Bootstrapping a compiler: why?

        另外,您可能会喜欢 Ken Thompson 的 Reflection on Trusting Trust。在那篇论文中,Thompson 谈到了信任编译代码所固有的困难。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-26
          • 1970-01-01
          • 2021-10-28
          • 1970-01-01
          • 2014-12-08
          • 2010-11-08
          相关资源
          最近更新 更多