Установите машину WABAC , Шерман. Этот вопрос касается BASIC в целом и Microsoft BASIC-80 в частности. Старая школа базовая. С номерами строк.
Как (или, вернее, сделали) интерпретаторы старой школы BASIC обрабатывают циклы FOR ... NEXT, когда тело цикла не было выполнено, а оператор NEXT появился не в порядке?
СЛЕДУЮЩИЙ оператор СЛЕДУЮЩЕГО от предшествующего времени:
Вот подпрограмма из игры Awari из «101 основных компьютерных игр» Дэвида Х. Аля :
200 K=M:GOSUB 600
205 E=0:IF K>6 THEN K=K-7
210 C=C+1:IF C<9 THEN F(N)=F(N)*6+K
215 FOR I=0 TO 5:IF B(I)<>0 THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF B(I)<>0 THEN E=1:RETURN
235 GOTO 220
и вот он со всем, кроме отредактированного управления потоком:
200 GOSUB 600
215 FOR I=0 TO 5:IF ... THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF ... THEN RETURN
235 GOTO 220
Это возвращает не такие уж приятные воспоминания? Вы слышите, как Дейкстра перекатывается в могиле?
Вот интересная часть того, что происходит в этом фрагменте:
- Второй цикл FOR, поскольку он использует ту же переменную цикла, заменяет первый цикл FOR
- Два цикла FOR используют один и тот же оператор NEXT
- Оператор NEXT второго цикла FOR идет перед ним, в порядке исходного кода, но после него, в порядке выполнения.
Тогда вы можете предположить, что интерпретатор, запустив цикл FOR, просто запускает операторы, пока это не произойдет через цикл NEXT. Порядок утверждения в источнике в этом случае не имеет значения. Но давайте посмотрим, что говорит руководство basic80 о циклах FOR:
В руководстве basic-80 написано "му ..."
Тело цикла пропускается, если начальное значение цикла, умноженное на знак шага, превышает окончательное значение, умноженное на знак шага.
Таким образом, тело цикла может быть полностью пропущено.
У нас есть доказательства в виде опубликованных программ, что, по крайней мере, некоторые версии BASIC динамически находили свои СЛЕДУЮЩИЕ операторы. Это достаточно легко сделать, когда выполняется тело цикла. Однако в случае, когда тело оператора FOR должно быть пропущено, как позволяет BASIC-80, как BASIC обнаружил оператор NEXT, учитывая, что он может быть перед оператором FOR в исходном порядке?
- Версия BASIC, используемая в «101 Basic Computer Games», всегда выполняла тело цикла хотя бы один раз?
- Требуется ли для BASIC-80 оператор NEXT цикла FOR после оператора FOR в исходном порядке?
PS: Да, я пишу переводчик BASIC для старой школы BASIC. Это болезнь.
источник
NEXT
оператор, начинается с $ DCF9.Ответы:
Это возвращает старые времена ...
У меня есть копия книги, 3-е издание, 1975 год. Я проверил ваш список, и он не оригинален. В исходном исходном коде операторы не имеют пробелов, а присваивания имеют ключевое слово LET. Например
Диалект - ЦИФРОВОЙ БАЗОВЫЙ PDP-11 (не Basic-plus или BASIC-80). По опыту, не все эти игры работали на всех диалектах бейсика. У меня есть смутное воспоминание о необходимости перекодировать некоторые из этих игр, чтобы заставить их работать на других диалектах. Этот вид ужасной петлевой структуры определенно был проблемой.
У меня был опыт работы с более чем 20 различными диалектами бейсика, и я могу сказать вам, что это был спорный вопрос в то время. Было 2 основных лагеря.
В одном лагере были полные переводчики, которые анализировали каждую строку заново каждый раз, когда ее видели. Они обрабатывали цикл FOR, помещая его в стек, идентифицируемый его переменной, а затем сканируя стек на совпадение с каждым NEXT. Если они пропустили цикл, им пришлось бы сканировать источник на СЛЕДУЮЩИЙ. Некоторые сделали, некоторые нет.
Другим лагерем были токенизаторы или полукомпиляторы. Они будут сканировать все строки перед выполнением и конвертировать их в какой-то внутренний формат. Они также сопоставляли циклы FOR / NEXT и проверяли на отсутствие целей GOTO и GOSUB. Насколько я помню, DEC и BASIC-80 были в этом лагере, но это давно.
В ответ на ваши вопросы,
Надеюсь это поможет. Это ужасные языки, но если ты должен это сделать ...
источник
У меня нет копии спецификации для одного из этих древних интерпретаторов BASIC передо мной (она может даже не существовать), но я собираюсь выйти на конечность и сказать, что интерпретатор BASIC не выполнит ДАЛЕЕ в цикле FOR, который не принадлежит ему, даже если переменная цикла имеет то же имя.
Итак, другими словами, в вашем примере
когда строка 235 выполняется и переходит к строке 220, строка 220 СЛЕДУЕТ СЛЕДУЕТ верхней петле FOR, а не нижней.
Это видно по сообщению об ошибке «NEXT без FOR»; интерпретатор BASIC отклоняет любой NEXT, для которого он не нашел соответствующего FOR. Как правило, это происходит, когда вы выходите из строя вашего СЛЕДУЮЩЕГО, как в
Итак, чтобы ответить на ваши маркированные вопросы:
источник
Что делает Бейсик "101 Компьютер Игры"
Диалект BASIC, используемый в микрокомпьютерной версии «101 Computer Games», будет выполнять тело цикла FOR ... NEXT хотя бы один раз. Это отличается от BASIC-80 v. 5 .
Из с. i12 , перечисление исключений для "обычного" бейсика:
FOR ... TO ... STEP
Из-за этого у этого диалекта BASIC нет проблем с поиском оператора NEXT или совместного использования того же следующего оператора с несколькими операторами FOR. Статический анализ не требуется. Просто выполните каждый оператор, как он происходит, и вы в конечном итоге получите оператор NEXT, где бы он ни находился.
Возможно ли для BASIC-80 справиться с неисправным СЛЕДУЮЩИМ?
Оператор FOR может пропустить тело цикла, как позволяет BASIC-80 v.5, и в большинстве случаев по-прежнему допускает неупорядоченные операторы NEXT. Вот как:
Это будет обрабатывать простые патологические последовательности, такие как в вопросе. Он не будет обрабатывать случаи, когда СЛЕДУЮЩИЙ достигнут оператором IF ... GOTO или GOSUB. Код, который делает это, намного хуже, чем и без того плохой код в вопросе, поэтому просто объявить, что интерпретатор не будет поддерживать такие случаи, не является необоснованным. Для переводчика может быть даже допустимо поджечь такой код.
источник