"Implementation-defined" 中的 "Implementation" 是什么软件? "Implementation" 到底是什么?

What kind of software is part of an "Implementation" exactly when stating "Implementation-defined"? What is an "Implementation" exactly?

我经常在C标准文档中看到“implementation-defined”这个语句,也非常想把它作为答案。

然后我在 C99 标准中搜索了它,并且:

在 ISO/IEC 9899/1999 (C99) 中,§3.12 规定:

3.12

Implementation

particular set of software, running in a particular translation environment under particular control options, that performs translation of programs for, and supports execution of functions in, a particular execution environment

以及第 5 节:

  1. Environment

An implementation translates C source files and executes C programs in two dataprocessing-system environments, which will be called the translation environment and the execution environment in this International Standard. Their characteristics define and constrain the results of executing conforming C programs constructed according to the syntactic and semantic rules for conforming implementations.

但它具体指的是哪些软件应用程序?

具体是哪一套软件?

它被描述为提供翻译和执行环境。所以这不可能是编译器本身的问题,还是我这个假设错了?

关于我系统的哪些部分我可以认为是“实施”的一部分?

它是使用的编译器及其依赖的 C 标准、操作系统、C 标准本身使用的组合还是它们之间的混合?

尽管前面的声明是否还包括一个硬件(二手处理器、主板等)?

很不明白exaclty是什么实现

我觉得我必须是一个 100 年经验丰富的电子人才能完全准确地了解这一切。

一般来说,"implementation" 指的是给定的编译器及其运行的机器。后者很重要,因为字节顺序决定了整数和浮点类型的字节顺序,以及其他考虑因素。

需要一个实现来记录其实现定义的行为。例如,您可以找到 GCC's implementation defined behavior here.

编译器往往支持多个版本的C标准,所以每个运行模式也可以认为是一个实现。例如,您可以将 -std 选项传递给 GCC 以指定 c89、c99。或 c11 模式。

C99 标准定义了很多东西,但有些只是不太相关,所以他们没有在意在标准中详细定义它们。相反,他们写 "implementation defined",这意味着无论谁根据他们的标准实际编写编译器,都可以选择他们如何做。

例如,gcc 是该标准的一个实现(实际上,gcc 实现了各种不同的标准,正如 pmg 在他的评论中指出的那样。但现在这还不太重要)。如果您要编写自己的编译器,则只能在符合标准的情况下将其称为 "C99 Compiler"。但是,在标准声明某些内容依赖于实现的情况下,您可以自由选择编译器应该做什么。

我认为您对它是什么有很好的正式认识,并且将您的问题集中在实际实现的细节上,所以这就是我要解决的问题。 "The implementation" 实际上倾向于包含许多组件,这些组件通过许多接口契约相互依赖并起作用,所有这些都需要得到尊重,以便希望实现作为一个整体是符合的。

这些可能包括:

  • 编译器
  • 可能是汇编程序,如果编译器将 asm 生成为中间形式
  • 链接器
  • 库代码是标准库的一部分(它是语言的一部分,因为指定了语言,而不是单独的组件,但仅适用于托管实现而非独立实现)
  • 库代码 "compiler glue" 用于实现编译器不直接发出代码的语言结构(在 GCC 上,这是 libgcc),通常用于缺少硬件 fpu 的机器上的浮点数,除法缺少硬件分频器等的机器
  • 动态链接器,如果实现使用动态链接程序
  • 操作系统内核,如果实现的库函数不直接驱动硬件,而是依赖于系统调用或"software interrupts"或操作系统定义的具有其指定行为的类似功能,以实现部分标准库或其他(例如启动或胶水)库代码
  • 等等

可以说,您也可以说硬件本身是实现的一部分。