【问题标题】:C - What are C implementations?C - 什么是 C 实现?
【发布时间】:2019-04-15 14:17:12
【问题描述】:

您能否从三个突出显示的表达式中获得灵感,解释一下究竟是什么实现?

来自“C Primer Plus”> 语言标准

目前,有许多 C 实现可用。 理想情况下,当您 编写一个 C 程序,它应该在任何实现上都一样, 前提是它不使用特定于机器的编程。为此 在实践中确实如此,不同的实现需要符合 公认的标准。

【问题讨论】:

  • 编译器初始化,以及编译器运行的机器。
  • @Bathsheba 不仅 libc 也是实现的一部分
  • 基本上,实现是编译器和它支持的 C 库的组合。
  • C 语言 = 您在文本编辑器中输入的内容;实现 = 对您输入的内容实际执行的操作。

标签: c implementation


【解决方案1】:

一个符合标准的 C 实现包括一个编译器,它按照标准的要求翻译编译单元,一个标准库的实现,用于标准所需的所有函数,以及 一些东西(通常是一个链接器),它将所有内容放在一起以构建可执行文件。事实上,该实现还包括运行生成的可执行文件所需的所有软件。

当我们应该谈论 C 开发环境时,我们通常会谈论编译器(gcc、clang、msvc)。在每个 vendor 系统中,您可能有不同的实现,因为例如 gcc 或 clang 可以为不同的 int 大小(32 位或 64 位)以及最终不同的字节序生成可执行文件。然后每个配置构成一个特定的实现。

为了更详尽,应该注意在所谓的独立执行环境中支持标准库可能是可选的(与托管执行环境相对)。在现实世界中,standalone 模式用于内核开发,因为内核必须能够在标准库中的所有功能可用之前启动。否则,如果内核需要只有在完全加载时才能提供的功能,我们就会遇到先有鸡还是先有蛋的问题......


参考:C11 的 n1570 草案将实现定义为:

3.12 实施:
特定的软件集,在特定的翻译环境下运行 控制选项,执行程序的翻译,并支持执行 在特定的执行环境中发挥作用

【讨论】:

  • 加上运行它的操作系统和硬件:C 实现是从 C 源代码(在 C 标准中定义以包括翻译环境)执行程序所需的一切和执行环境,执行环境包括操作系统和硬件)。
  • @EricPostpischil:你是对的。我很快就会更新我的答案。
  • @EricPostpischil — 您描述的是托管实现。它们也是独立的实现。当然,它们比托管的更稀有。
  • 当您说“实际上实现还包括运行生成的可执行文件所需的所有软件”时,您指的是什么?因为如果我没记错的话,可执行文件是机器指令列表,那么该计划的哪个元素是 C 源代码实现的一部分?例如,如果我有一个 jpg,我用来打开它的程序是 C 实现的一部分吗?
  • 另外,当我的书说“理想情况下,当你编写一个 C 程序时,它应该在任何实现上都一样”,在这种情况下,实现代表什么?操作系统?处理器?或者它是否意味着“它应该在任何实现上编译相同”?
【解决方案2】:

C 通常由 C 编译器实现。在该段落中,您可以简单地相应地替换它。

使用更通用的术语“实现”的原因是编译器可能包含多个前端或由不同的任务组成,或者理论上存在编译器无法想象的其他形式。

C 标准是针对“抽象机器”定义的,它的行为与标准描述的一样,但没有任何其他要求,并将映射到真实机器定义为实现者的练习。

【讨论】:

  • C 实现不仅包括编译器,还包括标准库——包括编译时和运行时组件。
  • 虽然编译器(套件)通常包含这些,但您当然是对的,值得一提
【解决方案3】:

实现是对特定规范的应用。

例如,规范可以是 ISO 国际标准,实现可以是 gcc 或 clang;已实现标准规范的编译器与标准库的实现相结合。

【讨论】:

  • C 实现不仅包括编译器,还包括标准库——编译时和运行时组件。这与仅提供编译器的 GCC 尤其相关。它需要与glibc配对,形成一个完整的C实现。
猜你喜欢
  • 2023-01-31
  • 1970-01-01
  • 2010-10-12
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 2012-01-04
  • 1970-01-01
相关资源
最近更新 更多