Чому BASIC використовував номери рядків?


95

Чому старі ОСНОВНІ (а може й інші мови) використовують номери рядків як частину вихідного коду?

Я маю на увазі, які проблеми вирішив це (спробувати)?


27
Якщо ви вже доклали серйозних зусиль з пошуку, не ховайте інформацію про це всередині коментарів, редагуйте своє запитання відповідно. Більше того, Google взяв мене прямо сюди: stackoverflow.com/questions/541421/… і тут stackoverflow.com/questions/2435488/…
Doc Brown

13
Я голосую, щоб закрити це питання поза темою, оскільки відповідь вже є стартовим потоком .
Андрес Ф.

6
Applesoft BASIC була першою мовою програмування, яку я вивчив. Я пам’ятаю, чуючи, що у Паскаля немає номерів рядків і виглядає так: "Але як мені зробити GOTO без номерів рядків? Як це має працювати ??"
Йенс Шодер

14
Смішно, коли я останній раз перевіряв, ми судили, чи питання стосується теми, виходячи з його вмісту, а не вмісту інших сайтів (і, мабуть, відповідей, які там лежать).
MatthewRock

Відповіді:


130

BASIC потрібно брати до контексту з його сучасними мовами: раннім фортран, кобол та збором.

Ще коли я балакав на збірку 6502 без міток, це означало, що коли ви виявили, що вам потрібно додати інструкцію десь посеред щільно упакованого коду (я пізніше додав NOP ), вам потрібно було пройти і повторити весь стрибок адреси. Це займало багато часу.

Fortran була лінійною системою на основі ліній, яка передувала BASIC. У Фортрансі стовпці 1-5 були рядком, який слід використовувати для цілей для розгалуження. Ключовим з Fortran було те, що компілятори, як правило, трохи розумніші, ніж інтерпретатор BASIC, і додавання декількох інструкцій було лише питанням пробивання деяких карток і розміщення їх у колоді в потрібному місці.

З іншого боку, 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. Зокрема, даний рядок був або номером рядка та вказівками BASIC, або командою основного інтерпретатора до RUNабо LIST. Це дозволило легко відрізнити код від команд - весь код починається з чисел.

Ці два фрагменти інформації визначають, чому використовувались цифри - ви можете отримати багато інформації в 16 біт. Мітки на основі рядків займуть набагато більше місця і їх складніше замовити. Числа легко працювати, зрозумілі та їх легше представляти.

Пізніші діалекти BASIC, де ви не були в інтерпретаторі весь час, змогли усунути кожен пронумерований рядок, а замість цього потрібно було лише пронумерувати рядки, які були цілями гілки. По суті, етикетки.


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 System Sharing System) реалізував ранній ... інтерактивний інтерфейс командного рядка. ... Будь-який рядок, що починається з номера рядка, був доданий до програма, замінюючи будь-який раніше збережений рядок тим самим номером; все інше вважалося командою DTSS і негайно виконується. ... Цей спосіб редагування був необхідний завдяки використанню телепринтерів як термінальних одиниць для системи Dartmouth Timesharing. "
RBarryYoung

50

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

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


38
Редагування рядка? Розкіш! Перші основи, які я використав, змусили вас набрати весь рядок. Що насправді засмагло, коли вам довелося перенумерувати підпрограму.
TMN

48
Екран? Який екран? У моєму першому Основному "екрані" був рулон паперу.
ddyer

18
@ddyer: Я мріяв мати рулон паперу! Все, що у нас було, - це купа електродів. Увечері, коли робота повинна була бути виконана, нам доведеться вирівняти себе в ряд і спостерігати, хто зазнав електричного струму, щоб перевірити, чи правильно працює програма. ... - Серйозно, я здивований, що люди насправді в ті часи змогли написати робочі програми.
близько

26
Електрика! Кривава розкіш. Ми звикли вибивати наші команди з граніту
Майкл Дюррант

10
@TMN & ddyer Добре, ви обидва знаєте, куди це заголовок, правда ...? ;-D ==> dilbert.com/strip/1992-09-08 ==> imgs.xkcd.com/comics/real_programmers.png
Баард Копперуд

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у циклі. Як вказати, куди слід вставити новий рядок?

Робоче рішення

Номери рядків вирішують це дуже легко, якщо скоріше klunky. Якщо ви введете рядок програми з числом, яке вже існує, старий рядок заміняється. Тепер середовище 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

Більше проблем ми просто вирішили

Є користь (або прокляття, оскільки це дозволяє відомому коду спагетті BASIC) в тому, що можна використовувати номери рядків як мовну конструкцію, принаймні як ціль команд 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 - Зараз важко уявити кодування без текстового редактора. У той час важко уявити незручність використання текстового редактора, зберегти його і скласти до того, як його можна було запустити ... і це дійсно те, що сталося поруч зі світом ПК; Паскаль і C. Обидві компільовані мови, обидва вільно редагуються текстовим редактором, однозначно не є середовищем програмування, як саме по собі (BASIC було як середовищем програмування, так і середовищем виконання). Паскаль був моєю наступною мовою, і багато в чому досить визвольною. Однозначно потужніший. Але по-іншому, трохи менш захоплююче.
DavidO

17

Місце і епоха, коли розроблявся Basic, найкращим доступним пристроєм вводу / виводу був телетайп. Редагування програми здійснювалося шляхом друку (на папері) списку всієї програми або цікавої її частини, а потім введення рядків заміни рядками.

Ось чому нумерація рядків за замовчуванням становила 10, тому не було б використаних чисел між наявними рядками.


1
Насправді, зчитувачі карт (у супроводі натискань клавіш) та лінійний принтер були кращими пристроями вводу / виводу, ніж телепринтер, але телепринтери були значно дешевшими.
supercat

Нумерація рядків до 10 була фактичним стандартом, а не жорсткою вимогою. І багато BASIC мали renкоманду " " переставити чисельність . Типовим викликом було ren 10, 10(перенумерація починається з десяти, збільшується на десять - поведінка за замовчуванням, якщо один просто набирається ren. Команди gotoі gosubта then (linenumber)команди будуть автоматично оновлюватися. Але це, безумовно, не було доступно в самих ранніх ОСНОВАх. Але IIRC, доступний в Apple Integer Basic, Applesoft FP basic, TI Basic / Extended Basic, MS Basic / GW Basic тощо
DavidO

13

"Номери рядків" означають кілька різних речей.

Перш за все, майте на увазі, що поняття "лінії" існує не назавжди. У багатьох епохах програмування в цю епоху використовували перфокартки , а наявні порядкові номери (як правило, в останніх стовпцях картки) допомогли вам відновити колоду в належному порядку, якщо ви її скинули, або трапилося щось жахливе в зчитувачі карт. Були машини, які робили це автоматично.

Номери рядків для використання в якості цілей GOTOвисловлювань - це зовсім інше поняття. У FORTRAN IV вони були необов’язковими та передували заяві (у графах 1-5). Окрім того, що це легше здійснити, ніж мітки вільної форми, була також концепція обчисленої та призначеної GOTO , яка дозволила вам перейти до довільного номера рядка. Це було щось, чого у більшості сучасних мов програмування немає (хоча switchзаяви наближаються), але це був звичний трюк для збирання програмістів.

BASIC був похідний від FORTRAN і призначений для більш простого втілення та розуміння, тому примушування кожного "рядка" мати номер рядка (і для послідовності, і як цілі GOTO/ GOSUBвисловлювань), ймовірно, було прийняте з цієї причини проектне рішення.


2
Ах, обчислені та призначені готос. Спогади масивів змінних міток в PL / 1, перебираючи один масив, щоб знайти збіг, а потім використовуючи цей індекс масиву збігів як індекс у масиві змінних міток, щоб зробити готи. Або Кобол змінив готи. І ні з використанням номерів рядків! BBC basic мав переконливу заяву, яка була дуже корисною.
Кікстарт

GCC дозволяє обчислювати GOTO в якості розширення (хоча не з номером рядка, звичайно, звичайно) - ви можете робити такі речі, якgoto array_of_labels[some_computation()];
immibis

Незначні: FORTRAN потрібні мітки для мішеней GOTO(або ASSIGN) та оригінальної акарифметики IF, яка називається трьома днями , і (рідко використовуються) альтернативні повернення CALL, сортування цілей (можливо, роздільники) DOта FORMATзаяви. В інших твердженнях вони були необов’язковими.
dave_thompson_085

Деякі BASIC (наприклад, Atari) навіть дозволяють використовувати довільні числові вирази в операторах GOTO. Отже, при правильній конвенції про нумерацію рядків, ви можете написати GOTO 1000+N*100емуляцію switchзаяви.
dan04

6

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


14
COBOL не використовував ці номери рядків. Вони були суворою зручністю, так що коли якийсь бідний шлунок скинув його колоду, а картки йшли скрізь, він міг просто зібрати їх і запустити через сортувальник карт, щоб повернути їх у правильний порядок. Від вас НЕ вимагали пробивати номери ліній на картках. (Студенти так не зробили. Виробничі цехи зробили.)
Джон Р. Стром

5

BASIC з'явився пізніше, ніж FORTRAN, в епоху лінії-терміналу. У ньому було середовище циклу читання для друку, яке було більш інтерактивним, ніж колоди карт.

Я навчився програмувати в BASIC на однорядковому дисплеї, який містив 24 символи. Номери рядків були природним способом визначити, куди ви хочете, щоб лінія переходила, редагуючи одну чи вставляючи між іншими.

Я насправді не уявляю, як би ти це зробив.


2
це, здається, не пропонує нічого суттєвого щодо пунктів, викладених та пояснених у попередніх 4 відповідях
вступити

2
Це робить це погано? Я думаю, що Жак насправді не висвітлював суть однорядного редагування щодо вставки рядків та розумового відстеження коду.
JDługosz

1
@jameslarge Чи пропускаю я цю точку в абзаці, що починається з "Багато разів під час роботи з BASIC ..."? Я також вагаюся називати BASIC операційною системою. Це був DOS. І DOS не потребував BASIC, а саме те, над чим ви працювали більшу частину часу.

2
@Ian, хоча це правда, він був розроблений для системи, яка використовувала телетипи для io (система обміну часом у Дартмуті).
Жуль

3
@MichaelT, На жаль! Я відступлю половину свого коментаря, але буду стояти за частину про те, що BASIC є ОС на деяких комп’ютерах. Я маю на увазі; Apple] [, TI 99/4, IBM 5100, HP 9830a, Compucolor 8001, TRS-80, модель 1, Comodore Vic20, Sinclair ZX80 та ін. Усі завантажилися на BASIC з ROM. Деякі мали додаткову операційну систему, яку можна було завантажити з аудіокасети або з дискети, якщо ви заплатили додаткові $$ за дискету.
Соломон повільно

1

Ще один момент, про який ніхто не згадував, - це те, що початківцям простіше міркувати про потік програми, де цілі галузей явні. Отже, замість того, щоб відповідати (можливо, вкладеним) BEGIN / END операторам (або будь-якими розділовими блоками), було цілком очевидно, куди пішов контрольний потік. Це, мабуть, було корисно з огляду на цільову аудиторію BASIC (це все-таки універсальний символічний кодекс для початківців ).


1

Система розподілу часу в Дартмуті використовувала інтерфейс телетайпу. Таким чином, він використовував командний інтерфейс. Спочатку номери рядків просто використовувались як засіб редагування програми. Ви можете вставити, замінити чи видалити, скориставшись номером рядка. Не видається, що рання версія використовувала номери рядків для операторів goto, але це було пізнішим доповненням до мови.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.