【问题标题】:C's coverage of assembly [closed]C的汇编覆盖[关闭]
【发布时间】:2016-01-22 01:15:39
【问题描述】:

在与朋友的一次争论中,我说不可能用除 C 之外的任何语言编写一个比 C 中的所有变体更快的程序,它做同样的事情.我的论点是基于对以下问题的肯定回答。是真的吗?

  • 如果我们将“编译”视为从 [C 程序] 到 [汇编程序] 的映射,那么这个映射是否是满射的?

警告:当然,您可以在 C 程序中包含汇编,但假装这是不可能的(提出一个更有趣的问题!)。

【问题讨论】:

  • 这个问题跑题了。请阅读help center,了解哪些类型的问题被视为主题。
  • 这似乎是在问“你能打败编译器吗?”。答案几乎总是“是”。 C编译器很好,尤其是。在比人类精神上可以跟踪的更大范围内进行优化(多层次的内联/简化)。它们很少是最佳的。为了打败编译器,从它的输出开始,寻找保存指令的地方或使用更好的指令序列,尤其是。在一个循环中。
  • 这个意见的依据是什么?这个问题可能很差而且离题,但不是因为这个原因。如果问题是:在 C 语言中2+2 是否总是等于 4,这是否也是基于意见的?

标签: c assembly compilation


【解决方案1】:

问题的答案如果我们把“编译”看作是从[C程序]到[汇编程序]的映射,那么这个映射是满射的吗?显然是NO强>。

可以简单地证明: * 可能存在编译器不会生成的汇编语言指令,例如int 10haltjmp *eaxiretsub esp,esp... * 你可能会在汇编中摆弄 C 编译器从不接触的寄存器,例如段寄存器。

在汇编中有一个 C 语言无法表达的创造力世界。

关于另一个问题,我不确定你的意思

不可能用除 C 之外的任何语言编写比 C 中的所有变体都快的程序来做同样的事情。

如果你的意思是一个熟练的程序员总是可以编写一个在给定任务上比用任何语言编写的任何其他程序更快的 C 程序,我想你也可能错了,因为编译器本身是一个固定变量,它是不完美。

例如,想象一下 C 编译器非常笨拙并生成未​​优化的代码。很明显,可以编写一个在给定任务上击败最佳 C 变体的汇编程序:所需要的只是优化未优化的代码。由于 C 编译器不完善,您总能找到一个任务,即使是最好的 C 变体也可以进一步优化。

【讨论】:

  • @DjangoProblems:如果这个答案有用,请您点击答案分数下方的灰色复选标记接受它吗?
猜你喜欢
  • 1970-01-01
  • 2014-05-23
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2014-06-21
  • 1970-01-01
相关资源
最近更新 更多