了解假设规则,“程序是按书面执行的”

时间:2019-06-28 07:26:22

标签: c++ compiler-optimization

我正在尝试理解假设规则。根据{{​​3}}:

  

常规规则
  允许进行任何不改变程序可观察行为的代码转换

     

说明
  只要满足以下条件,就允许C ++编译器对程序进行任何更改:[...]

我很难理解“说明”部分的第二个提示:

  

2)在程序终止时,写入文件的数据完全就像程序是按写入的方式执行的。

我只是不明白“程序按书面形式执行”的含义。

2 个答案:

答案 0 :(得分:131)

星期一,您的老板来到您的办公室,并说:“我需要在周四之前将文件A放在办公桌上,在星期五之前需要将文件B放在办公桌上”。他首先在文件A中描述了他想要的东西,以及他认为你应该怎么做,然后在文件B中描述了他想要的东西。

在老板的脑海中,您将首先处理文件A,在星期四将文件放在他的办公桌上,然后开始处理文件B,在星期五完成。但是您意识到,更早地开始对文件B进行工作(甚至在文件A之前)会更有意义。您的老板没有理由知道-他关心的只是在星期四收到A,在星期五收到B。您还意识到,他建议的方法可以改进,因此您采用略有不同的方法来生成所需的信息。

以此类推,老板是一些C ++代码,而您是编译器。只要可观察到的行为(将文件放在老板桌面上)相同,编译器就可以重新安排操作(以另一种顺序处理文件)。同样,编译器可以自由地对代码进行任何保留可见行为的转换(使用与老板描述的方法不同的方法)。

特别是,“好像程序是按书面形式执行的”意思是“好像您按照老板的指示去做一样工作”(即使您做了其他事情)。

答案 1 :(得分:13)

所引用规则的一个重要特征是,它为要实现的实现指定了最低限度的一组要求,但绝不意味着这些要求对于任何特定应用程序都是足够的,也不意味着某些应用程序将不需要提供更强有力的保证的实施。假设执行和记录单个测试结果的过程为:

  1. 做实验。
  2. 写下测量结果。
  3. 解锁保险箱
  4. 将带有测量值的纸张放入保险箱。
  5. 锁上保险柜。

如果给一个人执行三个测试,则每个测试可以按顺序执行以上五个步骤,但是以下任一步骤顺序可能也可以接受:

  1. 做实验#1
  2. 在纸#1上写下测量结果
  3. 做第二个实验
  4. 在2号纸上写下测量结果
  5. 做#3实验
  6. 在3号纸上写下测量结果
  7. 解锁保险箱
  8. 将纸张#1放到保险柜中
  9. 将2号纸放入保险柜
  10. 将3号纸放入保险柜
  11. 锁定保险柜

或者-为避免一次跟踪三篇论文:

  1. 做实验#1
  2. 在纸#1上写下测量结果
  3. 解锁保险箱
  4. 将纸张#1放到保险柜中
  5. 做第二个实验
  6. 在2号纸上写下测量结果
  7. 将2号纸放入保险柜
  8. 做#3实验
  9. 在3号纸上写下测量结果
  10. 将3号纸放入保险柜
  11. 锁定保险柜

如果一切都按预期进行,则这三种方法都是等效的。但是,如果第二个实验可能出错,并且弄丢了桌上的所有纸张,那么使用第二种方法将可能会丢失第一个实验的结果-如果采用完全详细的程序,就不会产生结果跟着。更糟糕的是,如果第三个实验真的出错了,并且将保险箱中没有锁定的所有东西都扔掉了,那么第三种方法将冒着丢失保险箱中所有东西的风险,甚至失去与实验无关的内容。

在某些情况下,第二种或第三种方法可能是合适的。在某些情况下不会。判断这些方法是否合适将需要了解实验带来的风险,安全性的内容以及许多其他因素。

标准的作者无法知道判断哪些应用程序需要什么保证所必需的一切。相反,他们依靠各种实现的生产者和用户来认识将需要哪些保证来安全有效地完成需要完成的任何事情。