30 GOTO 10总是会到10吗?

时间:2009-05-14 21:25:11

标签: compiler-optimization

在乔尔提到的latest podcast的精神中,他想要一些简单的问题以及可能有趣的答案......

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

30 GOTO 10总是会进入10?*

*我没有故意使用20;)

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

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

中编译M.

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

..看看“单形呼叫转换”

[编辑]

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

7 个答案:

答案 0 :(得分:25)

不,它不会。但它总是表现就好像它一样。编译器设计的基本规则之一是“似乎”规则。您的编译器可以进行任何喜欢的更改,只要结果符合,就像您遵循语言规则一样。

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

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

答案 1 :(得分:13)

如果你有

那就没有了
40 COMEFROM 30

代码中的某处。

答案 2 :(得分:8)

alt text

答案 3 :(得分:1)

嗯,如果它没有执行就不会,例如,如果有20 GOTO 40

答案 4 :(得分:1)

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

答案 5 :(得分:0)

你想说什么?任何自称是程序员的人都应该知道(特别是在你提示之后)它取决于第10行和第20行的内容,并且任何超过一周的人都应该意识到这个问题似乎并没有增加多少。 / p>

我们应该依赖代码完成我们告诉它的代码。如果我们在第30行告诉它GOTO 10,但也告诉它跳过第30行,我们不应该在跳过第30行时出错。我们告诉程序。

答案 6 :(得分:0)

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