正如标题所述:
一个典型的答案可能是:
允许进行任何不改变程序可观察行为的代码转换的规则。
我们经常会从某些实现中得到与此规则有关的行为,其中很多是错误的。
那么,“as-if”规则究竟是什么呢?标准并没有明确将这个规则作为一个部分或段落进行说明,所以这个规则的范围究竟包括哪些内容呢?
对我来说,这似乎是一个未被标准详细定义的灰色地带。有人能详细阐述一下,并引用标准的参考资料吗?
注意:同时标记为C和C++,因为它与两种语言都相关。
正如标题所述:
一个典型的答案可能是:
允许进行任何不改变程序可观察行为的代码转换的规则。
我们经常会从某些实现中得到与此规则有关的行为,其中很多是错误的。
那么,“as-if”规则究竟是什么呢?标准并没有明确将这个规则作为一个部分或段落进行说明,所以这个规则的范围究竟包括哪些内容呢?
对我来说,这似乎是一个未被标准详细定义的灰色地带。有人能详细阐述一下,并引用标准的参考资料吗?
注意:同时标记为C和C++,因为它与两种语言都相关。
Therefore, the "as-if" rule mandates that a conforming implementation must produce the same observable behavior as if it were executing the program according to the abstract machine specified by the C++ Standard. However, implementations are free to perform any optimization or transformation that does not affect this observable behavior.
标准对执行该程序的实现不提出任何要求,甚至不涉及在第一个未定义操作之前的操作。 值得强调的是,这个限制仅适用于执行“格式良好的程序”,而执行包含未定义行为的程序可能会产生未受限制的结果。这在段落1.9/4中也明确说明:
在抽象机器中,所有表达式都按照语义规定进行评估。如果实际的实现可以推断出其值未被使用且没有产生所需的副作用(包括由调用函数或访问易失性对象引起的任何副作用),则无需评估表达式的某个部分。
[...]
符合要求的最低实现要求是:
- 对易失性对象的访问严格按照抽象机器的规则进行评估。
- 在程序终止时,写入文件的所有数据都必须与根据抽象语义执行程序的结果相同。
- 交互设备的输入和输出动态应按照7.21.3中指定的方式进行。这些要求的目的是使未缓冲或行缓冲的输出尽快出现,以确保提示消息实际上出现在程序等待输入之前。
这是程序的可观察行为。
(*) 根据一些语言学家的定义,方言是一种带有“军队”的语言。在这种情况下,这可能意味着一种没有委员会和特定的编译器编辑行业的编程语言。
所谓的“仿佛规则”并不是一个独立的规则;它并没有涵盖任何特定的程序,也根本不是一个可以讨论、删除或改变的规则:这个所谓的“规则”只是重申了程序语义是如何定义的,并且只能通过程序与“外部”世界的可见交互来进行便携式(通用)定义。
外部世界可以是I/O接口(stdio),GUI,甚至是输出纯函数式语言的交互解释器的结果值。在C和C++中,它还包括对易失性对象的(模糊指定的)访问,这意味着某些对象在给定点必须严格按照ABI(应用二进制接口)在内存中表示,而不需要明确提及ABI。
对于什么是执行轨迹,也称为可见行为或可观察行为的定义,就是所谓的“仿佛规则”的含义。尽管“仿佛规则”试图解释它,但却更加混淆人们的思维,因为它给人一种额外的语义规则,给实现提供了更多的灵活性。
总结: