当前位置: 首页 > 知识库问答 >
问题:

C和它的抽象机器之间的确切关系是什么?

毕魁
2023-03-14

我在读“简而言之”,有很多类似于这句话的句子:

语句指定要执行的一个或多个操作,例如为变量赋值、将控件传递给函数或跳转到另一个语句。

我的问题是“执行”这些动作的东西是什么?

我到处读到过C被定义为在抽象机器上运行,所以我的猜测是抽象机器应该执行这些动作,像gcc这样的实际编译器的工作是确保如果你根据抽象机器的工作方式在精神上评估一个程序,那么你将得到与实际运行编译器生成的目标文件时相同的结果(当然在大多数情况下在精神上评估一个程序是不可能的,但我在这里从理论上说)。

那么抽象机器应该直接解释C代码(预处理后)吗?C应该翻译成抽象机器解释的一些中间代码吗?抽象机器和C之间到底有什么关系?

抽象机器对程序可见的状态是什么?只有主html" target="_blank">存储器?如果抽象机器真的直接解释C代码,声明是如何计算的,它们如何改变抽象机器的状态?最后一系列问题的目的只是让你了解我所说的C和它的抽象机器之间的精确关系。

共有2个答案

商佑运
2023-03-14

抽象机是程序执行模型的正式C术语。它与称为图灵机的抽象模型有关,是指语言的核心。抽象机器由整个章节C17 5.1.2.3程序执行定义,其中第一行表示:

本国际标准中的语义描述描述了与优化问题无关的抽象机器的行为。

换句话说,抽象机器是程序指定结果的模型,而不考虑优化。它规定了表达式的术语顺序(执行顺序)、确定是否允许优化的规则以及程序的可观察行为。

简而言之,抽象机器指定了源代码行的读取方式,就像从源文件的顶部到底部执行一样。

举个例子:

int a = 1;
int b = 1;
int c = a + b + 1;
printf("%d", c);

抽象机器指定首先执行 a 和 b 的初始化,然后执行 int c = a b 1 行;最后执行 printf。结果必须为 3。这意味着如果编译器影响程序的结果,则不允许编译器对这些行重新排序。在每行的 ; 处都有序列点,必须完成所有先前的计算。

然而,编译器可以自由地首先执行子表达式a b,或者b 1,因为它们彼此之间没有排序。未指定评估顺序。类似地,它可以在a之前初始化b,因为顺序无关紧要。

编译器还可以自由地将代码替换为c=111c=3或将其全部替换为printf(“3”) 。两者都不会影响程序的可观察行为,因此这将是有效的优化。

谢骏奇
2023-03-14

抽象机器不存在——毕竟,它从字面上看是抽象的(“存在于思想或想法中,但没有物理或具体存在”)。抽象机器是精确遵循标准规则的虚构机器。

C程序由编译器编译成一个具体的机器,它可能(而且通常)具有与抽象机器不同的语义。实际的机器可能有诸如推测执行、无序执行和并行性之类的东西。

兼容的编译器必须生成一个可执行文件,该可执行文件在运行时将具有可观察的行为,就像程序在所述抽象机器中按照标准规则执行一样。

 类似资料:
  • 本文向大家介绍.Net、ASP.Net、C#、VisualStudio之间的关系是什么?相关面试题,主要包含被问及.Net、ASP.Net、C#、VisualStudio之间的关系是什么?时的应答技巧和注意事项,需要的朋友参考一下 答:.Net一般指的是.Net Framework,提供了基础的.Net类,这些类可以被任何一种.Net编程语言调用,.Net Framework还提供了CLR、JIT

  • 我看到这里 老实说,我不理解这张纸条。它们是否意味着有可能用MonadPlus永远中断,例如IO Bool?比如说,IO False将破坏它。。。 当然,我可以破例或者永远实现自己的,但我的兴趣是关于这个奇怪的音符。

  • 我知道OOP概念的基础[继承,抽象,封装,多态] 我们在父子关系的情况下使用继承[孩子可以拥有父母拥有的所有功能,也可以为自己添加更多功能] 我们使用抽象类(在java中)作为类中方法的部分默认实现,也可以通过简单的继承来实现。 看看下面的例子,我的观点很清楚。 继承: 父类 儿童班 抽象类: 父类 儿童班 对于上述计划,o/p将相同。 所以我想,, 继承:我们需要重写子类中的方法 抽象类:在方法

  • 问题内容: 如果我的问题听起来很重要,我会事先道歉,我在QA和Selenium中非常陌生。 之间的确切区别是什么? 和 我在这里看了一下,但没有弄清楚。 问题答案: visibleOfElmementLocated检查元素是否存在以及是否可见。要检查可见性,请确保元素的高度和宽度大于0。 presentOfElementLocated仅检查dom以查看它是否可以定位元素(无论其可见性如何)。 来源

  • 有人能解释一下ERD模型和RDF之间的确切区别吗?ERD模型讲的是实体、关系和属性,RDF讲的是主语、谓语和宾语?我查看了各种资源,如http://www.w3.org/designissues/rdfnot.html,但我仍然不清楚其中一个优于另一个。

  • 我正在使用Drools 6.2.0。最终,我需要使用window:time处理一组事件。每个事件都有一个日期字段。 在我的drl中: e1 (2015-01-01 00:00:00) e2 (2015-01-01 00:00:20) e3 (2015-01-01 00:00:40) e4 (2015-01-01 00:01:00) 场景1:使用实时并同时插入集合a事件。 场景2:使用pseudo,