Явные номера строк и порядок выполнения
GW-BASIC и многие другие старые диалекты BASIC, такие как C64 BASIC, позволили вам сделать что-то вроде этого:
20 PRINT "World"
10 PRINT "Hello"
и это приведет к следующему выводу, когда RUN
Команда / оператор был выполнен:
Hello
World
LIST
Команда / оператор будет перечислять программу:
10 PRINT "Hello"
20 PRINT "World"
Другими словами, эти базовые диалекты будут автоматически переупорядочивать выполнение, чтобы соответствовать порядку, указанному номерами строк, которые вы использовали, независимо от того, в каком порядке вы изначально набрали / сохранили их в другом редакторе (например, EDLIN.EXE). Однако QuickBASIC и BASCOM2 не смогли сделать то же самое.
Самой старой версией QuickBASIC, которую я мог найти в Интернете, была QuickBASIC 2.0, и она там не работала, просто игнорируя номера строк, чтобы напечатать вещи в порядке, в котором я их написал (т.е. "World Hello").
BASCOM2 - самый старый компилятор MS/IBM BASIC, который я смог найти - также, очевидно, не поддерживает эту функцию, вместо этого происходит сбой с ошибкой (SQ = Out of order sequence?):
0046 0006 10 PRINT "Hello"
^ SQ
50434 Bytes Available
50325 Bytes Free
0 Warning Error(s)
1 Severe Error(s)
Хотя я, конечно, понимаю, как часто номера строк являются излишними, мне показалось, что это полезная функция для поддержки выполнения в явном порядке номеров строк (20, 10, 30 => 10, 20, 30), а не в неявном порядке номеров строк (20, 10, 30 => 20, 10, 30).
Кто-нибудь знает, почему это традиционное бейсикское поведение было проигнорировано?
2 ответа
Я удивлен, что первый найденный вами баском сообщил об ошибке. Все компиляторы, которые я когда-либо использовал для BASIC, и я считаю, что я использовал их с 1982 года, сделали номера строк необязательными и поддерживали метки. Я помню, что в моей первой работе в качестве профессионального программиста мы разработали препроцессор компилятора, который вставлял бы только строки, необходимые для правильных операторов IF, ELSE IF и END IF, заменяя вещи номерами строк и (GASP) операторами GOTO.
Я до сих пор использую номера строк в моем все еще поддерживаемом приложении учета VB6 благодаря надстройке MZ-Tools, которая позволяет мне добавлять и удалять номера строк в моих методах и функциях одним нажатием кнопки. Это позволяет мне использовать Erl (номер строки ошибки) во всех моих подпрограммах ошибок, а также быстрое однокнопочное добавление ко всем моим методам и функциям, что позволяет мне точно указать точную строку, на которой возникает ошибка.
Я уверен, что разработчики компиляторов думали, что номера строк имеют реальное применение только для интерпретаторов, и, возможно, первая версия bascom решила, что вы разработаете и протестируете с интерпретатором, затем скомпилируете и распространите исполняемый файл, а затем, возможно, более поздние версии, которые рассчитывают разработчики использовали текстовые редакторы, особенно более поздние версии, которые поставлялись со своими собственными IDE, и кому там понадобятся номера строк? Что ж, мы делаем, если хотим точного сообщения об ошибках! Это одна вещь, которая мне нравится в Java и Eclipse. Есть номера строк, так что я могу точно знать, где находятся ошибки, но они не мешают так, как в BASIC (удаление номеров строк, добавление / удаление кода, замена номеров строк).
Справочник IBM по компилятору говорит в приложении A («Сообщения от компилятора»):
Ошибка последовательности SQ
Номера строк в вашей программе были не по порядку или содержали дублирующийся номер оператора.
Компилятору не нужны номера строк в каждой строке, если/N
дается вариант:
Если вы используете текстовый редактор, отличный от редактора программ BASIC, вы можете создать файл строк без номеров строк. Компилятор поддерживает последовательности строк без номеров строк, если при запуске компилятора указан параметр /N. Эта функция может упростить включение одного и того же файла во множество различных программ.
В случаеBASCOM
скорее всего, память и время выполнения были причиной того, что не считывался сразу весь файл в память и не сортировались строки по номерам строк. Компилятор анализирует файл строка за строкой во время их чтения и может быстро выйти из строя для многих ошибок, для которых требуется только знание одной строки плюс информация, собранная из ранее просмотренных строк. Это было важным моментом в те времена, когда все это запускалось с медленных дисководов.
Интерпретатор, с другой стороны, обрабатывал программы BASIC, читаемые из текстовых файлов, просто так, как если бы пользователь вводил их вручную построчно. Таким образом, номер строки использовался для определения относительного положения по отношению к другим строкам в программе.
Более поздние диалекты, такие как QBasic, рассматривали номера строк просто как метки. Следующее ведет себя как хорошо известная классика в QBasic, но печатает только одну строку в более ранних диалектах:
20 PRINT "Hello, World!"
10 GOTO 20
Если у каждой строки есть номер строки, разумно было бы ожидать, что они будут переупорядочены перед выполнением, хотя программиста может сбить с толку то, что порядок строк, которые они редактируют, не совпадает с порядком, в котором строки выполняются, когда нет утверждения, которые подразумевают скачки.
Теперь представьте, что не все строки пронумерованы, а программа больше, чем просто игрушечный пример из двух строк. Возьмите этот (неправильный) код, например:
GOSUB 100
FOR i = 1 TO 10: GOSUB 200: NEXT
END
200 PRINT "frobnicate"
RETURN
DATA 1,2,3
100 PRINT "Do some special preparation and"
PRINT "then fall through to frobnicate"
REM ...
DATA 4,5,6
Что бы означало изменение порядка? По крайней мере, это должно означать перемещение всех строк, следующих за номером строки, до следующего номера строки (или метки). Как насчетDATA
линии? Переместить их тоже или оставить в том же порядке? Читатель может очень быстро запутаться, пытаясь понять фактический ход программы в такой программе.
Даже с интерпретатором, где нумерация строк в текстовом исходном файле не по порядку для интерпретатора, я предполагаю, что читатели легко запутаются, и программист будет использовать функцию сортировки строк выбранного текстового редактора или внешнюю сортировку. программа. Также легче обнаружить случайную замену ранее введенных строк с тем же номером строки.
Таким образом, на самом деле нет убедительного варианта использования для интерпретаторов и компиляторов, которым не нужны номера строк, чтобы переупорядочивать строки с номерами строк (+ следующие без них), а работа со строками «вне последовательности» уже сбивает с толку интерпретаторы, которые требуют строки числа.