Почему старые Бейсики (и, возможно, другие языки) использовали номера строк как часть исходного кода?
Я имею в виду, какие проблемы это (попытаться) решить?
Почему старые Бейсики (и, возможно, другие языки) использовали номера строк как часть исходного кода?
Я имею в виду, какие проблемы это (попытаться) решить?
Ответы:
БЕЙСИК должен быть взят в контексте с его современными языками: ранний фортран, кобол и ассемблер.
Когда я работал над сборкой 6502 без меток, это означало, что когда вы обнаружили, что вам нужно добавить инструкцию где-то посередине плотно упакованного кода (я позже добавил NOP ), вам нужно было пройти и повторить все переходы. адреса. Это было много времени.
Фортран был системой с нумерацией строк, предшествовавшей ОСНОВНОЙ. В Фортране столбцы 1-5 были номером строки, которая должна использоваться для целей для ветвления. Ключевым моментом в Fortran было то, что компиляторы были немного более умными, чем интерпретатор BASIC, и добавление нескольких инструкций было просто вопросом перфорирования некоторых карт и помещения их в колоду в нужном месте.
Бейсик, с другой стороны, должен был соблюдать все инструкции. Не было особой концепции «продолжения предыдущей строки». Вместо этого в Applesoft BASIC (одном из широко используемых диалектов, с которым я знаком и могу найти информацию) каждая строка в памяти была представлена как:
NN NN TT TT AA BB CC DD .. .. 00
У него было два байта для адреса следующей строки ( NN NN
). Два байта для номера строки этой строки ( TT TT
), а затем список токенов ( AA BB CC DD .. ..
), за которым следует маркер конца строки ( 00
). (Это на стр. 84-88 книги «Внутри Apple» // e )
При рассмотрении этого представления в памяти важно понимать, что строки могут храниться в памяти не по порядку. Структура памяти представляла собой связанный список с указателем на следующую строку в структуре. Это позволило легко добавлять новые строки между двумя строками, но для правильной работы необходимо было нумеровать каждую строку.
Много раз, работая с BASIC, вы фактически работали с самим BASIC. В частности, данная строка была либо номером строки и ОСНОВНЫМИ инструкциями, либо командой основного интерпретатора для RUN
или LIST
. Это позволило легко отличить код от команд - весь код начинается с цифр.
Эти две части информации определяют, почему использовались числа - вы можете получить много информации в 16 битах. Ярлыки на основе строк занимают гораздо больше места и их сложнее заказать. С числами легко работать, понятно и их легче представить.
Более поздние основные диалекты, в которых вы не были в переводчике все время, могли покончить с каждой пронумерованной строкой, а вместо этого требовались только для нумерации строк, которые были целями ветвления. По сути, этикетки.
] PRINT "FOO"
был немедленно запущен интерпретатором BASIC. Это утверждение. Если вы хотите запустить его позже, вы бы сделали ] 10 PRINT "FOO"
и тогда ] RUN
. В среде AppleSoft BASIC каждый оператор BASIC мог быть запущен немедленно или с задержкой - в DOS было предоставлено очень мало команд, которые не были действительными операторами BASIC. Различие между утверждением сейчас и утверждением позже состояло в номере строки. Вы также можете изменить отложенный оператор, введя соответствующий номер строки. Вы также можете поместить несколько операторов в одну строку::
На ранних этапах редактирования микрокомпьютеров было основано на линии. Вы не можете просто свободно перемещаться по исходному коду и редактировать. У вас была единственная строка внизу экрана, где вы могли набирать команды и вводить код. Остальная часть экрана была только для чтения кодов и вывода команд. Если вы хотите отредактировать, скажем, строку 90 в программе, которую вы написали " EDIT 90
", и содержимое строки 90
поступит в однострочный буфер редактирования. Когда вы отредактировали строку, вы нажали Enter, и список программ был обновлен. Таким образом, вам нужно было номера строк, чтобы иметь возможность редактировать программу.
Когда редакторы кода стали более продвинутыми и позволили вам перемещать курсор в списке кода, вам больше не нужны были номера строк.
Если вы думаете о базовых диалектах 8-битных домашних микрокомпьютеров 80-х годов, то на этих компьютерах не было текстовых редакторов (если вы не купили какое-либо текстовое приложение). Не было никакого способа, чтобы весь исходный код программы BASIC был «открыт в редакторе», как это было бы при программировании сегодня. Программист даже не будет думать о программе как о файле исходного кода или тексте.
Итак, допустим, у вас есть простая программа без номеров строк в вашей голове:
FOR I=1 TO 42
PRINT I
NEXT I
Вы загружаете свой компьютер. У вас есть подсказка «готово» или что-то в этом роде, и курсор находится в следующей строке. Это очень похоже на сегодняшнюю среду REPL на разных языках сценариев, хотя на самом деле не так строго основано на строках, больше похоже на экран. Так что не совсем так, как сегодня, но близко.
Теперь, если вы начнете входить в программу, вы можете получить ошибку после первой строки, потому что интерпретатор BASIC пытается немедленно выполнить (и забыть) ее, и без NEXT не имеет смысла завершать цикл. Это не текстовый редактор, где вы редактируете текст, это то, где вы даете команды компьютеру!
Так что вам нужно как-то сказать, что это строчка программы, сохраните ее! У вас может быть специальная команда или просто символ, говорящий, что эй, это строка программы, сохраните ее. Давайте представим это:
#FOR I=1 TO 42
#PRINT I
#NEXT I
Хорошо, теперь наш воображаемый интерпретатор BASIC сохранил программу, и вы можете запустить ее. Но теперь вы хотите редактировать строку PRINT. Как ты делаешь это? Вы не находитесь в текстовом редакторе, вы не можете просто переместить курсор на строку и отредактировать ее. Или вы хотите добавить еще одну строку, как LET COUNT=COUNT+1
в цикле. Как вы указываете, где новая строка должна быть вставлена?
Номера строк решают эту проблему очень просто, хотя и довольно хитро. Если вы введете строку программы с уже существующим номером, старая строка будет заменена. Теперь экранная среда REPL становится полезной, потому что вы можете просто переместить курсор в список программ на экране, отредактировать строку на экране и нажать ENTER, чтобы сохранить ее. Похоже, что вы редактируете строку, когда на самом деле вы редактируете текст на экране, а затем заменяете всю строку новой строкой на экране. Кроме того, вставка новых строк становится легкой, если вы оставите неиспользуемые числа между Показывать:
10 FOR I=1 TO 42
20 PRINT I
30 NEXT I
После повторного ввода строки 20 с изменениями и добавления новых строк, это может быть
5 LET COUNT=0
10 FOR I=1 TO 42
20 PRINT "Index", I
25 LET COUNT=COUNT+1
30 NEXT I
Есть преимущество (или проклятие, поскольку оно позволяет использовать известный базовый код спагетти), заключающееся в возможности использовать номера строк в качестве языковой конструкции, по крайней мере, в качестве цели для команд GOTO
AND GOSUB
. Это может быть заменено метками, но использование номеров строк намного проще реализовать в интерпретаторе BASIC, что все еще было явным бонусом в типичном 8-битном домашнем компьютере 80-х годов.
Что еще более важно, с точки зрения пользовательского опыта, номера строк действительно являются удивительно простым, но в то же время полным интерфейсом для редактирования кода. Просто введите строку, начинающуюся с цифры, чтобы вставить новый код. Используйте, LIST 100-200
чтобы показать линии 100-200. Чтобы отредактировать строку, отобразите ее на экране, отредактируйте текст на экране и введите строку заново. Чтобы удалить строку, отредактируйте ее так, чтобы она была пустой, то есть просто укажите номер строки, после которой ничего не будет. Один абзац, чтобы описать это. Сравните, пытаясь описать использование старых текстовых редакторов, таких как edlin из DOS, или ed или ex из Unix: вам нужен один абзац (только небольшая гипербола) только для того, чтобы объяснить, как пользователь может выйти из них при случайном запуске!
Другие ответы объясняют, как появились номера строк. Я пытаюсь осветить здесь, почему номера строк выжили так же долго, как они продолжали решать реальную проблему: они предложили способ выполнения реального программирования без реального редактора, очень простым способом. Как только правильные, простые в использовании полноэкранные текстовые редакторы стали основным способом редактирования кода, и с исчезновением аппаратных ограничений, и с преодолением инерции людей, адаптирующих новые вещи, диалекты BASIC на основе номера строки довольно быстро исчезли из использования, потому что основная проблема с юзабилити, которую они решили, больше не была проблемой.
В то время и в то время, когда разрабатывался Basic, лучшим из доступных устройств ввода-вывода был телетайп. Редактирование программы выполнялось распечаткой (на бумаге) списка всей программы или интересной ее части, а затем вводом строк замены с номерами строк.
По этой же причине нумерация строк по умолчанию была равна 10, поэтому между существующими строками будут неиспользуемые номера.
ren
команду ' ', чтобы изменить нумерацию. Типичным вызовом был ren 10, 10
(перенумерация, начинающаяся с десяти, с увеличением на десять - поведение по умолчанию, если один только что набрал ren
. Команды goto
и gosub
и then (linenumber)
будут автоматически обновлены. Но это было определенно недоступно в ранних версиях BASIC. Но IIRC был доступен в Apple Integer Basic, Applesoft FP basic, TI Basic / Extended Basic, MS Basic / GW Basic и т. Д.
«Номера строк» означают несколько разных вещей.
Прежде всего, имейте в виду, что понятие «линии» существует не всегда. Многие языки программирования в эту эпоху использовали перфокарты , а наличие порядковых номеров (обычно в последних нескольких столбцах карты) помогло вам восстановить колоду в правильном порядке, если вы ее уронили, или в устройстве чтения карт произошло что-то ужасное. Были машины, которые делали это автоматически.
Номера строк для использования в качестве целей GOTO
операторов - это совершенно другое понятие. В Фортране IV они были необязательными и предшествовали утверждению (в столбцах 1-5). В дополнение к тому, что его проще реализовать, чем метки свободной формы, была также концепция вычисленного и назначенного GOTO , которая позволяла вам переходить к произвольному номеру строки. Это было то, чего нет в большинстве современных языков программирования (хотя switch
операторы приближаются), но это был знакомый прием для программистов на ассемблере.
BASIC был получен из FORTRAN и предназначен для того, чтобы его было проще реализовать и понять, поэтому принуждение каждой «строки» иметь номер строки (как для последовательности, так и для цели GOTO
/ GOSUB
операторов) было, вероятно, проектным решением, принятым по этой причине.
goto array_of_labels[some_computation()];
GOTO
(или ASSIGN
) и оригинальной арифметики, известной как трехсторонний IF
, и (редко используемых) альтернативных возвратов CALL
и сортировок целей (возможно, разделителей) DO
и FORMAT
операторов. На других заявлениях они были необязательны.
GOTO 1000+N*100
чтобы эмулировать switch
оператор.
Я начал программировать на языке COBOL, который использовал номера строк в столбцах 1-6 каждой строки. Поскольку в 1970-х годах не было IDE, все было сделано с помощью перфокарт, и номер строки использовался для определения того, какие строки в исходном источнике должны быть заменены, а какие добавлены новые. Мы привыкли увеличивать номера строк на 100, чтобы дать нам возможность добавить больше строк.
Бейсик появился позже, чем Фортран, в эпоху линейных терминалов. В нем была среда read-exe-print-loop, которая была более интерактивной, чем колода карт.
Я научился программировать на бейсике на однострочном дисплее с 24 символами. Номера строк были естественным способом указать, куда вы хотите перейти, редактируя одну или вставляя между другими.
Я действительно не могу представить, как еще ты это сделаешь.
Еще один момент, о котором никто не упомянул, заключается в том, что начинающим легче рассуждать о ходе программы, когда цели ветвления являются явными. Таким образом, вместо того, чтобы соответствовать (возможно, вложенным) операторам BEGIN / END (или любым другим использованным разделителям блоков), было совершенно очевидно, куда шел поток управления. Вероятно, это было полезно, учитывая целевую аудиторию BASIC (в конце концов, это универсальный кодовый символ для начинающих ).
Dartmouth Time Sharing System использует интерфейс телетайпа. Таким образом, он использовал командный интерфейс. Первоначально номера строк использовались только для редактирования программы. Вы можете вставить, заменить или удалить, используя номер строки. Похоже, что ранняя версия не использовала номера строк для операторов goto, но это было позднее дополнение к языку.