Будут ли 30 GOTO 10 всегда идти к 10? - PullRequest
1 голос
/ 15 мая 2009

В духе последнего подкаста , где Джоэл упомянул, что он хотел бы задать несколько простых вопросов с возможно интересными ответами ...

В средах, в которых мы должны сегодня программировать, мы не можем полагаться на порядок выполнения наших операторов языка. Это правда? Должны ли мы быть обеспокоены?

Будет ли 30 GOTO 10 всегда переходить к 10? *

* Я не использовал 20 специально;)

[править] для четырех человек, проголосовавших за закрытие этого вопроса ...

"Компиляторы времени выполнения используют информацию профилирования, чтобы помочь оптимизировать компилируемый код. JVM разрешается использовать информацию, специфичную для выполнения, для создания лучшего кода, что означает, что метод компиляции M в одной программе может генерировать код, отличный от компиляция M в другом "

(из практики параллелизма Java, 2006, Гетц и др.)

.. взгляните на «преобразование мономорфного вызова»

[править]

и другое редактирование, ваш процессор может поменять местами порядок выполнения операторов ...

Ответы [ 7 ]

25 голосов
/ 15 мая 2009

Нет, не будет. Но он всегда будет вести себя , как если бы он это делал. Одним из основных правил в дизайне компилятора является правило «как будто». Ваш компилятор может вносить любые изменения, которые ему нравятся, если результат будет вести себя , как если бы вы следовали правилам языка.

GOTO 10 может решить перейти в другое место, если компилятор может гарантировать, что это не изменит результат программы.

Так что нет, это не должно вас волновать.

13 голосов
/ 15 мая 2009

Нет, если у вас есть

40 COMEFROM 30

где-то в вашем коде.

8 голосов
/ 15 мая 2009

alt text

1 голос
/ 15 мая 2009

В бейсике да. На других языках это приведет к ошибке компиляции.

1 голос
/ 15 мая 2009

Ну, не будет, если не выполнится, например, если есть 20 GOTO 40.

0 голосов
/ 15 мая 2009

Правда, если вы рассматриваете многоядерные процессоры, выполняющие программу BASIC, одно из ядер может случайно пропустить GOTO (подсказка: «Ошибка TLB») и продолжить, как если бы его там не было.

0 голосов
/ 15 мая 2009

Что ты пытаешься сказать? Любой, заявляющий, что он программист, должен знать (особенно после вашей подсказки), что это зависит от того, что находится в строках 10 и 20, и любой, кто был на SO более недели, должен понимать, что этот вопрос, кажется, не добавляет много. 1001 *

Мы должны полагаться на то, что код делает именно то, что мы ему сообщаем. Если мы скажем это GOTO 10 в строке 30, но также скажем пропустить строку 30, мы не должны быть наименьшим сюрпризом, когда строка 30 пропущена. Мы сказали программе.

...