Почему в Бейсике были пронумерованные строки?

Возможный дубликат:
Почему мы вообще заморачивались с номерами строк?

Мне любопытно, почему ранние версии языка программирования BASIC имели нумерацию строк, как в:

42 PRINT "Hello world!"

В текстовых редакторах тогда не было нумерации строк?

РЕДАКТИРОВАТЬ: Да, я знаю, что они используются для GOTO, но почему? Я имею в виду, что наличие меток было слишком затратным с вычислительной точки зрения?


person Giovanni Funchal    schedule 12.03.2010    source источник
comment
Когда я загрузил страницу, ответов не было. Когда я закончил печатать свой, их было шесть, включая мой. Переполнение ответа.   -  person Mike Daniels    schedule 12.03.2010
comment
Я думаю, что вы, возможно, нажали кнопку ностальгии здесь... Много теплых воспоминаний о прошедших днях...   -  person NealB    schedule 12.03.2010
comment
Дубликат: stackoverflow.com/questions/541421/   -  person gnovice    schedule 12.03.2010
comment
При желании вы можете включить нумерацию строк в Visual Studio. Это хороший способ сослаться на код при проверке кода (например, вы можете сказать «Пожалуйста, рефакторинг файла xys.cs с номерами строк 150–160», разбив код на несколько методов).   -  person Keith Adler    schedule 12.03.2010
comment
@NealB: О да. Когда писал ответ, чуть не побежали мурашки по коже :)   -  person Philippe Leybaert    schedule 12.03.2010
comment
@Nissan: это не номера строк в том же смысле. Они не являются частью программы, просто частью отображения редактора, как и левое поле.   -  person John Saunders    schedule 12.03.2010
comment
Зачем спрашивать нас? Спросите доктора Курца — одного из изобретателей Бейсика. en.wikipedia.org/wiki/Thomas_Eugene_Kurtz   -  person S.Lott    schedule 12.03.2010
comment
@John, я согласен, но они дают точку отсчета почти так же, как когда-то номера строк.   -  person Keith Adler    schedule 13.03.2010


Ответы (15)


Многие микрокомпьютеры имели интерпретатор BASIC в ПЗУ, который запускался при загрузке. Проблема заключалась в том, что не было текстового редактора или файловой системы. У вас была интерактивная подсказка, чтобы сделать все до конца. Если вы хотели вставить строку кода, вы просто вводили ее, начиная с номера строки. Он вставит его в правильное место в вашем коде. например:

>10 print "hello"
>30 goto 10
>20 print "world"
>list
10 PRINT "hello"
20 PRINT "world"
30 GOTO 10
>

(В этом примере > — это приглашение BASIC)

Если вы хотите стереть строку, вы должны ввести что-то вроде ERASE 20. Некоторые действительно причудливые системы дали вам редактор строк (например, EDIT 10). И если вы не планировали свои номера строк и закончились (как мне вставить строку между 10 и 11?), некоторые системы давали вам команду RENUM, которая перенумеровывала ваши строки. код (и соответствующим образом отрегулируйте GOTOs и GOSUBs).

Веселые времена!

person Ferruccio    schedule 12.03.2010
comment
Мало того, в то время не было интернета. Вы хотели получить доступ к компьютеру, который вы дошли туда, где он был. В гору. Оба пути. А когда Ферруччо говорит, что файловой системы нет, это нет, как и отсутствие постоянного хранилища в самых ранних микрокомпьютерных системах. Выключи, все пропало. В конце концов мы получили возможность сохранять программы на кассетах. Иногда можно было даже перезагрузить программу с ленты, если удалось пройти уровень правильно. - person Hugh Brackett; 13.03.2010
comment
К сожалению, этот ответ, хотя и самый популярный, так же неверен, как и остальные 14 ответов. Причина номеров строк в BASIC заключалась в том, что в Дартмутском колледже, где он был создан, он был разработан для работы с терминалами телетайпа в компьютерной системе с разделением времени. Единственным способом упорядочивания строк кода и доступа к ним для их изменения были номера строк. Люди, которые никогда не использовали компьютерный терминал телетайпа, такой как Teletype Model 33 KSR или Teletype Model 35 ASR, просто не имеют опыта, чтобы дать правильный ответ. - person Andrew P.; 27.03.2019
comment
@ЭндрюП. - Я понимаю вашу точку зрения о необходимости номеров строк для отслеживания кода на TTY, но это не требует, чтобы номера строк были неотъемлемой частью языка. Я немного программировал на FORTRAN и Pascal для TTY. Текстовые редакторы того времени печатали исходный код с добавленными к нему номерами строк, чтобы вы могли ссылаться на них при внесении изменений, но на самом деле они не были частью исходного кода. Я подозреваю, что ранние микрокомпьютеры просто придерживались модели ввода TTY из-за ограниченности ресурсов этих машин. - person Ferruccio; 27.03.2019

Первоначальная нумерация строк BASIC фактически была неотъемлемой частью языка и использовалась для управления потоком.

Команды GOTO и GOSUB берут линию и используют ее для управления потоком. Тогда это было обычным явлением (хотя сейчас это не рекомендуется).

person Reed Copsey    schedule 12.03.2010
comment
Хотя ваш ответ не является неправильным, более полный ответ указывал бы на то, что отсутствие интерактивных текстовых редакторов сделало нумерацию строк необходимым злом; чтобы можно было вставить дополнительные строки кода между ранее введенными строками. - person ; 12.03.2010
comment
@roygbiv: это действительно была самая важная причина существования номеров строк в BASIC. - person Philippe Leybaert; 12.03.2010
comment
@Philippe: важная причина, а не самая важная. Программы были не интересны без GOTO или GOSUB. - person John Saunders; 12.03.2010
comment
Не забывайте, что номера строк были полезны для отладки, потому что компилятор/среда выполнения сообщали о рассматриваемом номере строки при возникновении синтаксической ошибки/исключения. - person Keith Adler; 12.03.2010
comment
Причин для нумерации строк было много, в основном исторические. Интерактивное редактирование было полезной причиной, но не единственной.... - person Reed Copsey; 12.03.2010
comment
@roygbiv: Это конкретная деталь реализации интерпретатора - были разновидности BASIC, которые фактически читали из файлов, а не были интерактивными, даже в очень ранних версиях, и им по-прежнему требовались номера строк. - person Reed Copsey; 12.03.2010
comment
Пока в этой теме есть две причины: GOTO/GOSUB и редактирование... what are some other reasons? - person ; 12.03.2010
comment
@Джон: ты прав. Неправильная формулировка. Было две основные причины: порядок строк и маркировка для GOTO и GOSUB. - person Philippe Leybaert; 12.03.2010

Они использовались в качестве меток для GOTO и GOSUB.

Как это:

10 PRINT "HELLO WORLD"
20 GOTO 10

В некоторых ранних версиях BASIC не было именованных меток.

Они также требовались, если вы хотели вставить строку между двумя существующими строками кода, потому что в первые дни у вас не было полнотекстовых редакторов. Все приходилось набирать в "интерактивном" интерпретаторе.

Итак, если вы набрали:

15 PRINT "AND THE UNIVERSE"

Программа станет:

10 PRINT "HELLO WORLD"
15 PRINT "AND THE UNIVERSE"
20 GOTO 10

Когда у вас закончились номера строк, вы могли запустить инструмент «перенумерации», чтобы перенумеровать все строки в вашей программе, но в самые первые дни Commodore 64 и других домашних компьютеров у нас не было даже этого, так что вы d придется перенумеровать вручную. Вот почему вам приходилось оставлять пробелы в 10 или более строк в номерах строк, чтобы вы могли легко добавлять строки между ними.

Если вы хотите попробовать интерпретатор Commodore 64, попробуйте этот эмулятор C64, написанный на Flash: http://codeazur.com.br/stuff/fc64_final/ (установка не требуется)

person Philippe Leybaert    schedule 12.03.2010
comment
(Так что, если вы напечатали) Можете ли вы назвать текстовый редактор, на который вы ссылаетесь, пожалуйста? - person Giovanni Funchal; 12.03.2010
comment
Не было текстового редактора. Просто командная строка, где вы вводите свой код - person Philippe Leybaert; 12.03.2010
comment
Да, но есть ли какое-нибудь имя для этой командной строки? Я не могу найти никаких упоминаний об этом в Интернете, ни скриншотов, ничего. - person Giovanni Funchal; 12.03.2010
comment
@Helltone: BASIC был интерпретируемым языком. Вы ввели интерпретатор. - person John Saunders; 12.03.2010
comment
@JohnFx: О каком эдлине ты говоришь? Что это была за платформа? - person John Saunders; 12.03.2010
comment
@Helltone: попробуйте один из многих эмуляторов Commodore 64. Несколько минут пожить прошлым весело :-) Есть даже FLASH-версия эмулятора: codeazur.com.br/stuff/fc64_final - person Philippe Leybaert; 12.03.2010
comment
@John edlin был линейным редактором, который поставлялся с первой версией MS-DOS - он не имел ничего общего с BASIC. - person ; 12.03.2010
comment
@Нил: я так запутался. Так почему же мы говорим об edlin в сочетании с BASIC, который старше MS-DOS более чем на десять лет? - person John Saunders; 12.03.2010
comment
@John edlin был специфическим продуктом (Microsoft) - построчный редактор - это общая идея того, как редактировать текст. - person ; 12.03.2010
comment
edlin был построчным редактором для редактирования файлов, но вам нужно было выбрать, какую строку редактировать, а затем отредактировать ее. Ранние интерпретаторы BASIC (ПУТЬ до появления edlin) использовали буфер экрана в качестве буфера псевдоистории. Вы можете отредактировать одну строку, переместив курсор на строку, которую хотите отредактировать, внести некоторые изменения и нажать клавишу ввода. Когда ты был хорош в этом, это было довольно мощно :) Это были дни... - person Philippe Leybaert; 12.03.2010
comment
@John, и на самом деле edlin все еще доступен в Windows, по крайней мере, с Win2K, которую я использую в данный момент. Откройте командную строку и введите edlin foo.txt, чтобы ощутить фантастический пользовательский интерфейс. - person ; 12.03.2010
comment
@Neil: я использовал edlin для написания программ на C для IBM PC XT. - person John Saunders; 12.03.2010

В BASIC номера строк обозначали последовательность.

Кроме того, многие старые редакторы предназначались не для файлов, а просто для строк («построчные редакторы», например ed, стандартный редактор). Пронумеровав их таким образом, вы знали, над какой строкой работаете.

person Justin R.    schedule 12.03.2010

Простой поиск в Google показывает, что об этом говорит Википедия:

Номера строк были обязательным элементом синтаксиса в некоторых старых языках программирования, таких как GW-BASIC.[2] Основная причина этого заключается в том, что в большинстве операционных систем в то время отсутствовали интерактивные текстовые редакторы; поскольку интерфейс программиста обычно ограничивался редактором строк, номера строк обеспечивали механизм, с помощью которого можно было ссылаться на определенные строки в исходном коде для редактирования и с помощью которого программист мог вставлять новую строку в определенную точку. Номера строк также предоставляли удобный способ различать код, который нужно ввести в программу, и команды, которые должны выполняться немедленно при вводе пользователем (которые не имеют номеров строк).

person Community    schedule 12.03.2010

Когда-то все языки имели порядковые номера, все было на перфокартах. На карточке была одна строка. Колоды карт составили вашу программу.

Когда вы бросали карты, вы помещали их в сортировщик карт, который использовал эти порядковые номера.

И, конечно же, на них ссылались конструкции потока управления.

person Community    schedule 12.03.2010
comment
Вероятно, вам следует предоставить ссылку, чтобы сказать, что такое перфокарты, потому что, судя по большинству других ответов, большинство людей здесь не знакомы с ними. - person Gabe; 13.03.2010

На C64 не было даже настоящего редактора (по крайней мере, встроенного). Чтобы отредактировать часть программы, вы должны сделать что-то вроде LIST 100-200, и тогда вы сможете редактировать только те строки, которые в данный момент отображаются на экране (без прокрутки вверх!)

person Chris Lercher    schedule 12.03.2010
comment
У вас есть ссылка на этот «редактор»? - person Giovanni Funchal; 12.03.2010
comment
Да - редактор был в основном экранной памятью, довольно распространенной в то время на 8-битных машинах. - person Martin Beckett; 12.03.2010
comment
Ну, это была часть интерпретатора, который запускался сразу после включения C64. Он был частью немодифицируемого ПЗУ (и он оставил вам только около 40 КБ из 64 КБ общего объема ОЗУ, потому что его нужно было сначала скопировать в ОЗУ). Он также использовался в качестве базовой оболочки (для загрузки программ и т. д.). Возможно, вы хотите попробовать эмулятор C64 (en.wikipedia.org/wiki/) - это весело :-) - person Chris Lercher; 12.03.2010

Это были метки для операторов, так что вы могли GOTO номер строки. Количество операторов не обязательно должно совпадать с физическими номерами строк в файле.

person Mike Daniels    schedule 12.03.2010
comment
На самом деле было обычным и почти необходимым оставлять промежутки в 5-10, чтобы можно было вносить дополнения без необходимости перенумерации всей программы. - person Buggabill; 12.03.2010

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


В вашем обновлении не у всех языков были метки, но у всех языков были номера строк одновременно. Когда-то все было перфокартой. Бейсик был одним из самых первых интерактивных языков, где можно было напечатать что-то и сразу же получить ответ. Нумерация строк по-прежнему была современной технологией.

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

Также имейте в виду, что оригинальные интерпретаторы BASIC не нуждались в таблице символов для переменных: было 26 переменных с именами A-Z. Некоторые были сложными и имели An-Zn. Некоторые стали очень изобретательными и добавили различие между строкой, целым числом и плавающей запятой, добавив «$» или «%» после переменной. Но никакой таблицы символов не требовалось.

person John Saunders    schedule 12.03.2010
comment
Проблема не была радикальной — ассемблеры имели метки задолго до того, как их начал использовать Алгол-60. Это многопроходное разрешение этикеток. Ранние ассемблеры (и компиляторы) должны были читать весь исходный код программы несколько раз, чтобы разрешить имена меток. Это было просто медленно. - person S.Lott; 12.03.2010
comment
@S.Lott: я, кажется, потерял свой комментарий ALGOL-60. - person John Saunders; 12.03.2010
comment
Причина минуса, пожалуйста. - person John Saunders; 13.03.2010

IIRC, номера строк в основном использовались в качестве меток для операторов GOTO и GOSUB, поскольку в некоторых (большинстве?) вариантах BASIC не было возможности пометить раздел кода.

person Frank Schmitt    schedule 12.03.2010

Их использовал и редактор - т.е. вы сказали:

edit 100

для редактирования строки 100.

person Community    schedule 12.03.2010
comment
@Neil: У тебя был редактор? Нам не нужен был никакой редактор! Мы просто набрали строку еще раз. - person John Saunders; 12.03.2010
comment
@John Все версии BASIC, которые я когда-либо использовал, начиная с оригинального Dartmouth BASIC, имели встроенный построчный редактор. Конечно, от Microsoft (много версий) и от DEC-System 10 (настолько ретро, ​​насколько это вообще возможно). - person ; 12.03.2010
comment
@Neil: это был линейный редактор или интерпретатор? Это была отдельная программа? Как вы это начали? - person John Saunders; 12.03.2010
comment
@John Вы набрали BASIC, а затем оказались в среде BASIC, в которой был построчный редактор. Или в микропроцессорных системах, таких как (скажем) Tandy CoCo или BBC Nicro, вы сразу загружаетесь в среду BASIC, также со встроенным редактором строк. Какую версию BASIC вы использовали, если ее не было? - person ; 12.03.2010
comment
@John Я думаю, что мы можем спорить о значении строкового редактора - я согласен с тем, что некоторые очень простые BASIC не могли вспомнить строку, которую вы пытались отредактировать. - person ; 12.03.2010
comment
@Neil: я полагаю, это могло называться редактором, но это не была отдельная программа. - person John Saunders; 12.03.2010
comment
@Джон, я не говорил, что это так. Редактор в современной IDE не является отдельной программой, но все равно называется редактором. - person ; 12.03.2010
comment
@Neil: это вопрос времени. Помните, что такое отчет об редактировании? Когда-то, возможно, под редактором подразумевались те команды, которые вы используете для редактирования. Сегодня это слово, скорее всего, означает отдельную программу. - person John Saunders; 12.03.2010
comment
Спасибо за действительно хороший комментарий - person Giovanni Funchal; 12.03.2010

Как указывали другие, эти номера строк использовались как часть подпрограмм.

Конечно, есть причина, по которой этого больше не делают. Представьте, что вы говорите GOTO 20 в строке 10, а затем понимаете, что вам нужно написать еще 10 строк кода после строки 10. Внезапно вы разбиваетесь о 20, поэтому вам либо нужно сдвинуть вашу подпрограмму дальше ( более высокие числа) и измените значение GOTO, или вам нужно написать другую подпрограмму, которая переходит дальше в коде.

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

person JasCav    schedule 12.03.2010

Во многих случаях он вводился в командной строке (или был на моем старом Commodore 64), поэтому не всегда мог быть текстовый редактор, а если и был, то он был довольно простым.

Кроме того, вам нужно будет делать GOTO и тому подобное, а также вставлять строки между другими.

ie:

10 PRINT "HELLO"
20 GOTO 10
15 PRINT " WORLD"

куда он пойдет в логическом 10 15 20

person Tarka    schedule 12.03.2010

В некоторых редакторах был только режим «перезаписи», но не режим «вставки». Это сделало редактирование существующего кода чрезвычайно болезненным. Однако, добавив эту функцию номера строки, вы можете исправить существующий код из любого места в файле:

100 PRINT "Broken Code"
200 PRINT "Foobar"
...
101 patch the broken code
102 patch more broken code

Потому что номера строк не нужно было упорядочивать в файле.

person zneak    schedule 12.03.2010

Номера строк были ЧАСТЬЮ языка, в некоторых ОЧЕНЬ ранних, даже ОС была просто этими простыми строками. ВСЁ, что у вас было, это манипулировать одной строкой за раз. Попробуйте написать систему учета, используя 1-4k программных файлов и сегментируя их по размеру, чтобы добиться нужного результата. Для редактирования вы использовали номера строк, чтобы указать, что вы редактируете. Итак, если вы ввели как:

10 PRINT "howdy"
20 GOTO 10
10 PRINT "WOOPS"
15 PRINT "MORE WOOPS"
20
RUN

ВЫ ПОЛУЧИТЕ:

WOOPS
MORE WHOOPS

Пробел 20 эффективно удалит эту строку.

person Mark Schultheiss    schedule 12.03.2010