【发布时间】:2020-09-20 19:34:54
【问题描述】:
我想生成一些 C 并验证它是否可以编译,因此我想使用 C 的一个子集来简化验证。 但是我不想限制可以编写的内容,所以我想要 C 的一个子集,这样给定任何 C 程序,您都可以编写一个程序,该程序将在现代编译器中编译成相同的机器代码。
例如,我认为以下构造是不必要的:
-
x++,++x,x—-,—-x - (编辑:这些不是,感谢@dmuir 和@StoryTeller-UnslanderMonica)
+=,-=,*=,/=,%=,<<=,@9876543325@,@98764 @、^=、|= a[i]- 声明之外的数组类型
p->m
对于某些优化,是否还有其他需要我的?
【问题讨论】:
-
我不太确定 += 等。假设 e 是一个涉及调用具有副作用的函数的复杂表达式;那么 e += 1 将与 e = e + 1 不同,因为在第二种形式中副作用会发生两次。
-
您认为只将简单对象视为操作数。对于用于生成左值的函数调用,例如
*f() += 1。结果将不一样,因为*f() = *f() + 1必须调用函数两次,而简写只调用一次。这会影响行为。所以这是需要注意的事情。 -
这没有多大意义。某个功能可能是多余的,因为在功能方面存在类似的功能,但这并不一定意味着它们在性能方面是等效的。有很多微妙的废话,例如 x += y 在评估方面与 x = x + y 不完全相同,或者 ?: 由于隐式提升,与 if-else 不完全相同,某些布尔检查在功能上是等效的,但是其中一个生成分支等。
-
这个问题是荒谬的。既定目标“我想生成一些 C 并验证它是否可以编译”,可以通过生成格式良好的 C 代码和/或调用编译器并评估其结果来实现。 “我想使用 C 的一个子集来简化验证”的陈述原因并不能很好地支持陈述的目标。声明“我不想限制可以编写的内容,因此我想要 C 的一个子集,这样给定任何 C 程序,您都可以编写一个程序,该程序将在现代编译器中编译成相同的机器代码”是一个 不合逻辑。而后者基本上是不可能的。
-
“我想使用 C 的一个子集”和“我不想限制可以写的内容”这两种说法是矛盾的。问题结束的地方,生成相同的机器代码,与它开始的地方无关,生成将编译为 C 代码的代码。
标签: c code-generation