Skip to content

Latest commit

 

History

History
374 lines (310 loc) · 27.8 KB

README.md

File metadata and controls

374 lines (310 loc) · 27.8 KB

* МИКРО/80 * BASIC

* РАДИО-86РК * BASIC

* ЮТ-88 * BASIC

* МИКРО/80 * BASIC-SERVICE

* РАДИО-86РК * BASIC-SERVICE

* ЮТ-88 * BASIC-SERVICE

* МИКРОША * BASIC (экспериментально)

Язык программирования высокого уровня — Бейсик был разработан еще в 1964 г., но по-настоящему широко стал применяться только после появления микропроцессоров и микроЭВМ.

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

К недостаткам языка Бейсик следует отнести отсутствие общепринятого стандарта на его основные элементы и средства для написания, так называемых, структурированных программ. Первый недостаток привел к появлению большого количества реализаций трансляторов с языка Бейсик, имеющих весьма различные характеристики, второй — к критике языка профессиональными программистами.

Несмотря на эти недостатки, мы все же считаем этот язык наиболее подходящим для простых микро-ЭВМ и предлагаем читателям версию транслятора, который при малом объеме (6,5 Кбайт) имеет достаточно широкие возможности и позволяет при небольших переделках исполнять на микроЭВМ «Микро-80» практически любые программы, написанные на Бейсике, но разработанные для других ЭВМ. В последней статье цикла «Радиолюбителю о микропроцессорах и микро-ЭВМ» мы очень кратко обсудили вопрос о различии между двумя видами трансляторов — компиляторов и интерпретаторов. Описываемый ниже транслятор реализован в виде интерпретатора. Это означает, что в памяти ЭВМ должны находится одновременно, как сама программа интерпретатора, так и программа, написанная на языке Бейсик. Такой подход позволяет возложить на интерпретатор, кроме трансляции программ, и некоторые дополнительные функции, а именно: редактирования текстов при подготовке текстов программ и внесения в них изменений и отлаживания для эффективного поиска ошибок. Таким образом, будучи загружен в ОЗУ микро-ЭВМ и запущен в работу, интерпретатор позволяет, как разрабатывать новые программы, так и загружать (с магнитной ленты) и запускать в работу программы, разработанные ранее.

Описываемая версия интерпретатора требует наличия оперативной памяти объемом не менее 12 Кбайт (начиная с адреса 0000Н). Интерпретатор хранится на магнитной ленте и загружается в ОЗУ с помощью директивы «I» Монитора. Для ввода-вывода информации интерпретатор использует подпрограммы Монитора.

Ячейки памяти 0002Н, 021СН, 0230Н и 0242Н хранят старший байт адреса конца ОЗУ микро-ЭВМ. В эти ячейки вы должны поместить одинаковые константы, соответствующие объему ОЗУ вашей микро-ЭВМ. Для ОЗУ объемом 12, 16, 32 и 48 Кбайт эти константы должны быть соответственно равны 2FH, 3FH, 7FH и BFH.

Запускают интерпретатор в работу по директиве «G0» Монитора. На экране дисплея при этом появляется сообщение:

 * МИКРО/80 * BASIC.

что означает готовность интерпретатора к приему директив оператора.

Интерпретатор имеет два основных режима работы: непосредственной интерпретации и интерпретации программы, хранящейся в памяти. Далее для краткости будем называть первый режим просто непосредственным, а второй — программным.

Непосредственный режим работы позволяет использовать микро-ЭВМ для выполнения вычислений без написания программы, то есть примерно так же, как калькулятор для научно-технических расчетов. Например, необходимо рассчитать мощность, рассеиваемую на коллекторе транзистора выходного каскада. Как известно, для этого случая справедливо соотношение

Рк = Ек2 /4 * ?2 * Rн. 

где Ек — напряжение на коллекторе, Rн — сопротивление нагрузки.

Пусть, например, Ек = 12 В, Rн = 8 Ом. Если теперь набрать на клавиатуре выражение

PRINT 12 ^ 2/(4*(3.14) ^ 2 *8),

то после нажатия на клавишу «ВК» мы тут же на экране дисплея прочтем ответ:

0.456408

Обратите внимание, что в Бейсике для обозначения операции возведениястепень используется символ «^», вместо запятой в числах с десятичными дробями — точка, а указание знака умножения «*» строго обязательно. Кроме того, для указания последовательности вычислений введены круглые скобки. Если эти вычисления необходимо произвести несколько раз (для разных значений Ек и Rн), то целесообразно написать простую программу:

ПРИМЕР 1
10 REМ РАСЧЕТ МОЩНОСТИ
20 PI = 3.14156
30 PRINT 'ВЕЛИЧИНА НАПРЯЖЕНИЯ?'
40 INPUT EК
50 PRINT 'СОПРОТИВЛЕНИЕ НАГРУЗКИ?'
60 INPUT RN
70 PK = EK^2/(4*<PI>^2*RN)
80 PRINT 'РАССЕИВАЕМАЯ МOЩHOCTЬ ='; PK
90 INPUT 'ПРОДОЛЖИМ (Д ИЛИ Н) ", X$
100 IF Х$='Д' THEN 30
110 STOP

но прежде чем подробно обсуждать работу этой программы, необходимо познакомиться с некоторыми терминами и понятиями.

Программа на Бейсике состоит из последовательности пронумерованных строк. Им принято присваивать номера с интервалом равным 10. В дальнейшем это может оказаться полезным, если понадобится вставить несколько дополнительных строк в программу. Номера могут быть любыми от 0 до 65529. Каждая строка программы может состоять из одного или нескольких операторов, предписывающих интерпретатору определенные действия. Если операторов несколько, то их отделяют друг от друга символом «:» (двоеточие). В качестве операндов выступают выражения, составленные из констант и переменных. В Бейсике существуют два типа констант: числовые и символьные. Числовые константы — это любые десятичные числа в интервале от −1,71035 до +1,71035, символьные — последовательность любых отображаемых символов, заключенная в кавычки.

Например:

  • «МОСКВА», «КП350». «РЕЗУЛЬТАТ=» — символьные константы,
  • 220, −380, 3.14, −3.00ЗЕ-03, 8Е12 — числовые.

Две последние константы заданы в экспоненциальной форме, на что указывает буква Е, за ней следуют знак (у положительных чисел знак «+» можно опускать) и величина порядка. Точность задания констант — 6 значащих цифр.

В программах на Бейсике используются переменные двух типов: числовые и символьные. Обращаются к переменным по имени, которое состоит из одного или двух символов. Первый из них обязательно должен быть буквой латинского алфавита, второй — буквой этого же алфавита или цифрой. Символьные переменные после имен содержат знак «$».

Например:

  • А, А8, К — допустимые имена числовых переменных;
  • A$, АТ$, С3$ — символьных.

Группе переменных одного типа может быть присвоено общее имя, и их в этом случае называют переменными с индексами или массивами. Мы будем пользоваться в дальнейшем термином «массив». Для обращения к каждой отдельной переменной в массиве используют один или несколько индексов. Наименьшее значение индекса равно 0, а наибольшее определяется размером массива. Если индекс один, то говорят, что массив одномерный, два — двумерный и т.д. Имена массивов подчиняются тем же правилам, что и имена переменных. Индексы необходимо указывать в круглых скобках после имени массива. Разрешено использование массивов как числовых, так и символьных переменных.

Например:

  • AB(4) четвертый элемент одномерного массива AB;
  • LS(3,8) — элемент, стоящий на пересечении 3 ей строки и 8-го столбца двумерного массива LS;
  • К$(5) — пятый элемент одномерного массива К$.

При работе программы для каждого массива в памяти ЭВМ резервируется соответствующая область. Перед использованием массив должен быть описан при помощи оператора DIM. Более подробно об этом мы поговорим позже.

Переменные и константы образуют выражения языка Бейсик. Кроме них, в выражения входят знаки операций, скобки и имена функций. Обращаются к функциям по имени, аргумент при этом указывают в круглых скобках после него. Все выражения можно разделить на 4 типа:

  • арифметические,
  • символьные,
  • выражения отношения и
  • логические.

В табл. 3 приведены знаки операций, принятые в Бейсике.

Таблица 3

{| class=border |- | Знак операции || Операция |- | Арифметические операции ||   |- | + || СЛОЖЕНИЕ |- | — || ВЫЧИТАНИЕ |- | * || УМНОЖЕНИЕ |- | / || ДЕЛЕНИЕ |- | ^ || ВОЗВЕДЕНИЕ В СТЕПЕНЬ |- |   ||   |- | > || БОЛЬШЕ |- | < || МЕНЬШЕ |- | = || РАВНО |- | <> || НЕ РАВНО |- | >= || БОЛЬШЕ ИЛИ РАВНО |- | <= || МЕНЬШЕ ИЛИ РАВНО |- | Логические операции ||   |- | NOT || ОТРИЦАНИЕ («НЕ») |- | AND || ЛОГИЧЕСКОЕ УМНОЖЕНИЕ («И») |- | OR || ЛОГИЧЕСКОЕ СЛОЖЕНИЕ («ИЛИ») |}

Числовые переменные и константы могут принимать участие в выражениях любого типа. Для символьных переменных и констант разрешены только операции отношения и конкатенации (слияния), обозначаемые знаком «+»

ПРИМЕР 2
====================
ПУСТЬ A$="ТЕЛЕ", B$="ФОН", C$="ВИЗОР",
ТОГДА: M$=A$ + B$="ТЕЛЕФОН"
L$=A$ + C$="ТЕЛЕВИЗОР"
B$ <> C$

При вычислении результата выражения все операции имеют определенный приоритет. Табл. 4 показывает приоритет операций, определяющий порядок вычислений. Чем выше в таблице находится знак той или иной операции, тем выше ее приоритет.

Таблица 4

^,*, /,+, -,
=, <>, <, >, >=, <=
NOT
AND
OR

Во всех алгоритмических языках одним из основных операторов является оператор присваивания. В Бейсике это — оператор LET. Так, запись LET В1=12 означает, что переменной (или константе) B1 присваивается значение 12. В описываемом интерпретаторе слово LET не используется и поэтому нужно просто писать В1=12.

Теперь мы можем вернуться к примеру 1. В строке 20 константе PI (число π) присваивается значение 3.14156. В строках 30, 50 и 80 записаны операторы печати. Поэтому на экран будут выведены соответствующие сообщения. В строках 40, 60 и 90 записаны операторы ввода, в результате выполнения которых, интерпретатор запрашивает ввод с клавиатуры дисплея. В первых двух случаях числовые значения, в последнем — символьное значение. Введенное с клавиатуры слово присваивается символьной переменной Х$.

В строке 100 использован условный оператор, который в случае выполнения условия передает управление на начало программы (строка 30). В противном случае будет выполнен оператор STOP, прекращающий выполнение программы и переводящий интерпретатор в непосредственный режим работы.

Мы уже говорили, что интерпретатор реализует также функции редактора текстов и отладчика. Перед вводом текста новой программы необходимо сначала стереть в памяти микро-ЭВМ старую программу, воспользовавшись директивой NEW, а затем с клавиатуры набрать программу (не забывая набирать в начале каждой строки ее номер). Для исправления неверно набранных символов служит клавиша «» (так же, как и в Мониторе), а клавиша «» — для стирания всей неверно набранной строки. Ввод каждой строки заканчивают нажатием на клавишу «ВК». Если случайно будет нажата клавиша «СТР», то управление передается программе Монитор и для повторного запуска интерпретатора в работу необходимо воспользоваться директивой Монитора «J0». Перезапуск интерпретатора не приводят к потере текста ранее набранной программы.

Просмотреть текст программы можно при помощи директивы '''LIST'''. Если необходимо удалить какую-либо строку программы, достаточно набрать ее номер и нажать на клавишу «ВК», а чтобы вставить в текст новую, набрать номер любой строки, попадающий в интервал между двумя соседними, затем саму строку и нажать на клавишу «ВК».

Интерпретатор игнорирует любые пробелы, если только они не стоят внутри символьных констант. Это создает определенные удобства, так как при использовании пробелов для выделения операторов улучшается читаемость программы (хотя несколько и увеличивается ее объем). Для исправления строки, содержащей ошибки, набирают ее заново (с тем же номером). После нажатия на клавишу «ВК» вновь набранная строка встанет на место старой.

Отладка программы на Бейсике производится также при помощи интерпретатора. Для этой цели использована возможность перевода интерпретатора из программного режима в непосредственный при выполнении оператора '''STOP''' или одновременном нажатии на клавиши «УС» и «С». В непосредственном режиме можно просмотреть и при необходимости модифицировать (изменить) значения переменных, снова просмотреть текст программы по директиве '''LIST''' и затем продолжить выполнение программы с того места, где она была прервана.

Перейдем теперь к подробному описанию нашей версии интерпретатора с языка Бейсик и, прежде всего, рассмотрим его системные директивы. Отметим только, что далее по тексту фигурные скобки будут означать, что данные параметры в конкретной директиве могут отсутствовать. В этом случае используют так называемые соглашения по умолчанию, которые будут оговорены особо.

== Сообщения об ошибках ==

Интерпретатор языка Бейсик позволяет в процессе выполнения программы обнаруживать и анализировать ошибки. Интерпретатор, естественно, не может обнаружить логические ошибки. Это под силу только программисту, так как только он знает, что должна делать программа. О каких же ошибках тогда идет речь? Это будет ясно из дальнейшего.

Если ошибка обнаружена в непосредственном режиме, то на экран выводится сообщение

где XX — двузначный код ошибки.

Если ошибка обнаружена в программном режиме, то выводится сообщение

"? ХХ ОШИБКА В N", 

где XX -код ошибки, а N — номер строки, в котором она обнаружена.

После сообщения об ошибке появляется символ „>“, означающий, что интерпретатор готов к приему директив, и программист может внести изменения в программу и продолжить отладку.

Рассмотрим, какие ошибки обнаруживает интерпретатор.

  • Ошибка 01. В программе встретился оператор '''NEXT''', для которого не был выполнен соответствующий оператор '''FOR'''.
  • Ошибка 02. Неверный синтаксис.
  • Ошибка 03. В программе встретился оператор '''RETURN''' без предварительного выполнения оператора '''GOSUB'''.
  • Ошибка 04. При выполнении программы не хватает данных для оператора '''READ'''. то есть данных, описанных операторами '''DATA''' меньше, чем переменных в операторах '''READ.'''
  • Ошибка 05. Аргумент функции не соответствует области определения данной функции. Например, отрицательный или нулевой аргумент функции '''LOG(X)''', отрицательный аргумент у функции '''SQR(X)''' ит.д.
  • Ошибка 06. Переполнение при выполнении арифметических операций Результат любой операции не может быть больше +1,71035 или меньше −1,71035.
  • Ошибка 07. Недостаточен объем памяти. Возможные причины: ** велик текст программы: ** слишком длинны массивы данных: ** вложенность подпрограмм и циклов больше нормы; ** слишком много переменных.
  • Ошибка 08. Нет строки с данным номером. Возникает при выполнении операторов перехода.
  • Ошибка 09. Индекс не соответствует размерности массива.
  • Ошибка 10. Повторное выполнение операторов '''DIM''' или '''DEF''', описывающих массив или функцию, которые уже были описаны ранее.
  • Ошибка 11. Деление на ноль.
  • Ошибка 12. Попытка выполнить операторы '''INPUT''' или '''DEP''' в непосредственном режиме.
  • Ошибка 13. Несоответствие типов данных. Возникает при попытке символьной переменной присвоить числовое значение и наоборот.
  • Ошибка 14. Переполнение буферной области памяти, отведенной для хранения символьных переменных. Для расширения объема буфера служит директива '''CLEAR'''.
  • Ошибка 15. Длина символьной переменной превышает 255.
  • Ошибка 16. Выражение, содержащее символьные переменные, слишком сложно для интерпретатора.
  • Ошибка 17. Невозможность продолжения выполнения программы по директиве '''CONT'''.
  • Ошибка 18. Обращение к функции, не описанной оператором '''DEF.'''

Кроме описанных, интерпретатор выдает еще три сообщения об ошибках в случае неверного набора данных при выполнении оператора '''INPUT:'''

  • „ПОВТОРИТЕ ВВОД“ — указывает на ошибку в наборе данных. Вместо числа набрана строка символов и наоборот.
  • ? ЛИШНИЕ ДАННЫЕ» — дачных набрано больше, чем переменных в операторе '''INPUT'''. Лишние данные просто игнорируются.

  • ???" — данных набрано меньше, чем переменных в операторе INPUT. Необходимо ввести недостающие данные.

В дальнейшем предполагается опубликовать несколько программ. Их анализ поможет Вам разобраться в методике написания программ на языке Бейсик.

Г. ЗЕЛЕНКО. В. ПАНОВ, С. ПОПОВ

г. Москва

Отсканировано с журнала Радио №3 1985г.

Отредактировано Лесных Ю. И. 1999 г.