MacBASIC

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 11:58, 2 июня 2016.
MacBASIC
Mac-BASIC-software-icon.png
Спроектировано Donn Denmann, Marianne Hsiung, Larry Kenyon, Bryan Stearns
Первый   появившийся 1982

MacBASIC — версия языка BASIC для Apple Inc., являющаяся частью программного обеспечения для платформы Macintosh начиная с 1982 года, разработанная Donn Denmann, Marianne Hsiung, Larry Kenyon и Bryan Stearns. Бета версия была выпущена в 1985 году и получила популярность в Дартмутском колледже информатики. Но поддержка данной версии интерпретатора BASIC была прекращена из-за сделки с Microsoft. Хотя MacBASIC был продуктом Apple, он был в обиходе у пользователей несколько лет и впоследствии пользовательская аудитория потеряла к нему интерес из -за отсутствия поддержки 32-разрядную компьютерную архитектуру. MacBASIC был всеобъемлющим языком программирования и полностью поддерживал интерактивную среду программирования при разработке прикладных программ на компьютере Macintosh 128K. Язык содержал в себе циклы структурного управления, определяемые пользователем функции, графику, и доступ к инструментарию Macintosh Toolbox.

Описание

Многозадачность в MacBASIC

Общее

Язык Macintosh BASIC является полу-компилируемым. Когда программист набирает новую строку кода, она немедленно передается определенной части системы, которая называется Б-генератор кода. Этот генератор компилирует строку кода и обновляет программные структуры данных. После компиляции система проверяет синтаксис строки кода и предоставляет немедленную обратную связь об её лексической корректности. Затем, во время исполнения, система делает ещё один быстрый просмотр программы (примерно 2 секунды на 50-килобайтный файл) с целью проверки целостности управляющих структур. В случае, если нет фатальных ошибок, программа начинает исполняться. Высокая производительность BASIC объясняется тем, что исполняется компактный Б-код.

Macintosh BASIC позволяет программисту как разрабатывать, так и запускать любое количество программ одновременно. Под каждую программу операционной системой выделяется свое процессорное время (по умолчанию это 1/60 секунды, однако интервал может быть задан программистом). Когда время работы одной программы исчерпано ОС переходит к следующей.

Типы и переменные

Имена переменных в Macintosh BASIC могут быть любой длины, и все символы в имени являются значимыми. Первый символ должен быть алфавитно-цифровым; остальные могут быть почти всем, что вы можете ввести с клавиатуры. Это включает в себя весь набор кодировки ASCII плюс не латинские и другие специальные символы. Исключение составляют лишь арифметические символы и разделители (запятая, точка с запятой, двоеточие и пробелы).

Macintosh BASIC поддерживает массивы переменных для всех восьми типов данных и подтипов, которые будут названы ниже. Массивы могут иметь любое количество измерений, и каждое измерение может иметь до 32767 элементов. Все массивы должны быть объявлены перед использованием. При объявлении программист может указать диапазоны для элементов чисел. Таким образом, вы можете напечатать:

DIM YEAR%(1900 TO 1986)

создать 87 - элементный целочисленный (% обозначает целочисленный тип) массив, у которого первый индекс равен 1900, а последний - 1986. Вы также можете указать диапазоны для отдельных размеров, как сделано в следующем примере:

DIM NAME$(10 TO 75, 165 TO 300)

Есть три основных типа данных в языке: строки, изображения и числовой тип.

  • Строки представлены довольно обыкновенно; литералы заключены в одинарные либо двойные кавычки, а имена переменных оканчиваются на символ доллара ($) как и в других языках BASIC семейства.
  • Вы можете создать переменную типа данных изображение либо, набирая форму из графических примитивов языка, либо создав всю картину в графическом приложении (таком как Mac Paint) и передав его в BASIC через буфер обмена. Для рисования графических примитивов предусмотрен набор вспомогательных команд. Можно назначать форму для переменной изображения. Имя переменной такого типа должно заканчиваться символом @.
  • Числовой тип данных представлен в языке шестью подтипами: один логический, два целочисленных и три вещественных. В дополнение к пяти стандартным арифметическим операциям (+, -, *, /, "), Macintosh BASIC включает DIV для целочисленного деления и MOD для деления с модулю (которое реализовано как арифметический остаток от целочисленного деления). Также стандартными являются операторы сравнения ( <, =, >, < >, > < ) и операторы логические (AND, OR, and NOT). Для конкатенации строк предусмотрен оператор &.

Macintosh BASIC имеет обычный набор арифметических, тригонометрических и строковых функций, в том числе DEF FN (определяемые пользователем функции) для всех типов чисел и строк. Таблица 2 описывает многие из функций, которых нет в большинстве других языков семейства BASIC или они являются уникальными для Macintosh BASIC. Термин "интерактивный", появляющийся в нескольких описаниях, относится к графическим объектам (меню, кнопки, циферблаты и др.). Вы можете скомандовать им появиться на экране и можете манипулировать ими с помощью мыши.

Управляющие структуры

Большинство конструкций языка, управляющих потоком выполнения принимают форму управляющих структур. В языке присутствует команда GOTO, однако вам не следует её использовать никогда.

Помимо знакомых конструкций FOR / NEXT и DO / EXIT / LOOP, в которой все выражения между DO и LOOP повторяются бесконечно и только переход к EXIT позволяет выйти из цикла, в данной разновидности BASIC-а имеются такие структуры, которые отличаются от аналогичных в 1982 ANSI (American National Standards Institute) BASIC стандарте.

Многострочный IF / THEN / ELSE / ENDIF дает возможность исполнять столько выражений, сколько вам угодно, в соответствии с истинностью или ложностью условия.

IF DAY.TEMP > HOT THEN
    CLOTHES$ = SWIM.STUFF$
    GOSUB BEACH:
ELSE CLOTHES$ = WALK.STUFF$
    GOSUB CITY:
ENDIF

Ограниченная конструкция ON...GOSUB в описываемом диалекте BASIC-а была заменена на более гибкую SELECT CASE / ENDCASE. Она позволяет программе передавать управление некоторому множеству команд на основании значения указанной переменной. Допустимо задавать множество инструкций для одной ветви исполнения.

SELECT CASE PARTY$
    CASE "REPUBLICAN"
        CALL REPUBLICAN.PRIMARY.BALLOT
    CASE "COMMUNIST"
        CALL MILITIA
    CASE "DEMOCRAT", "TORY", INDEPENDENT$
        GOSUB FURTHER.CHOICE:
        CALL GENERAL.PARTY.BALLOT
    CASE LEFT$(PARTY$, 3) = "SEP"
        CALL SEPARITIST.PRIMARY.BALLOT
    CASE ELSE
        CALL GEINERAL.PRIMARY.BALLOT
ENDSELECT

Тот же самый SELECT CASE, но с числовыми значениями:

SELECT CASE AGE
    CASE 2, 4, 5
        GOSUB PRESCHOOL:
    CASE 6 TO 12
        GOSUB GRAMMAR.SCHOOL:
    CASE 15, 18 TO 35, VAL (OLD$)
        CALL CHECK.DEMOORAPHICS
    CASE > 70
        GOSUB MIGHT.BE.RETIRED:
ENDSELECT

В языке представлено несколько конструкций, прерывающих обработку. Все они построены на использовании инструкции WHEN в паре с ENDWHEN. Такие блоки обработки позволяют программисту задать действия, предпринимаемые при срабатывании в коде некоторых событий. В качестве последних можно использовать: нажатие на клавишу на клавиатуре, действие мышью, появление ошибки и другие.

WHEN ERR
    CALL ERROR.CHECK
    GOSUB SECOND.CHANCE:
ENDWHEN
WHEN KBD
    PRINT "WHICH MENU DO YOU NEED?"
    GOSUB MENU.CHOICE:
    CALL MENUS
ENDWHEN

Использование подпрограмм в Macintosh BASIC аналогично другим языкам из того же семейства (за исключением того факта, что язык использует GOSUB метки). Ко всему прочему имеется оператор CALL, который позволяет выполнять целую программу как подпрограмму с передачей параметров. После того как вызванная программа отработает, она возвращает управление той команде, которая следует за вызвавшим оператором CALL.

Графика

В языке Macintosh BASIC представлены команды для рисования как статичной так и анимированной графики для экранов 512 на 342 пикселей (скорее всего не является ограничением языка, прим. переводчика). Создание графического примитива начинается с вызова команды PLOT, либо для конкретных примитивов можно вызвать RECT (для рисования прямоугольника), ROUNDRECT (прямоугольник со скругленными углами), or OVAL (для рисования окружностей). Чтобы задать толщину линии рисования необходимо предварительно вызвать команду PENSIZE с нужным параметром. Созданные примитивы могут быть визуализированы с рамкой с помощью FRAME, закрашены применением команды PAINT с предзаданными параметрами закраски или паттерном (команда SET PATTERN), дополнены до последнего появления (INVERT) или стерты (команда ERASE). Различные примитивы можно затем комбинировать для получения цельного изображения и сохранять в переменную типа "изображение", для чего используется команда RECORD PICTURE (обратная команда для восстановления изображения из переменной - это DRAW PICTURE). Для анимаций существует такие команды как ROTATE, SCALE, and ANIMATE, которые непосредственно двигают изображение на экране. Вся графика появляется на специальном выводном окне, поэтому можно одновременно отлаживать программу и смотреть на её результат.

Производительность

Для исследования производительности различных структур языка выбрано пять программ. Их листинг приведен ниже. Шестая программа представляет собой реализацию алгоритма "Решето Эратосфена" для поиска простых чисел.

1) Пустые GOSUBs

print time$; ' at start'
for x=1 to 5000
    gosub foo:
    next x
print time$; ' when done'
end
foo: return

2) Пустой FOR / NEXT цикл

! Loops
Print "Start at ";time$
FOR I=1 TO 5000
    NEXT I
PRINT "Done at ";time$

3) Взятие среза строки

print time$;' at start'
b$='Apple Computer Inc'
for x=1 to 5000
    a$=mid$(b$,6,7)
    next x
print time$;' when done'
print a$
end

4) Вещественное деление (на 3)

print time$;' at start'
for x=1 to 5000
    y=x / 3
    next x
print time$;' when done'

5) Целочисленное деление (на 3)

print time$;' at start'
for x=1 to 5000
    y=x div 3
    next x
print time$,' when done'


6) Решето Эратосфена (1899 простых чисел)

! Sieve
s %= 8190
dim f1ags%(s% + 1)
print " start "; time$
count% = 0

for i% = 0 to s%
    f1ags%(i%) = 1
    next i%

for i% = 0 to s%
    if flags%(i%) = 0 then goto 250
    prime% = i% + i% + 3
    k% = i% + prime%
200    if k% > s% then goto 240
    f1ags%(k%) = 0
    k% = k% + prime%
    goto 200
240    count% = count% + 1
250    next i%

print ' done '; time$
print count% ;' primes'
Тест Время (Секунды)
Пустые GOSUBs 3.0
Пустой FOR / NEXT цикл 1.5
Взятие среза строки 9.0
Вещественное деление (на 3) 18.0
Целочисленное деление (на 3) 3.0
Решето Эратосфена (1899 простых чисел) 31.5

Список литературы

  1. Статья о MacBASIC
  2. Переписка и слухи
  3. Сравнение производительности MacBASIC и MS BASIC
  4. Журнал BYTE со статьей про Macintosh