独立实现和托管实现之间是否存在有意义的区别?

我的问题主要涉及第四节第六段 。

这两种符合实施forms是托管和独立的。 符合要求的托管实施应接受任何严格符合的程序。

据我了解,这构成了典型的应用程序环境,包括文件系统,分配内存和线程……

符合标准的独立实现应接受任何严格符合的程序,其中库子句(第7节)中指定的特性的使用仅限于标准头文件

……这构成了典型的内核和/或嵌入式,最小环境, 没有标准文件系统,分配内存或线程(以及其他内容)。

符合条件的实现可能具有扩展(包括附加库函数),前提是它们不会改变任何严格符合程序的行为。

似乎这为托管实现提供了自由调用托管或独立实现的自由,当涉及文件系统,分配内存或线程(以及其他内容)时,这些可以属于扩展类别,因此它只能实现一个接口,每次都返回一个指示错误的值。 仅举几个:

  • fopenfgetsmalloc可以返回NULL
  • fprintffscanffputcfgetc可以返回EOF
  • thrd_create可以返回thrd_error (表示“请求无法兑现”)

这意味着区分第四节第六段给出的内容实际上毫无意义。 是否有任何要求保证托管和独立实施中这些function的某些实际function级别? 例如,是否要求上述函数实际上能够返回除相应故障值之外的其他函数?

引用的段落已经很好地说明了这一点。

托管执行环境也是独立的,但反之亦然。 编译器只需要提供独立的实现。 例如,gcc严格来说是独立的,因为标准库不包括在内。 但是,它假定在编译托管环境时可以使用它(默认值),假设lib在系统上可用(如glibc)。 看到这里

简而言之, 独立式只是语言。 它不需要支持任何库和几个标题(主要用于常见类型和实现特定的东西,如数字限制等)。 这意味着标准库不需要存在 – 相应的头也不存在。 原因是一个独立的环境,很可能不会有文件,显示等设施。它用于内核,裸机嵌入等。

请注意,例如,如果编译托管环境( -fhosted ),gcc将假定标准库中使用的函数具有相应的含义,并且可能应用非常积极的优化(它内置了许多这些函数)。 对于独立式,它实际上没有,因此您可以使用函数strcmp ,例如具有完全不同的语义。 但是,它假定mem …-函数存在,因为它们用于普通代码,例如结构赋值。

所以,如果建造裸机,你应该总是通过-ffreestanding

如果托管实现自称为独立式 ,那么它显然不再是托管实现 。 然而,一旦它自己托管 ,它必须提供标准所需的所有设施,不允许只实现虚拟变量,但必须提供标准中定义的语义。

只是说清楚:引用的部分允许独立环境省略库的所有function,除了少数列出的标题。 因此,您可以自由地提供任何其他库并使用相同的名称,但您可以做任何您喜欢的事情。 由于这不是标准库,因此不需要合规。

5.1.2.1进一步指出“除了第4条要求的最小集合之外,任何独立程序可用的库设施都是实现定义的”。 这确实支持了我的发言。 旁注:它也不需要main()作为程序入口点。

C实现有很多种,针对多种不同的执行平台,其中许多可以提供各种有用的function,并保证其他人不能。 标准的作者认为,在大多数情况下,应该足够明显应该针对各种平台和应用领域提供哪些特性和保证,以及如何提供它们,不需要有标准关注这些细节。 另一方面,需要诸如文件I / O之类的应用程序的数量以及可以提供它们的平台的数量足以certificate将包含这些特征的那些实现识别为“特殊”。

通常,旨在为独立使用而设计的实现将可用于无法有效处理托管实现的平台上。 虽然标准提出了一些超出一些较小C平台实际要求的要求,但是一些几乎符合要求的C实现可以非常有用地用于只有足够存储空间来保存256条指令和16字节变量的处理器。 如果数字厨房温度计/计时器小工具没有文件系统或控制台,为什么它会浪费存储在stdout描述符之类的东西上?

此外,由于标准没有定义独立应用程序可以执行I / O的标准方法,并且由于不同平台以不同方式处理I / O,因此几乎独立应用程序将针对特定目标平台或平台范围。 托管实现不暴露自然特征或保证底层平台将提供可能对运行不需要此类function或保证的程序有用。 然而,如果没有使用特定于平台的function和保证,嵌入式程序就无法做很多事情,因此,一个不允许程序员访问这些东西的独立实现将无法做很多事情。 质量实现应该允许程序员使用任何可以帮助他们完成他们需要做的function或保证,尽管有些人可能需要使用编译选项来确保他们不做任何古怪的事情。 出于某种原因,标准委员会认为可能存在一些实现和应用领域,其中特征或保证的价值不能certificate成本是合理的,这已成为时尚,这表明程序员不应期望实现提供在低级编程中有用的function或保证,并且平台将提供基本上零成本的function。