Введение

MBASIC — это диалект языка программирования BASIC, разработанный Microsoft для операционной системы CP/M. MBASIC является потомком первых интерпретаторов Altair BASIC, созданных Microsoft. MBASIC входила в комплект поставки компьютера Osborne 1 в качестве одной из двух версий BASIC. Название "MBASIC" произошло от имени дискового файла MBASIC.COM, содержащего интерпретатор BASIC.

Окружающая среда

MBASIC версии 5 требовала систему CP/M с объемом памяти произвольного доступа (RAM) не менее 28 КБ и хотя бы один дисковод для дискет. В отличие от версий Microsoft BASIC 80, которые производители домашних компьютеров адаптировали для использования специфических аппаратных возможностей конкретных моделей, MBASIC полагался исключительно на системные вызовы CP/M для всех операций ввода и вывода. Доступны были только консоль CP/M (экран и клавиатура), матричный принтер и дисковые устройства. MBASIC в исходной комплектации не имел функций для работы с графикой, цветом, джойстиками, мышью, последовательным портом, сетями, звуком или даже функцией реального времени. MBASIC не поддерживал в полной мере возможности операционной системы CP/M, например, не поддерживал пользовательские области CP/M для организации файлов на дискете. Поскольку системы CP/M обычно были однопользовательскими и работали автономно, не предусматривалась блокировка файлов или записей, а также любая форма многозадачности. Несмотря на эти ограничения, MBASIC в то время считался мощной и полезной реализацией BASIC.

Языковая система

MBASIC — это интерпретатор. Исходный текст программы хранился в памяти в токенизированном виде, при этом ключевые слова BASIC заменялись однобайтовыми токенами, что экономило память и ускоряло выполнение. Любая строка, начинающаяся с номера строки, сохранялась как текст программы; операторы BASIC, не начинающиеся с номера строки, выполнялись немедленно как команды. Программы можно было вывести на экран для редактирования или сохранить на диск в сжатом бинарном формате или как обычный текст ASCII. Каждая строка исходного кода идентифицировалась номером, который можно было использовать в качестве цели перехода в операторах GOTO или GOSUB. Предоставлялись только команды редактирования строк. Часто было полезно сохранять программу как обычный текст и редактировать её с помощью полноценного редактора. Текст программы, переменные, дисковые буферы и сама операционная система CP/M должны были совместно использовать 64-килобайтное адресное пространство процессора 8080. Обычно при первом запуске MBASIC для программ и данных было доступно менее 32 КБ памяти, даже на машине, оснащенной полными 64 килобайтами оперативной памяти. Строки комментариев, начинающиеся с ключевого слова REM или апострофа, можно было размещать в тексте программы, но они занимали ценное место в памяти, что не стимулировало пользователей BASIC к полной документации своего кода. Чтобы обеспечить возможность запуска более крупных и сложных программ, в более поздних версиях MBASIC поддерживались функции, позволяющие читать и выполнять части текста программы под управлением программы (операторы "CHAIN" и MERGE). Поддержка выполнения команд "shell" не предоставлялась, хотя эту функциональность мог реализовать опытный программист. Особым преимуществом MBASIC были подробные сообщения об ошибках, предоставляемые для синтаксических и runtime-ошибок. MBASIC также имел функцию "trace", которая отображала номера строк по мере их выполнения. Хотя это занимало то же экранное пространство, что и обычный вывод программы, она была полезна для обнаружения таких ситуаций, как бесконечные циклы.

Файлы и вход/выход

Данные можно было читать и сохранять на диск как последовательные файлы (с разделителями в конце каждой строки согласно соглашению CP/M CR/LF) или как файлы произвольного доступа с фиксированной длиной записи, которые, при наличии достаточно опытного программиста, можно было использовать для выполнения операций с записями, подобных тем, что используются в базах данных. Формат двоичных данных Microsoft для чисел с плавающей точкой был запатентован и специфичен для данной реализации, что означало, что обмен данными с другими программами был возможен только с использованием текстового представления в формате ASCII или посредством сложного программирования для преобразования двоичного формата.

Управление потоком программ

Контроль потока программы в MBASIC осуществлялся с помощью условных операторов IF THEN ELSE, циклов WHILE WEND и инструкций GOTO и GOSUB. Оператора CASE не было, хотя многовариантное ветвление обеспечивалось инструкцией ON GOTO (вычисляемый переход). Подпрограммы не поддерживали параметры, а все переменные были глобальными. MBASIC не навязывал программистам использование структурного программирования, и было легко писать код, напоминающий "спагетти".

ПЭЭК, ПОКЕ и функции пользователя

Никакое обсуждение BASIC на 8-битных компьютерах конца 70-х и начала 80-х не будет полным без упоминания важности функций PEEK и POKE для непосредственного чтения и записи в память. Поскольку эти системы обычно не имели защиты памяти, это позволяло программисту получать доступ к областям операционной системы или функциям, которые иначе были бы недоступны. Это также открывало возможность для пользовательских программ случайно привести систему к зависанию. Например, программист CP/M мог использовать функцию POKE, чтобы позволить BASIC переключить консольное устройство на последовательный порт, если это поддерживалось системной BIOS. Для компьютеров с часами реального времени набор инструкций PEEK мог использоваться для получения текущего времени. Для более сложных задач MBASIC позволял определять пользовательские функции, которые можно было вызывать из программы на BASIC. Обычно они размещались в зарезервированной области памяти или внедрялись в строковые константы в виде последовательности машинных кодов (опкодов). MBASIC также предоставлял аппаратные инструкции INP и OUT для непосредственного чтения и записи в аппаратные порты ввода/вывода 8080. Это позволяло управлять периферийными устройствами из программы на BASIC, если это допускалось аппаратной частью системы. Любые программы MBASIC, использующие PEEK и POKE, а также пользовательские функции, написанные на машинном коде, не были переносимы между разными компьютерами без внесения изменений.

Преемники MBASIC

Помимо Microsoft BASIC 80 для CP/M, вариант MBASIC также был доступен для операционной системы ISIS II. MSX BASIC также является известным преемником MBASIC, включающим в себя ряд расширений, специфичных для компьютеров MSX. Все функции MBASIC для CP/M были реализованы в BASICA или GWBASIC для IBM PC, работающих с диска, что позволяло переносить программы с систем CP/M на IBM PC-совместимые компьютеры. Поскольку токены, используемые для представления ключевых слов, отличались, программы для CP/M необходимо было сохранять в текстовом формате ASCII. Как правило, управляющие последовательности форматирования экрана, использовавшиеся в версии для CP/M, заменялись командами позиционирования курсора, присутствующими в версиях BASIC для IBM PC, в остальных случаях требовалась незначительная переработка кода.

Баском

Microsoft продала компилятор CP/M BASIC (известный как BASCOM), который использовал исходный язык, аналогичный MBASIC. Программу, отлаженную в MBASIC, можно было скомпилировать с помощью BASCOM. Поскольку текст программы больше не хранился в памяти, а компоненты времени выполнения компилятора были меньше, чем у интерпретатора, для пользовательских данных освобождалось больше памяти. Скорость реального выполнения программы увеличилась примерно в три раза. Разработчики приветствовали BASCOM как альтернативу популярной, но медленной и неудобной CBASIC. В отличие от CBASIC, BASCOM не требовал препроцессора для исходного кода MBASIC, что позволяло отлаживать программы интерактивно. Недостатком было требование Microsoft выплачивать 9% роялти за каждую скомпилированную копию программы и 40 долларов за комбинации аппаратного и программного обеспечения. Компания также оставляла за собой право на аудит финансовой отчетности разработчиков. Поскольку типичные ставки роялти для программного обеспечения составляли 10–25%, журнал InfoWorld в 1980 году заявил, что дополнительное 9% роялти BASCOM "может сделать разработку программного обеспечения откровенно невыгодной", заключив, что "Microsoft имеет техническое решение [проблем CBASIC], но не экономическое".

Значение MBASIC

MBASIC был важным инструментом в эпоху 8-битных компьютеров CP/M. Опытные пользователи могли писать программы на MBASIC для автоматизации задач, которые в современных системах выполняются мощными командами прикладных программ или языками скриптов. Обмен полезными программами MBASIC был распространенной практикой среди групп пользователей компьютеров. Ручной ввод длинных листингов BASIC из журнальных статей был одним из способов "первоначальной загрузки" программного обеспечения в новую систему CP/M. По крайней мере один компилятор языка высокого уровня был написан на MBASIC, и было создано множество небольших игр и утилит, от нескольких строк до нескольких тысяч строк кода.

Другие применения

MBASIC — это также название коммерческого BASIC-компилятора для семейства микроконтроллеров PIC от Microchip Technology, разработанного компанией Basic Micro, Inc., и не имеющего отношения к интерпретатору CP/M.