Почему BASIC использовал номера строк?

95

Почему старые Бейсики (и, возможно, другие языки) использовали номера строк как часть исходного кода?

Я имею в виду, какие проблемы это (попытаться) решить?

DerMike
источник
27
Если вы уже проделали серьезную исследовательскую работу, не скрывайте информацию в комментариях, соответственно отредактируйте свой вопрос. Более того, Google взял меня прямо здесь: stackoverflow.com/questions/541421/… а здесь stackoverflow.com/questions/2435488/…
Док Браун,
13
Я голосую, чтобы закрыть этот вопрос как не по теме, потому что ответ уже на stackoverflow .
Андрес Ф.
6
Applesoft BASIC был первым языком программирования, который я выучил. Я помню, что слышал, что у Паскаля нет номеров строк и что-то вроде «Но как мне сделать GOTO без номеров строк? Как это должно работать?»
Йенс Шаудер
14
Забавно, но в прошлый раз, когда я проверял, мы судили, был ли вопрос на тему, основанную на его содержании, а не на содержании других сайтов (и, вероятно, ответах, которые там лежат).
MatthewRock

Ответы:

130

БЕЙСИК должен быть взят в контексте с его современными языками: ранний фортран, кобол и ассемблер.

Когда я работал над сборкой 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 битах. Ярлыки на основе строк занимают гораздо больше места и их сложнее заказать. С числами легко работать, понятно и их легче представить.

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


источник
3
Хорошая подливка, я забыл про Mini Assembler. Это возвращает воспоминания .
Blrfl
3
@Blrfl Если память служит ... ] CALL -936 * F666 G $ ... Да, базовая FP для начала.
3
Нет, это был редактор строк. Команды были определены по отсутствию номеров строк. Утверждениям предшествовали номера строк, чтобы указать, что они являются утверждениями, и указать, куда они пошли и / или какую строку они переписали. Это был встроенный редактор строк BASIC, это не был отдельный инструмент или среда.
RBarryYoung
3
@RBarryYoung ] PRINT "FOO"был немедленно запущен интерпретатором BASIC. Это утверждение. Если вы хотите запустить его позже, вы бы сделали ] 10 PRINT "FOO"и тогда ] RUN. В среде AppleSoft BASIC каждый оператор BASIC мог быть запущен немедленно или с задержкой - в DOS было предоставлено очень мало команд, которые не были действительными операторами BASIC. Различие между утверждением сейчас и утверждением позже состояло в номере строки. Вы также можете изменить отложенный оператор, введя соответствующий номер строки. Вы также можете поместить несколько операторов в одну строку::
4
Как отмечалось в статье в Википедии ( en.wikipedia.org/wiki/Dartmouth_BASIC ) « DTSS (Dartmouth Time Sharing System) реализовал ранний ... интерактивный интерфейс командной строки. ... Любая строка, начинающаяся с номера строки, была добавлена ​​в программа, заменяющая любую ранее сохраненную строку тем же номером; все остальное считалось командой DTSS и немедленно выполнялось ... Этот метод редактирования был необходим из-за использования телепринтеров в качестве оконечных устройств для системы разделения времени Дартмута. "
RBarryYoung
50

На ранних этапах редактирования микрокомпьютеров было основано на линии. Вы не можете просто свободно перемещаться по исходному коду и редактировать. У вас была единственная строка внизу экрана, где вы могли набирать команды и вводить код. Остальная часть экрана была только для чтения кодов и вывода команд. Если вы хотите отредактировать, скажем, строку 90 в программе, которую вы написали " EDIT 90", и содержимое строки 90поступит в однострочный буфер редактирования. Когда вы отредактировали строку, вы нажали Enter, и список программ был обновлен. Таким образом, вам нужно было номера строк, чтобы иметь возможность редактировать программу.

Когда редакторы кода стали более продвинутыми и позволили вам перемещать курсор в списке кода, вам больше не нужны были номера строк.

JacquesB
источник
38
Редактирование строки? Роскошь! Первые бейсики, которые я использовал, заставили вас перепечатать всю строку. Который действительно отстой, когда вам пришлось перенумеровать подпрограмму.
TMN
48
Экран? Какой экран? В моем первом Basic "экран" был рулон бумаги.
ddyer
18
@ddyer: я мечтал иметь рулон бумаги! Все, что у нас было, это куча электродов. Вечером, когда работа должна была быть выполнена, мы должны были выстроиться в ряд и понаблюдать за тем, кто получил электрический ток, чтобы увидеть, работает ли программа правильно. ... - Серьезно, я поражен тем, что людям в те дни действительно удавалось писать рабочие программы.
оставил около
26
Электричество! Кровавая роскошь. Мы привыкли высекать наши команды в граните
Майкл Даррант,
10
@ TMN & ddyer Хорошо, вы оба знаете, куда это идет, верно ...? ;-D ==> dilbert.com/strip/1992-09-08 ==> imgs.xkcd.com/comics/real_programmers.png
Baard Kopperud
45

Если вы думаете о базовых диалектах 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

Больше проблем, которые мы только что решили

Есть преимущество (или проклятие, поскольку оно позволяет использовать известный базовый код спагетти), заключающееся в возможности использовать номера строк в качестве языковой конструкции, по крайней мере, в качестве цели для команд GOTOAND GOSUB. Это может быть заменено метками, но использование номеров строк намного проще реализовать в интерпретаторе BASIC, что все еще было явным бонусом в типичном 8-битном домашнем компьютере 80-х годов.

Что еще более важно, с точки зрения пользовательского опыта, номера строк действительно являются удивительно простым, но в то же время полным интерфейсом для редактирования кода. Просто введите строку, начинающуюся с цифры, чтобы вставить новый код. Используйте, LIST 100-200чтобы показать линии 100-200. Чтобы отредактировать строку, отобразите ее на экране, отредактируйте текст на экране и введите строку заново. Чтобы удалить строку, отредактируйте ее так, чтобы она была пустой, то есть просто укажите номер строки, после которой ничего не будет. Один абзац, чтобы описать это. Сравните, пытаясь описать использование старых текстовых редакторов, таких как edlin из DOS, или ed или ex из Unix: вам нужен один абзац (только небольшая гипербола) только для того, чтобы объяснить, как пользователь может выйти из них при случайном запуске!

Заключение

Другие ответы объясняют, как появились номера строк. Я пытаюсь осветить здесь, почему номера строк выжили так же долго, как они продолжали решать реальную проблему: они предложили способ выполнения реального программирования без реального редактора, очень простым способом. Как только правильные, простые в использовании полноэкранные текстовые редакторы стали основным способом редактирования кода, и с исчезновением аппаратных ограничений, и с преодолением инерции людей, адаптирующих новые вещи, диалекты BASIC на основе номера строки довольно быстро исчезли из использования, потому что основная проблема с юзабилити, которую они решили, больше не была проблемой.

Хайд
источник
4
Ты сделал это. Наличие многострочного экрана, а не просто печать tty или одной строки, делает это проще, но без концепции исходного файла он все еще ориентирован на строки.
JDługosz
Однако тот факт, что система представляет собой 8-битную архитектуру, на самом деле не является ограничивающим фактором. Теперь тот факт, что указанная система может иметь только несколько килобайт оперативной памяти и несколько килобайт ПЗУ, и, возможно, даже не иметь постоянного хранилища (если сломался ваш кассетный магнитофон) ...
CVn
все еще трудно представить кодирование без текстового редактора
phuclv
@ LưuVĩnhPhúc Ну, есть много эмуляторов для запуска «настоящих», таких как почти любой 8-битный домашний компьютер, или MSDOS и его GWBASIC с dosbox. Например, вы можете получить один из множества эмуляторов C64, а затем Google найти руководство пользователя в формате PDF :-)
hyde
1
@phuclv - Трудно представить кодирование без текстового редактора. В то время трудно было представить неудобство использования текстового редактора, его сохранения и компиляции до того, как он мог быть запущен ... и это действительно то, что появилось рядом с миром ПК; Pascal и C. Оба скомпилированных языка, оба свободно редактируемые с помощью текстового редактора, оба определенно не являются средой программирования сами по себе (BASIC был и средой программирования, и средой выполнения). Паскаль был моим следующим языком, и во многих отношениях довольно освобождающим. Определенно более мощный. Но в остальном, немного менее захватывающим.
DavidO
17

В то время и в то время, когда разрабатывался Basic, лучшим из доступных устройств ввода-вывода был телетайп. Редактирование программы выполнялось распечаткой (на бумаге) списка всей программы или интересной ее части, а затем вводом строк замены с номерами строк.

По этой же причине нумерация строк по умолчанию была равна 10, поэтому между существующими строками будут неиспользуемые номера.

ddyer
источник
1
На самом деле, кард-ридеры (сопровождаемые клавишами) и линейный принтер были лучшими устройствами ввода-вывода, чем телепринтеры, но телепринтеры были намного дешевле.
суперкат
Нумерация строк на 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 и т. Д.
DavidO
13

«Номера строк» ​​означают несколько разных вещей.

Прежде всего, имейте в виду, что понятие «линии» существует не всегда. Многие языки программирования в эту эпоху использовали перфокарты , а наличие порядковых номеров (обычно в последних нескольких столбцах карты) помогло вам восстановить колоду в правильном порядке, если вы ее уронили, или в устройстве чтения карт произошло что-то ужасное. Были машины, которые делали это автоматически.

Номера строк для использования в качестве целей GOTOоператоров - это совершенно другое понятие. В Фортране IV они были необязательными и предшествовали утверждению (в столбцах 1-5). В дополнение к тому, что его проще реализовать, чем метки свободной формы, была также концепция вычисленного и назначенного GOTO , которая позволяла вам переходить к произвольному номеру строки. Это было то, чего нет в большинстве современных языков программирования (хотя switchоператоры приближаются), но это был знакомый прием для программистов на ассемблере.

BASIC был получен из FORTRAN и предназначен для того, чтобы его было проще реализовать и понять, поэтому принуждение каждой «строки» иметь номер строки (как для последовательности, так и для цели GOTO/ GOSUBоператоров) было, вероятно, проектным решением, принятым по этой причине.

Майк Харрис
источник
2
Ах, вычислил и назначил gotos. Память массивов переменных меток в PL / 1, циклически проходящих по одному массиву для поиска совпадения, а затем использующих этот индекс массива в качестве индекса в массиве переменных метки для перехода к. Или Кобол переделал gotos. И ни с использованием номеров строк! У BBC basic было заявление о перенумерации, которое было очень полезно.
Kickstart
GCC позволяет вычислять GOTO как расширение (хотя, конечно, не с номером строки) - вы можете делать что-то вродеgoto array_of_labels[some_computation()];
user253751
Незначительный: FORTRAN требовал меток для целей GOTO(или ASSIGN) и оригинальной арифметики, известной как трехсторонний IF, и (редко используемых) альтернативных возвратов CALLи сортировок целей (возможно, разделителей) DOи FORMATоператоров. На других заявлениях они были необязательны.
dave_thompson_085
Некоторые бейсики (например, Atari) даже допускают использование произвольных числовых выражений в операторах GOTO. Таким образом, при правильном соглашении о нумерации строк вы можете написать, GOTO 1000+N*100чтобы эмулировать switchоператор.
Ден04
6

Я начал программировать на языке COBOL, который использовал номера строк в столбцах 1-6 каждой строки. Поскольку в 1970-х годах не было IDE, все было сделано с помощью перфокарт, и номер строки использовался для определения того, какие строки в исходном источнике должны быть заменены, а какие добавлены новые. Мы привыкли увеличивать номера строк на 100, чтобы дать нам возможность добавить больше строк.

Кит Миллер
источник
14
КОБОЛ не использовал эти номера строк. Они были просто удобны, так что, когда какой-то бедный щуб уронил свою колоду и карты разошлись повсюду, он мог просто собрать их и пропустить через сортировщик карт, чтобы вернуть их в правильный порядок. Вы НЕ были обязаны вставлять номера строк в карты. (Студенты не сделали. Производственные цеха сделали.)
Джон Р. Штром
5

Бейсик появился позже, чем Фортран, в эпоху линейных терминалов. В нем была среда read-exe-print-loop, которая была более интерактивной, чем колода карт.

Я научился программировать на бейсике на однострочном дисплее с 24 символами. Номера строк были естественным способом указать, куда вы хотите перейти, редактируя одну или вставляя между другими.

Я действительно не могу представить, как еще ты это сделаешь.

JDługosz
источник
2
кажется, это не дает ничего существенного по сравнению с замечаниями, сделанными и объясненными в предыдущих 4 ответах
комнат
2
Это делает это плохо? Я думаю, что Жак на самом деле не охватывал суть однострочного редактирования в отношении вставки строк и мысленного отслеживания кода.
JDługosz
1
@jameslarge Я пропускаю этот пункт в абзаце, начинающемся с "Много раз при работе с Бейсиком ..."? Я также не решаюсь назвать ОСНОВНУЮ операционную систему. Это был DOS. И DOS не нуждался в BASIC, это именно то, над чем вы работали большую часть времени.
2
@ Хотя это правда, он был разработан для системы, которая использовала телетайпы для io (система разделения времени Дартмута).
Жюль
3
@MichaelT, ой! Я отвлечу половину своего комментария, но я буду поддерживать часть о том, что BASIC - это ОС на некоторых компьютерах. Я думаю; Apple] [, TI 99/4, IBM 5100, HP 9830a, Compucolor 8001, TRS-80 Model 1, Comodore Vic20, Sinclair ZX80 и другие. Все загрузилось в бейсик из ROM. У некоторых была опциональная операционная система, которая могла быть загружена из аудиокассеты или с дискеты, если вы заплатили дополнительный $$ за дисковод.
Соломон Медленный
1

Еще один момент, о котором никто не упомянул, заключается в том, что начинающим легче рассуждать о ходе программы, когда цели ветвления являются явными. Таким образом, вместо того, чтобы соответствовать (возможно, вложенным) операторам BEGIN / END (или любым другим использованным разделителям блоков), было совершенно очевидно, куда шел поток управления. Вероятно, это было полезно, учитывая целевую аудиторию BASIC (в конце концов, это универсальный кодовый символ для начинающих ).

TMN
источник
1

Dartmouth Time Sharing System использует интерфейс телетайпа. Таким образом, он использовал командный интерфейс. Первоначально номера строк использовались только для редактирования программы. Вы можете вставить, заменить или удалить, используя номер строки. Похоже, что ранняя версия не использовала номера строк для операторов goto, но это было позднее дополнение к языку.

C. фугат
источник