1

本着乔尔提到的最新播客的精神,他想要一些简单的问题和可能有趣的答案......

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

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

*我没有故意使用 20 ;)

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

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

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

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

[编辑]

和另一个编辑,你的处理器被允许交换语句的执行顺序......

4

7 回答 7

25

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

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

所以不,它不应该让你担心。

于 2009-05-14T21:35:22.657 回答
13

如果你有

40 COMEFROM 30

在您的代码中的某处。

于 2009-05-14T21:29:32.013 回答
8

替代文字

于 2009-05-14T21:47:49.210 回答
1

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

于 2009-05-14T21:30:20.513 回答
1

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

于 2009-05-14T21:30:33.180 回答
0

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

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

于 2009-05-14T21:37:46.627 回答
0

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

于 2009-05-14T21:59:58.557 回答