Чому старі ОСНОВНІ (а може й інші мови) використовують номери рядків як частину вихідного коду?
Я маю на увазі, які проблеми вирішив це (спробувати)?
Чому старі ОСНОВНІ (а може й інші мови) використовують номери рядків як частину вихідного коду?
Я маю на увазі, які проблеми вирішив це (спробувати)?
Відповіді:
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, де ви не були в інтерпретаторі весь час, змогли усунути кожен пронумерований рядок, а замість цього потрібно було лише пронумерувати рядки, які були цілями гілки. По суті, етикетки.
] 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
у циклі. Як вказати, куди слід вставити новий рядок?
Номери рядків вирішують це дуже легко, якщо скоріше 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) в тому, що можна використовувати номери рядків як мовну конструкцію, принаймні як ціль команд 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)
команди будуть автоматично оновлюватися. Але це, безумовно, не було доступно в самих ранніх ОСНОВАх. Але IIRC, доступний в Apple Integer Basic, Applesoft FP basic, TI Basic / Extended Basic, MS Basic / GW Basic тощо
"Номери рядків" означають кілька різних речей.
Перш за все, майте на увазі, що поняття "лінії" існує не назавжди. У багатьох епохах програмування в цю епоху використовували перфокартки , а наявні порядкові номери (як правило, в останніх стовпцях картки) допомогли вам відновити колоду в належному порядку, якщо ви її скинули, або трапилося щось жахливе в зчитувачі карт. Були машини, які робили це автоматично.
Номери рядків для використання в якості цілей GOTO
висловлювань - це зовсім інше поняття. У FORTRAN 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 кожного рядка. Оскільки IDE в 1970-х роках не було, все робилося за допомогою перфокарт, а номер рядка використовувався для визначення того, які рядки в первинному джерелі повинні бути замінені, а які нові рядки. Ми збільшували номери рядків на 100, щоб дати нам можливість додавати більше рядків.
BASIC з'явився пізніше, ніж FORTRAN, в епоху лінії-терміналу. У ньому було середовище циклу читання для друку, яке було більш інтерактивним, ніж колоди карт.
Я навчився програмувати в BASIC на однорядковому дисплеї, який містив 24 символи. Номери рядків були природним способом визначити, куди ви хочете, щоб лінія переходила, редагуючи одну чи вставляючи між іншими.
Я насправді не уявляю, як би ти це зробив.
Ще один момент, про який ніхто не згадував, - це те, що початківцям простіше міркувати про потік програми, де цілі галузей явні. Отже, замість того, щоб відповідати (можливо, вкладеним) BEGIN / END операторам (або будь-якими розділовими блоками), було цілком очевидно, куди пішов контрольний потік. Це, мабуть, було корисно з огляду на цільову аудиторію BASIC (це все-таки універсальний символічний кодекс для початківців ).
Система розподілу часу в Дартмуті використовувала інтерфейс телетайпу. Таким чином, він використовував командний інтерфейс. Спочатку номери рядків просто використовувались як засіб редагування програми. Ви можете вставити, замінити чи видалити, скориставшись номером рядка. Не видається, що рання версія використовувала номери рядків для операторів goto, але це було пізнішим доповненням до мови.