Atari BASIC - Википедия - Atari BASIC

Atari BASIC
AtariBasicExample.png
Программа готова к запуску
СемьяБАЗОВЫЙ
РазработаноПол Лотон
Кэтлин О'Брайен
РазработчикShepardson Microsystems
Впервые появился1979; 41 год назад (1979)
Стабильный выпуск
Редакция C / 1983; 37 лет назад (1983)
ПлатформаСемейство 8-битных Atari
ЛицензияКоммерческий проприетарное программное обеспечение
Под влиянием
Данные General Business Basic[1]
Под влиянием
Турбо-Базовый XL

Atari BASIC является устный переводчик для BASIC язык программирования который поставляется с Семейство 8-битных Atari из 6502 -основан домашние компьютеры. В отличие от большинства BASIC эпохи домашних компьютеров, Atari BASIC не является производным от Microsoft BASIC и существенно отличается. Он включает ключевые слова для специфичных для Atari функций и, например, не поддерживает строковые массивы.

Язык был 8КБ ПЗУ картридж для первых машин в семействе 8-битных: 400, 800, а затем 1200XL. BASIC встроен в последующие модели XL и XE, но его можно отключить, удерживая ВАРИАНТ при загрузке. В XEGS отключает BASIC при питании без подключенной клавиатуры.

Atari BASIC была почти на дне в тестах производительности той эпохи. Первоначальные авторы рассмотрели большинство этих проблем в БАЗОВЫЙ XL и BASIC XE. Множество сторонних решений, таких как Турбо-Базовый XL тоже появился.

Полный аннотированный исходный код и технические характеристики Atari BASIC были опубликованы как Исходная книга Atari BASIC в 1983 г.[2]

История

Машины, которые станут Семейство 8-битных Atari изначально разрабатывался как второе поколение игровые приставки предназначен для замены Atari 2600. Рэй Кассар, новый президент Atari, решил бросить вызов Компьютер Apple вместо этого построив домашний компьютер.[3] Это означало, что дизайн, помимо других изменений, должен был поддерживать БАЗОВЫЙ язык программирования, затем стандартный язык для домашних компьютеров.

В начале 1978 года Atari лицензировала исходный код к MOS 6502 версия Microsoft BASIC.[4] Оригинал Альтаир БАЗОВЫЙ на Intel 8080 выпускались в трех версиях для разных объемов памяти: 4, 8 и 12 КБ. Три версии сильно различались, в версии 4k отсутствовали строковые переменные и функции, и использовалась 32-разрядная версия. плавающая точка формат, версия 8k добавила строковые функции, а версия 12k добавила больше функций, 64-битные переменные и другие функции. К моменту разработки машин Atari оперативная память стала намного дешевле. Microsoft воспользовалась этим, выпустив единственную версию для 6502, наиболее близко напоминающую версию 8k от 8080. Она была предложена в двух аналогичных версиях, одна с использованием исходного 32-битного числового формата размером около 7800 байт, а другая с использованием расширенный 40-битный формат, близкий к 9 кБ.[5]

Даже 32-битная версия с трудом умещалась в 8 Кбайт памяти машины. ПЗУ картридж формат. В Atari также чувствовали, что им необходимо расширить язык для поддержки аппаратных функций своих компьютеров, подобно тому, что Apple сделала с Applesoft BASIC. Это увеличило размер версии Atari примерно до 11 КБ; AppleSoft BASIC на Яблоко II + был 10240 байт.[а] Через шесть месяцев код был урезан и почти поместился в ПЗУ объемом 8 КБ.[4] Однако у Atari был крайний срок в январе 1979 г. Выставка бытовой электроники (CES), где будут демонстрироваться машины. Они решили обратиться за помощью, чтобы подготовить версию BASIC ко времени выступления.[4]

Shepardson Microsystems

Картридж 8K Atari BASIC

В сентябре 1978 г. Shepardson Microsystems выиграла тендер на прохождение BASIC[4] и завершал Cromemco 16K Structured BASIC для Z80 -основан Cromemco Автобус С-100 машины.[6][7] Разработчики Кэтлин О'Брайен и Пол Лотон использовали Данные General Business Basic, реализация только для целых чисел, что послужило источником вдохновения для их BASIC, учитывая опыт Laughton с Data General на система разделения времени.[8]

То, что стало Atari BASIC, - это урезанная версия Cromemco BASIC, перенесенная на 6502. Для этого требовалось 10 КБ кода.[9] Чтобы он уместился в картридже Atari 8K, некоторые стандартные процедуры были перенесены в Операционная система ПЗУ. Это включало 1780 байт для плавающая точка поддержки, которые были размещены в отдельном ПЗУ 2К на материнской плате.[4]

Atari приняла это предложение, и когда в октябре 1978 года были завершены спецификации, Пол Лотон и Кэтлин О'Брайен начали работу над новым языком.[4] В контракте была указана дата поставки 6 апреля 1979 г. или ранее, и это также включало систему диспетчера файлов (позже известную как DOS 1.0).[9] В планы Atari входило вывести раннюю 8K-версию Microsoft BASIC на CES 1979 года, а затем перейти на новую Atari BASIC для производства. Разработка шла быстро, чему способствовал бонусная оговорка в контракте, а картридж 8К был доступен как раз перед выпуском машин. Atari перенесла эту версию на CES вместо версии MS.[10] Atari Microsoft BASIC позже стал доступен как отдельный продукт.[11]

Релизы

Версия, которую Шепардсон предоставила Atari для демонстрации на CES, не должна была быть окончательной версией. Между тем, как они поставили демоверсию, и окончательной доставкой через несколько недель, Шепардсон исправил несколько ошибок в коде.[10] Шепардсон не знал, что Atari уже отправила версию для CES в производство.[12]

Эта версия позже была известна как Редакция А. Он содержит серьезную ошибку в подпрограмме, копирующей память; удаление строк кода длиной ровно 256 байт вызывает блокировку. Иногда это называлось «двухстрочной блокировкой», потому что она не срабатывала до тех пор, пока не была введена следующая строка кода или команда. Это не может быть исправлено нажатием кнопки Перезагрузить ключ.[13]

Редакция B попытался исправить все основные ошибки в редакции A и был выпущен в 1983 году как встроенное ПЗУ в моделях 600XL и 800XL. Исправляя ошибку копирования памяти, программист заметил тот же шаблон кода в разделе для вставки строк и применил то же исправление. Это вместо этого внесло в код исходную ошибку. Вставка новых строк происходит гораздо чаще, чем удаление старых, поэтому изменение резко увеличило количество сбоев.[13] Версия B также содержит ошибку, которая добавляет к программе 16 байтов каждый раз, когда она СПАСТИг и НАГРУЗКАed, что в конечном итоге приводит к нехватке памяти даже для самых маленьких программ.[14][15] Отображение Atari описал их как «потрясающие ошибки» и посоветовал владельцам версии B «Не дурачиться; получите новое ПЗУ, которое доступно на картридже» от Atari.[15] Книга дает программа для ввода текста чтобы исправить версию B до версии C для тех, у кого нет картриджа.[16]

Редакция C устраняет утечки памяти в версии B.[15] Он встроен в более поздние версии 800XL.[14] и все модели XE, включая XEGS. Редакция C также была доступна в виде картриджа.[15]

Версию можно определить, набрав ПРИНТ PEEK (43234) при приглашении ГОТОВО. Результат 162 для редакции A, 96 для редакции B и 234 для редакции C.[17]

Описание

Редактирование программы

Об ошибках синтаксиса сообщается сразу после ввода строки.

Atari BASIC использует линейный редактор как и большинство домашних компьютеров BASIC. В отличие от большинства BASIC, Atari BASIC сканирует только что введенную строку программы и немедленно сообщает об ошибках. Если обнаружена ошибка, редактор повторно отображает строку, выделяя текст рядом с ошибкой в обратное видео. Ошибки отображаются в виде цифровых кодов с описанием, напечатанным в руководстве.[18]

Строка, введенная с ведущим числом от 0 до 32767,[19] вставляется в текущую программу или заменяет существующую строку. Если номер строки отсутствует, команды выполняются немедленно. В ПРОБЕГ команда запускает программу с наименьшего номера строки. Atari BASIC позволяет выполнять все команды в обоих режимах. Например, СПИСОК можно использовать внутри программы.

СПИСОК отображает либо всю программу, либо диапазон строк, разделенных запятой. Например, СПИСОК 10,50 отображает все строки от 10 до 50 включительно. Вывод можно перенаправить, указав идентификатор устройства. СПИСОК "P:" отправляет листинг программы на принтер вместо экрана, СПИСОК "C:" на кассету.

Строки программы могут состоять из трех физических экранных строк общей длиной от 40 до 120 символов. Курсор можно свободно перемещать, при этом редактор автоматически отслеживает, частью какой строки программы BASIC является текущая строка экрана. Нажатие ↵ Enter токенизирует текущую строку. В примере, изображенном выше (с PRUNT), ошибку можно исправить, наведя курсор на U, печатая я (в редакторе есть только режим перезаписи), и нажав ↵ Enter.

Токенизатор

Atari BASIC's токенизатор анализирует всю строку при вводе или изменении. Все ключевые слова конвертируются в однобайтовый токен. Числовые константы разбираются в их 40-битной внутренней форме и затем помещаются в строку в этом формате, в то время как строки остаются в исходном формате, но с префиксом байта, описывающего их длину. Переменные имеют хранилище, выделяемое по мере их появления, и их имя заменяется указателем на их место хранения в памяти. Шепардсон назвал эту концепцию ранней токенизации «интерпретатором предварительной компиляции».[20]

Исходный текст строки сохраняется в BASIC Входной линейный буфер в памяти между 580 и 5FF16. Буфер вывода токена (адресуется указателем в LOMEM - 80, 8116) составляет 256 байт, и любой токенизированный оператор, размер которого превышает размер буфера, вызывает ошибку (14 - слишком длинная строка). Выходные данные токенизатора затем перемещаются в более постоянное хранилище в различных местах памяти. Программа хранится как дерево синтаксического анализа.[b]

Набор указателей (адресов) указывает на различные данные: имена переменных хранятся в таблица имен переменных (ВНТП - 82, 8316) и их значения хранятся в таблица значений переменных (указал на ВВТП - 86, 8716). К косвенный имена переменных таким образом, ссылка на переменную требует только одного байта для адресации ее записи в соответствующую таблицу. Строковые переменные имеют свою собственную область (указывает на STARP - 8C, 8D16), как и стек среды выполнения (указывается на RUNSTK - 8E, 8F16) используется для хранения номеров строк операторов цикла (ДЛЯ ... СЛЕДУЮЩЕГО) и подпрограммы (GOSUB ... ВОЗВРАТ). Наконец, конец использования памяти BASIC обозначается адресом, хранящимся в MEMTOP - 90, 9116) указатель.

Ключевые слова могут быть сокращены с использованием шаблона, установленного Palo Alto Tiny BASIC, введя точку в любом месте слова. Так Л. расширяется до СПИСОК, как есть LI.. Необходимо набрать ровно столько букв, чтобы аббревиатура стала уникальной, поэтому УЧАСТОК требует PL. потому что единственная буква P не уникальна. Чтобы расширить аббревиатуру, токенизатор просматривает свой список зарезервированных слов, чтобы найти первое, которое соответствует предоставленной части. Наиболее часто используемые команды появляются первыми в списке зарезервированных слов с REM в начале (его можно набрать как .). Когда программа позже СПИСОКed он всегда будет писать полные слова за тремя исключениями: РАСПЕЧАТАТЬ есть синоним, ?; ИДТИ К есть синоним, ИДТИ К; и ПОЗВОЛЯТЬ имеет синоним, который является пустой строкой (так 10ПОЗВОЛЯТЬА=10 и 10А=10 означают то же самое). Это отдельные токены, поэтому они останутся таковыми в списке программ. MS BASIC также разрешены ? как краткая форма для РАСПЕЧАТАТЬ, но расширил его при включении в список, рассматривая его как аббревиатуру, а не как синоним.

В ключевых словах для общения с периферийные устройства (см. Ввод, вывод раздел ниже), например ОТКРЫТО # и РАСПЕЧАТАТЬ #, " #"фактически является частью токенизированного ключевого слова, а не отдельным символом. Например,"РАСПЕЧАТАТЬ" и "ПЕЧАТЬ # 0"одно и то же,[c] просто представлены иначе.

Математические функции

Atari BASIC включает три тригнометрические функции: синус, косинус и арктангенс. DEG и РАД установить, используют ли эти функции радианы или градусы, по умолчанию радианы.

Восемь дополнительных функций включают округление, логарифмы и извлечение квадратного корня. Случайная функция, RND, генерирует число от 0 до 1, при этом параметр функции не используется.

Обработка строк

Atari BASIC значительно отличается от BASIC в стиле Microsoft способом обработки строк. Microsoft BASIC в основном копировал систему обработки строк DEC с БАЗОВЫЙ-ПЛЮС, в котором строки являются первоклассными типами с переменной длиной и границами. Это позволяет использовать как строковые переменные, так и массивы строк, поскольку обе они представлены внутри компьютерное слово указывая на хранилище на куча.

Напротив, Atari BASIC скопировала систему обработки строк Hewlett-Packard BASIC, где основным типом данных является один символ, а строки - это массивы символов. Строка представлена ​​указателем на первый символ в строке и его длиной. Чтобы инициализировать строку, ее размер должен быть увеличен до максимальной длины, тем самым зарезервировав необходимый объем памяти в куче. Например:

10ТусклыйАвстралийский доллар(20)20РАСПЕЧАТАТЬ"ВВЕДИТЕ СООБЩЕНИЕ:";30ВХОДАвстралийский доллар40РАСПЕЧАТАТЬАвстралийский доллар

В этой программе зарезервирована строка из 20 символов, и любые символы, превышающие длину строки, будут усечены. Максимально возможная длина строки в Atari BASIC составляет 32 768 символов.

MS BASIC включает функции для доступа к битам строк, например, ЛЕВЫЙ $ (A $, 10) возвращает 10 крайних левых символов Австралийский доллар. Эти функции создают новые строки в куче и возвращают указатель на начало новой строки. В Atari BASIC строка представлена ​​массивом, доступ к которой осуществляется с помощью функций индексации массива, или "нарезка". Эквивалентное выражение в Atari BASIC будет A $ (1,11); массивы имеют индекс 1, а не 0, поэтому строка длиной 10 начинается с 1 и заканчивается на 11. Поскольку синтаксис нарезки был таким же, как синтаксис для выбора строки в двумерном массиве в других BASIC, не было возможности определять массивы строк или работать с ними.

Основное преимущество этого стиля доступа заключается в том, что функции нарезки не создают новые строки, они просто устанавливают указатели на начальную и конечную точки в существующей выделенной памяти. MS BASIC был известен тем, что в таких программах не хватало места в куче, и сбор памяти задержки при удалении из памяти бывших временных строк. Atari BASIC создает новые записи в куче только с помощью явных команд DIM, поэтому управление памятью исключается. Это дает большое преимущество с точки зрения производительности и использования памяти в программах со значительным объемом обработки строк.

Atari BASIC не инициализирует переменные массива, а строковый или числовой массив будет содержать все данные, которые присутствовали в памяти, когда они были выделены. Следующий трюк позволяет быстро инициализировать строку, а также полезен для очистки больших областей памяти от нежелательного мусора. Числовые массивы можно очистить только с помощью цикла FOR ... NEXT:

10REM Инициализировать A $ с помощью 1000 символов X20ТусклыйАвстралийский доллар(1000)30Австралийский доллар="ИКС":Австралийский доллар(1000)=Австралийский доллар:Австралийский доллар(2)=Австралийский доллар

Объединение строк в Atari BASIC работает, как в следующем примере. Целевая строка должна быть достаточно большой, чтобы вместить объединенную строку, иначе произойдет ошибка:

10ТусклыйАвстралийский доллар(12),Млрд долларов(6)20Австралийский доллар="Привет ":Млрд долларов="там!"30Австралийский доллар(LEN(Австралийский доллар)+1)=Млрд долларов40РАСПЕЧАТАТЬАвстралийский доллар

Оператор INPUT нельзя использовать с подсказкой или с переменными массива. Последний должен быть заполнен косвенно с помощью оператора типа 20 INPUT A: B (1) = A. Переменные массива в Atari BASIC также могут содержать два нижних индекса.

Строки, включенные в операторы DATA, не должны быть заключены в кавычки в Atari BASIC, в результате элементы данных также не могут содержать запятую. Оператор READ также нельзя использовать с переменными массива.

Массивы имеют базовый индекс 0, поэтому такой оператор, как DIM A (10), фактически создает массив из 11 элементов (элементы 0-10).

Ввод, вывод

Атари Операционные системы включает подсистему для периферийный устройство ввода / вывода (I / O), известное как CIO (Central Input / Output). Большинство программ можно написать независимо от того, какое устройство они могут использовать, поскольку все они соответствуют общему интерфейсу; в то время такое было редко на домашних компьютерах. Новые драйверы устройств можно было бы довольно легко написать, которые были бы автоматически доступны для Atari BASIC и любой другой программы, использующей Atari OS, а существующие драйверы можно было бы заменить или дополнить новыми. Замена E:, например, можно заменить один в ПЗУ, чтобы обеспечить отображение с 80 столбцами, или использовать его для создания контрольная сумма всякий раз, когда возвращается строка (например, используется для проверки введенного списка программ).

Atari BASIC поддерживает доступ CIO с помощью зарезервированных слов OPEN #, CLOSE #, PRINT #, INPUT #, GET #, PUT #, NOTE #, POINT # и XIO #. В ОС есть процедуры для заливки и отрисовки графики, но не все они доступны в виде конкретных ключевых слов BASIC. УЧАСТОК и DRAWTO для рисования линий поддерживаются, а команда, обеспечивающая заливку области, - нет. Функцию заполнения можно использовать через общую точку входа CIO, которая вызывается с помощью команды BASIC. XIO.

Заявление BASIC ОТКРЫТО # подготавливает устройство к вводу / выводу:

10REM Открывает кассетное устройство на канале 1 для чтения в BASIC20ОТКРЫТО#1,4,0,"C: MYPROG.DAT"

Здесь, ОТКРЫТО # означает "убедитесь, что канал 1 свободен", позвоните в C: драйвер, чтобы подготовить устройство (это приведет к натяжению катушек с лентой и продвижению головок, удерживая кассетный магнитофон в состоянии «паузы». 4 означает "читать" (другие коды 8 для записи и 12 = 8 + 4 для "чтения и записи"). Третье число - это вспомогательная информация, если она не нужна, устанавливается на 0. В C: MYPROG.DAT это имя устройства и имя файла; имя файла игнорируется для кассетного драйвера. Физические устройства могут иметь номера (в основном диски, принтеры и последовательные устройства), поэтому "P1:"может быть заговорщиком и"P2:"ромашковый принтер, или"D1:"может быть один диск и"D2:"и т. д. Если нет, предполагается 1.

Оператор LPRINT используется для вывода строк на принтер.

Atari BASIC не включает аналог Microsoft BASIC ПОЛУЧАТЬ или же INKEY $ команды для обнаружения нажатия клавиш, это можно смоделировать либо POKEнепосредственно в драйвер клавиатуры или открывая его как файл (например, ОТКРЫТО1,4,0,"K:":ПОЛУЧАТЬ#1,Австралийский доллар) хотя последний будет ждать нажатия клавиши, в отличие от ПОЛУЧАТЬ или же INKEY $.

Печатать ДОС из BASIC выйдет в Atari DOS командное меню. Все несохраненные программы будут потеряны. Нет команды для отображения каталога диска из BASIC, и это должно быть сделано путем выхода из DOS.

DOS занимает примерно 5 КБ памяти, таким образом, машина Atari с кассетами (48 КБ или больше) будет иметь около 37 000 байт свободной памяти программ BASIC и 32 000 байт, если присутствует DOS. BASIC не может использовать дополнительную оперативную память на машинах XL и XE.

Графическая и звуковая поддержка

Atari BASIC имеет встроенную поддержку звука (через ЗВУК заявление), настройка экранной графики (ГРАФИКА, НАСТРОЙКА ЦВЕТА, рисование графики ЦВЕТ, СЮЖЕТ, РИСУНОК), джойстики (ПАЛКА, СТРИГ) и лопатки (ВЕСЛО, PTRIG). Базовая операционная система включала процедуру заполнения произвольных форм, но в BASIC не было КРАСКА команду, и вместо этого ее нужно было вызывать с XIO команда.[21]

В Atari BASIC нет специальной команды для очистки экрана, обычно это делается с помощью РАСПЕЧАТАТЬ CHR $(125), который печатает контрольный код очистки экрана (аналогично РАСПЕЧАТАТЬ CHR $(147) в Commodore BASIC). Atari BASIC не включает функцию TAB; это можно смоделировать, установив позицию столбца курсора в $ 55 или позицию табуляции в $ C9, которая имеет значение по умолчанию 10. Измененные значения не вступят в силу, пока не будет выполнен оператор PRINT. В Atari BASIC также нет функции SPC.

Расширенные аспекты оборудования, такие как графика игрока / ракеты (спрайты ), переопределенные наборы символов, прокрутка и пользовательские графические режимы не поддерживаются BASIC; для этого потребуются процедуры на машинном языке или операторы PEEK / POKE. К некоторым графическим режимам нельзя получить доступ из BASIC на Atari 400/800, поскольку ПЗУ ОС не поддерживают их; единственный способ получить к ним доступ - это на машинном языке, установив регистры ANTIC и список отображения вручную. ПЗУ ОС на XL / XE добавили поддержку этих режимов.[22]

Режимы растровых изображений в BASIC обычно устанавливаются так, чтобы текстовое окно занимало последние три строки в нижней части экрана, поэтому пользователь может отображать подсказки и вводить данные в программу. Если к номеру режима, вызываемому с помощью оператора GRAPHICS, добавить 16, весь экран будет в режиме растрового изображения (например, GRAPHICS 8 + 16). Если активирован режим растрового изображения в полноэкранном режиме, Atari BASIC автоматически переключается обратно в текстовый режим, когда выполнение программы прекращается, в отличие от многих других BASIC, которые оставляют пользователя в режиме растрового изображения и имеют нечитаемый экран, который можно отключить только путем ввода слепой команда или перезагрузка компьютера.

Координаты растрового изображения вычисляются в диапазоне от 1 до максимальной строки / столбца минус один, таким образом, в режиме 6 (160x192) максимальные координаты для пикселя могут быть 159 и 191. Если пользователь переходит допустимые координаты для режима, БЕЙСИК выйдет с ошибкой.

Продвинутые техники

Метки линий

Atari BASIC позволяет использовать числовые переменные и выражения для передачи номеров строк в ИДТИ К и GOSUB команды. Например, подпрограмма, очищающая экран, может быть записана как GOSUB ЗАЗОРНЫЙ ЭКРАН, что легче понять, чем ГОСУБ 10000.

Включает

Большинство БЕЙСИКОВ той эпохи позволяло СПИСОК команда для отправки исходного кода на принтер или другое устройство. Atari BASIC также включает ВОЙТИ команда, которая считывает исходный код с устройства и объединяет его обратно в программу, как если бы пользователь ввел ее. Это позволяет сохранять программы в разделах, считывая их при использовании ВОЙТИ объединить или заменить существующий код. Тщательно используя блоки номеров строк, которые не перекрываются, программисты могут создавать библиотеки подпрограмм и при необходимости объединять их в новые программы.

Встроенный машинный язык

Atari BASIC может вызывать подпрограммы машинного кода. Машинный код обычно хранится в строках, которые могут находиться в любом месте памяти, поэтому код должен быть независимым от позиции, или в 256-байтовой области (начиная с адреса 1536).10, 60016), который не используется BASIC или операционной системой. Код можно загрузить на страницу 6, прочитав его из ДАННЫЕ заявления.

Машинный код вызывается с USR функция. Первый параметр - это адрес процедуры машинного кода, а следующие значения являются параметрами. Например, если код машинного языка хранится в строке с именем ОБЫЧНЫЙ $ его можно вызвать с параметрами как ОТВЕЧАТЬ=USR(ADR(ОБЫЧНЫЙ $),VAR1,VAR2).

Параметры помещаются в аппаратный стек как 16-битные целые числа в порядке, указанном в USR функция в младшем байте, старшем байтовом порядке. Последнее значение, помещенное в стек, - это байт, указывающий количество аргументов. Код машинного языка должен удалить все эти значения перед возвратом через РТС инструкция. Значение можно вернуть в программу BASIC, поместив его по адресам 21210 и 21310 (D416 и D516) как 16-битное целое число.

Спектакль

Теоретически Atari BASIC должен работать быстрее, чем современные BASIC, основанные на шаблоне MS. Поскольку исходный код полностью токенизируется при вводе, все этапы токенизации и синтаксического анализа уже завершены. Даже сложные математические операции готовы к запуску, любые числовые константы уже преобразованы во внутренний 40-битный формат, а значения переменных ищутся по адресу, а не по запросу.[d] Несмотря на эти теоретические преимущества, на практике Atari BASIC работает медленнее, чем другие домашний компьютер БЕЙСИК, часто в большом количестве.[23]

На двух широко используемых ориентиры эпохи, Байт журнал Сито Эратосфена и Тест Creative Computing тест написан Дэвид Х. Ахл, Atari финишировал ближе к концу списка с точки зрения производительности и был намного медленнее, чем современный Яблоко II или же Commodore PET,[24] несмотря на то, что у него тот же процессор, но он работает примерно с удвоенной скоростью. Он финишировал позади относительно медленных машин, таких как Sinclair ZX81 и даже некоторые программируемые калькуляторы.[25]

Большая часть медлительности языка связана с тремя проблемами.[23]

Во-первых, математические процедуры с плавающей запятой были плохо оптимизированы. В тесте Ahl операция с одной экспонентой, которая внутри перебирает функцию медленного умножения, во многом была причиной плохих результатов машины.[23]

Помимо медленного выполнения большинства математических операций, преобразование между внутренним форматом с плавающей запятой и 16-битными целыми числами, используемыми в определенных частях языка, было относительно медленным. Внутри эти целые числа использовались для номеров строк и индексации массивов, а также для некоторых других задач, но числа в токенизированной программе всегда хранились в двоично-десятичный код (BCD) формат.[26] Каждый раз, когда встречается одно из них, например, в номере строки в GOTO 100, токенизированное значение BCD необходимо преобразовать в целое число - операция, которая может занять до 3500 микросекунд.[27] Другие BASIC избегали этой задержки, используя специальный регистр для преобразования чисел, которые могли быть только целыми числами, например, номер строки после ИДТИ К, переключение на специальный код ASCII-to-integer для повышения производительности.

Другая проблема связана с тем, как Atari BASIC реализовала ветки. Выполнить ветку в ИДТИ К или же GOSUB, интерпретатор просматривает всю программу в поисках подходящего номера строки.[28] Одним из незначительных улучшений, обнаруженных в большинстве основанных на Microsoft BASIC, является сравнение номера целевой строки с текущим номером строки и поиск вперед от этой точки, если он больше, или запуск сверху, если меньше. Это улучшение отсутствовало в Atari BASIC.[23]

Самой серьезной проблемой было внедрение ЗА...СЛЕДУЮЩИЙ петли. Почти все BASIC, включая версии, производные от MS, будут указатель к месту нахождения ЗА в стеке, поэтому, когда он достигнет СЛЕДУЮЩИЙ он мог легко вернуться в ЗА снова в одной операции ветвления. Вместо этого Atari BASIC выдвинула номер строки. Это означало, что каждый раз СЛЕДУЮЩИЙ встретился, системе пришлось перебрать всю программу, чтобы найти соответствующий ЗА линия. В результате любые циклы в программе Atari BASIC вызывают большую потерю производительности по сравнению с другими BASIC.[23]

Несколько BASIC для Atari решили некоторые или все эти проблемы, что привело к значительному увеличению производительности. БАЗОВЫЙ XL сократил время для Байт тест с 194 до 58 секунд,[23] более чем в три раза быстрее. Это было достигнуто путем кеширования местоположения FOR / NEXT циклов, как и в других BASIC, а также использовали этот же кеш для выполнения ИДТИ К и GOSUB поиск строки для дальнейших улучшений. Турбо-Базовый XL включал другое решение проблемы поиска строк, а также переписанную высокопроизводительную библиотеку с плавающей запятой. В тесте Ahl Atari BASIC потребовалось 405 секунд, в то время как тот же код в Turbo BASIC занял 41,6 секунды, что на порядок больше.[29]

Отличия от Microsoft BASIC

  • Следующие ключевые слова отсутствуют в Atari BASIC: INKEY $, CLS,DEF FN, TAB, ЕЩЕ.
  • Все массивы должны иметь размеры перед использованием, в то время как Microsoft BASIC по умолчанию устанавливает размер массива из 10 элементов, если размер не измеряется.
  • Строковые переменные обрабатываются как массивы, и перед использованием их необходимо измерить.
  • Atari BASIC не позволяет использовать массивы строк или конкатенацию строк.
  • Целочисленные переменные не поддерживаются.
  • Побитовых операторов нет.
  • Имена переменных могут иметь произвольную длину.
  • ВХОД не может включать подсказку.
  • РАСПЕЧАТАТЬ может быть сокращено как ? как в Microsoft BASIC, но Atari BASIC не токенизирует его в РАСПЕЧАТАТЬ. СПИСОК-при запуске программы по-прежнему отображается вопросительный знак.
  • Цель ИДТИ К и GOSUB может быть переменной или выражением.
  • FOR..NEXT циклы в Atari BASIC должны иметь имя переменной, на которую указывает СЛЕДУЮЩИЙ заявление, в то время как Microsoft BASIC этого не требует.
  • Использование нескольких переменных не допускается. СЛЕДУЮЩИЙ заявления, как они есть в Microsoft BASIC (например, СЛЕДУЮЩИЙ X, Y).
  • СПИСОК использует запятую для разделения диапазона вместо знака минус.

Ключевые слова

Смотрите также

Примечания

  1. ^ AppleSoft BASIC занимала ячейки памяти от $ D000 до $ F7FF, всего 10240 байт.
  2. ^ Хотя дерево синтаксического анализа реализовано в виде набора таблиц, что на самом деле является деталью реализации.
  3. ^ Хотя на самом деле 0 здесь явно запрещен BASIC, предполагая, что это ошибка кодирования, не так ли?
  4. ^ Это причина, по которой MS-basics имеет только две значащие буквы в именах переменных, они хранятся в списке с двумя байтами ASCII для имени в другом, чтобы сократить время поиска.

Рекомендации

Цитирование

  1. ^ Лоренцо, Марк (2017). Бесконечный цикл: история языка программирования BASIC. Филадельфия: SE Books. п. 106. ISBN  978-1974-27707-0.
  2. ^ Уилкинсон, О'Брайен и Лотон, 1983 г..
  3. ^ Decuir 2004.
  4. ^ а б c d е ж Уилкинсон 1982, п. ix.
  5. ^ Стейл, Майкл (20 октября 2008 г.). «Создайте свою собственную версию Microsoft BASIC для 6502». Требуется некоторая сборка.
  6. ^ Уилкинсон 1982, стр. iv-v.
  7. ^ Cromemco 1978.
  8. ^ Лоренцо, Марк (2017). Бесконечный цикл: история языка программирования BASIC. Филадельфия: SE Books. п. 106. ISBN  978-1974-27707-0.
  9. ^ а б Уилкинсон 1982, п. v.
  10. ^ а б Уилкинсон 1982, п. Икс.
  11. ^ Черри, Чарльз (июнь 1987). "BASIC Bonanza". Античный.
  12. ^ Уилкинсон 1982, п. vi.
  13. ^ а б «Ошибки Atari BASIC». Вычислить!. Июль 1986 г. с. 10.
  14. ^ а б Рэдклифф, Мэтью (сентябрь 1995 г.). "Конвертер редакции C". Античный.
  15. ^ а б c d Чедвик 1985, п. 230.
  16. ^ Чедвик 1985, pp. 250-251.
  17. ^ Харди, Боб (февраль 1993 г.). "Получатель кода ключа". Атари Классика. п. 18.
  18. ^ Ручная 1980, Приложение Б.
  19. ^ Кроуфорд 1982, п. 10.3.
  20. ^ Уилкинсон, О'Брайен и Лотон, 1983 г., п. 5.
  21. ^ Ручная 1980, п. 54.
  22. ^ "ATR: раздел 15: Списки отображения".
  23. ^ а б c d е ж Уилкинсон 1985, п. 139.
  24. ^ Ахл, Дэвид (ноябрь 1983 г.). "Benchmark comparison test". Творческие вычисления. С. 259–260.
  25. ^ Ahl, David (January 1984). "Creative Computing Benchmark". Творческие вычисления. п. 12.
  26. ^ Wilkinson, O'Brien & Laughton 1983, п. 17.
  27. ^ Crawford 1982, п. 8.45.
  28. ^ Winner, Lane (1982). "De Re Atari, Chapter 10: Atari BASIC". Atari, Inc.
  29. ^ "Ahl's Benchmark?". 28 ноября 2007 г.

Библиография

внешняя ссылка