陈述“实施定义”时,究竟哪种软件属于“实施”?究竟什么是“实施”?

时间:2019-10-25 14:34:11

标签: c

我经常在C Standard文档中看到语句“ implementation-defined”,并且得到了很多答复。

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

ISO / IEC 9899/1999(C99)在第3.12节中有规定:

  

3.12

     

实施

     

在特定翻译环境中以特定控制选项运行的特定软件集,用于在特定执行环境中执行程序翻译并支持功能的执行

同样在第5节中:

  
      
  1. 环境
  2.   
     

实现在两个数据处理系统环境中转换C源文件并执行C程序,在本国际标准中将其称为转换环境和执行环境。它们的特征定义和限制了执行符合C语言的语法和语义规则的结果,这些C语言程序是根据符合实现的语法和语义规则构建的。

但是它确切指的是哪些软件应用程序?

特别是哪一套软件?

据说可以提供翻译和执行环境。因此,不能仅仅依靠编译器,还是我对这个假设不对?

我可以将系统的哪些部分视为“实施”的一部分?

是使用过的编译器及其依赖的C标准,操作系统,使用的C标准本身的组合还是所有这些之间的混合?

尽管有前面的说明,它是否还包括一块硬件(二手处理器,主板等)?

我很不明白,什么是实现技巧。

我觉得我必须是一个拥有100年经验的电子人,才能完全准确地了解所有内容。

3 个答案:

答案 0 :(得分:4)

通常来说,“实现”是指给定的编译器及其运行的机器。后者之所以重要,是因为字节顺序决定了整数和浮点类型的字节顺序。

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

编译器通常支持C标准的多个版本,因此每种操作模式也可以视为一种实现。例如,您可以将-std选项传递给GCC以指定c89,c99。或c11模式。

答案 1 :(得分:3)

我认为您对它的含义有一个很好的形式上的理解,并将您的问题集中在现实世界中的实现上,所以我将要解决的是。实际上,“实施”往往包含许多组件,它们通过多个接口协定相互作用并相互依赖,必须对所有这些构件进行尊重,以使整个实施方案具有希望。 >

这些可能包括:

  • 编译器
  • 如果编译器将asm作为中间形式生成,则可能是汇编器
  • 链接器
  • 标准库一部分的库代码(作为语言的一部分,语言是指定的语言,不是单独的组件,而仅适用于托管实现而不是独立实现)
  • 库代码,是“编译器胶水”,用于实现编译器不直接为其发出代码的语言构造(在GCC上,这是libgcc),通常用于缺少硬件fpu的机器上的浮点数,而对于缺乏硬件的机器上的除数硬件分隔器等。
  • 动态链接器,如果实现使用动态链接程序
  • 操作系统内核,如果实现的库函数不直接驱动硬件,而是依赖于syscall或“软件中断”或具有特定行为的操作系统定义的类似项,以实现部分标准库或其他(例如启动或粘合)库代码

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

答案 2 :(得分:-1)

C99标准定义了很多东西,但是有些东西并没有那么重要,因此他们不在乎在标准中详细定义它们。相反,他们写的是“实现定义的”,这意味着实际上根据他们的标准对编译器进行编程的任何人都可以选择他们执行此操作的精确程度。

例如,gcc是该标准的实现(实际上,gcc实现了各种不同的标准,正如pmg在他的评论中指出的那样。但是现在这并不是太重要)。如果要编写自己的编译器,则必须遵循标准才能将其称为“ C99编译器”。但是,如果标准规定某些东西取决于实现,则可以自由选择编译器应该做什么。