【问题标题】:Will 30 GOTO 10 always go to 10?30 GOTO 10 会一直到 10 吗?
【发布时间】:2025-12-18 21:30:02
【问题描述】:

本着 latest podcast Joel 提到的精神,他想要一些简单的问题以及可能有趣的答案...

在当今我们必须编程的环境中,我们不能依赖语言语句的执行顺序。真的吗?我们应该担心吗?

30 GOTO 10 总是会转到 10 吗?*

*我不是故意使用 20 ;)

[编辑]四个人投票结束这个问题...

“运行时编译器使用分析信息来帮助优化正在编译的代码。JVM 被允许使用特定于执行的信息来生成更好的代码,这意味着一个程序中的编译方法 M 可能生成不同的代码在另一个中编译 M"

(来自 Java 并发实践,2006,Goetz 等人)

.. 看看“单态调用转换”

[编辑]

另一个编辑,您的处理器可以交换语句的执行顺序...

【问题讨论】:

  • 嗯,那是哪些环境?
  • 如果问题不清楚,您可以在评论中请求更多信息,而不是关闭它。 ;)
  • 当你看到它是如何被标记的时候,这个问题就变得清晰多了。编译器优化会对您的代码进行大量转换。那么“30 GOTO 10”在这些优化之后仍然会变为 10 吗?”至少我是这么理解的
  • 这是一个有效的问题。为什么版主必须关闭他们不够聪明无法理解的问题?
  • 这对你我来说都很明显,因为我们知道答案。不是每个人都这样做,因此这个问题。我发现有很多关于 SO 的问题很明显。显然其他人不同意,因为问题仍然被问到。只要人们希望他们得到答复,这难道不是这样做的正确地方吗? OP 发现编译器会更改您的代码(他们会),并询问这些更改的安全性。对我来说似乎很公平。

标签: compiler-optimization


【解决方案1】:

不,不会。但它总是会表现就好像它确实做到了一样。编译器设计的基本规则之一是“好像”规则。你的编译器可以做任何它喜欢的改变,只要结果表现得就好像你已经遵循了语言规则。

GOTO 10 可以决定跳转到其他位置,只要编译器可以保证它不会改变程序的结果。

所以不,你不应该担心。

【讨论】:

  • 例如如果10 GOTO 100,编译器很可能编译成30 GOTO 100。(这种情况在手写代码中不常发生,但这种事情一直在发生在编译器生成的中间代码中。)
【解决方案2】:

如果你有,就不会

40 COMEFROM 30

在你的代码中。

【讨论】:

  • 语言描述指定了一定范围的“PLEASE”子句(IIRC)的比率,以免您的程序对编译器显得不礼貌或谄媚。是否定义了单行程序是否需要“PLEASE”?
  • 我承认,我的 INTERCAL-fu 欠缺。这当然是 BASIC 变体。在 ITERCAL 中,它会是“PLEASE COMEFROM .3”或类似的东西。
【解决方案3】:

好吧,如果它不执行就不会,例如如果有一个20 GOTO 40

【讨论】:

    【解决方案4】:

    在 BASIC 中,是的。在其他语言中,会产生编译错误。

    【讨论】:

      【解决方案5】:

      你想说什么?任何自称是程序员的人都应该知道(尤其是在你暗示之后)这取决于第 10 行和第 20 行的内容,任何在 SO 上工作超过一周的人都应该意识到这个问题似乎并没有增加太多。

      我们应该依靠代码完全按照我们的指示去做。如果我们在第 30 行告诉它GOTO 10,但也告诉它跳过第 30 行,那么当第 30 行被跳过时,我们不应该感到最惊讶。我们告诉程序这样做。

      【讨论】:

      • 允许编译器更改语句的执行顺序。你的处理器也是如此。你知道吗?
      • 正如 jalf 指出的那样,结果并不重要。为什么要打扰?
      • 因为这是一个模糊有趣的问题?
      【解决方案6】:

      的确,如果您考虑执行 BASIC 程序的多核 CPU,其中一个核可能会意外错过 GOTO(提示:“TLB 错误”)并继续执行,就好像它不存在一样。

      【讨论】: