ЯЗЫК ПРОГРАММИРОВАНИЯ AZ

	1. Назначение языка
	2. Общая характеристика языка
	3. Пример простой программы
	4. Особенности языка
	5. Перечень команд языка

	Торговля языком не ведется, и с вопросами его приобретения
просьба не обращаться. Хотя AZ появился из самых что ни на есть
практических нужд, но в данной статье он рассматривается с
теоретической стороны и то очень кратко, чтобы пояснить, каким
образом появились программы и системы с рекордными характеристиками.

			  1. Назначение языка

	AZ - язык общего назначения. В свое время его можно было
считать языком высокого уровня, но в море современного сервиса его
уже следует считать языком низкого уровня. С одним AZ мощную
производственную систему, конечно, не сделать (как без знания хороших
алгоритмов не решить сложных задач, без знания кратчайших путей
преобразования информации можно не браться за оптимизацию программ).
Но на AZ написана оболочка, которая, например, позволяет как из
кубиков быстро собирать сложные СУБД, выпускающие тысячи документов
и умещающиеся в микроскопическом объеме.

	При разработке языка AZ в первую очередь преследовалась цель:
компактность создаваемых загрузочных модулей. Однако это не единствен-
ная цель. И если ею ограничиться, то ничего путного не получилось бы.
	Любой программист напомнит, что выигрыш в одном  направлении,
скажем, в скорости, неизбежно ведет к потерям по другим  показателям,
например, к потребности в большей памяти. Однако в случае с AZ значи-
тельные достижения по линии компактности позволили, наоборот, сделать
компактность ключем для резкого улучшения других показателей.
	Когда объем программы снижается не в 2 - 3 , а в 100 или даже
в 1000 раз, когда сложные системы из десятков тысяч операторов  могут
быть размещены в небольшом COM-файле, то это уже не просто уменьшение
объема, а иное устройство загрузочного модуля, при котором, в частности,
полностью исключаются межсегментные переходы и обращения, не произво-
дятся бесконечные переключения сегментных регистров. Здесь появляется
поле для применения ряда других технических приемов. В результате
резко повышается быстродействие программ.
	Если ваша программа из исходного  текста  в  10000  операторов
переводится в загрузочный модуль за 1 секунду, то это не просто  уско-
рение работы, а другой уровень  создания  и  отладки  программ,  когда
нередко  можно писать программу без предварительных расчетов, трансли-
ровать и проверять ее чуть ли не после каждого написанного оператора.
	Компактность программ - это экономия места в оперативной памя-
ти и на диске, это ускорение копирования и  загрузки,  это  сокращение
поля  деятельности  для  вирусов  и  быстрое  тестирование, это  общее
повышение надежности. Если транслятор или программы займут в  100  раз
меньше места на носителе, то во столько же раз меньше  вероятность  их
пересечения со сбойным участком, во столько же раз больше  вы  сможете
записать на дискету разных программ. С  помощью  AZ  можно переделать,
например, трансляторы других языков. Улучшение показателей не требует
здесь дорогостоящего оборудования и новых производственных технологий,
а достигается исключительно за счет рационального использования
имеющихся ресурсов.
	Кто предпочитает не замечать  этих  очевидных  преимуществ  и
считает, что все проблемы могут быть решены наращиванием  памяти  ЭВМ,
тот может не утруждать себя дальнейшим чтением.

	Другая насущная задача: избавить себя от ошибок существующих
трансляторов языков. Разумеется, новый язык - это и новый источник
ошибок. Но одно дело, когда устройство транслятора не известно и не
обозримо, а разработчик находится за океаном. И совсем другое дело,
когда текст транслятора умещается на нескольких страницах, и все
недоработки могут быть моментально исправлены. Не напихать как можно
больше команд, а, наоборот, выделить круг наиболее эффективных и
употребительных операций - таким создавался AZ.

		     2. Общая характеристика языка		

	Язык имеет команды по операциям с экраном, мышью, с динамиком,
по графике, по вызову из одной программы  других  программ,  по работе
с массивами и др., - всего  86 команд.
	AZ не нуждается в привлечении ассемблера. Одни и те же функции
в нем могут быть реализованы разными средствами. Сначала программу можно
написать и отладить на "высоком уровне", потом при надобности заменить
некоторые команды на машинные. AZ специально рассчитан на естественную
замену операторов без организации излишних преобразований и подпрограмм,
а также на подключение новых или нестандартных операций.
	AZ создает только СОМ-файлы,  объем  которых  ограничен  64 КБ.
Этого хватает на программу до 20000 операторов,  что вполне достаточно
для размещения сложнейших систем. В крайнем случае можно сделать
несколько модулей.
	Создаваемые программы ограничиваются стандартной памятью и
работают только в реальном режиме, а все за 1 МБ оставляют операционной
системе и системным программам, которые могут распорядиться этим
ресурсом рациональнее. Опыт создания СУБД и переработки больших объемов
информации показал, что ограничение области активных действий 64
килобайтами часто ведет к наиболее быстрым и компактным программам.
В спорных случаях насчет удобств мы предлагаем исходить из качеств
конечного продукта. Удобства для программиста - это не самоцель, а
лишь одно из средств для достижения удобной работы пользователя.
	Транслятор создает загрузочный модуль прямо из текста
программы. Объектные модули вообще не используются.
	Транслятор состоит из одного COM-файла объемом 5 KБ, не обра-
щается ни к каким библиотекам и использует не более  192 КБ  памяти.
Транслятор написан на самом AZ. Зарегистрирован в РосАПО в 1994г.

		     3. Пример простой программы

	Хотя описание по объему не идет ни в какое сравнение с
описаниями распространенных языков, оно все же великовато для статьи.
И далее рассматриваются в основном отличительные особенности AZ.
Впрочем, эти особенности не претендуют на новизну или уникальность.
Тем не менее, их удачная комбинация образовала инструмент, который
позволил полностью исключить использование других языков в очень
широком круге практических задач.

	Чтобы не ограничиваться словами, далее приведен пример
реальной программы, запрашивающей пароль. Этот пример вовсе не
отражает преимуществ AZ, а скорее показывает его приверженность
простым общеизвестным конструкциям.
	CLOG
	TEB 35,9,30,'  ПАРОЛЬ:  '
	KEY
	C(0)=
	KEY
	C(2)=
	I B(1),JE,59 I B(3),JE,68 G 2
1	TEB 35,9,78,'  НЕВЕРНО  '
	SOU 5000,200
;	G 1
2	END
	Здесь команда CLOG очищает экран (вообще ее назначение: переход
из графического режима в текстовый).  Следующая команда выводит текст в
апострофах на экран в строку 9, начиная с колонки 35,  желтым цветом на
синем фоне (30=1*16+14, 1 - синий, 14 - желтый). Команда KEY ждет нажа-
тия клавиши. Код и скэн-код клавиши поступают в двубайтовое слово C(0),
которое содержит байты B(0) и B(1).   Команда I  проверяет,  что первой
была нажата клавиша F1 (скэн-код 59), а второй - F10  (скэн-код 68).  В
этом случае оператор G передает управление  на  метку  2,  и  программа
завершает работу. Иначе желтым цветом на красном фоне пишется "НЕВЕРНО"
(78=4*16+14, 4 - красный). Необязательный оператор SOU подаст  звуковой
сигнал. Строка с оператором  G 1  закомментирована  (см. на ";")  и  не
вызывает никаких действий. Если убрать точку с запятой, то при неверном
наборе пароля произойдет зацикливание (возможны и другие наказания).

			4. Особенности языка

	Как и во всяком языке, в AZ могут использоваться разные формулы
типа A=B+C/D и т.д. Однако операции в выражениях выполняются не по
старшинству, а в порядке записи. Но если в выражении есть квадратные
скобки (допустимы многоэтажные вложения), то в первую очередь выполняются
действия в скобках. Таким образом, на сложность выражений нет ощутимых
ограничений.

	AZ не требует предварительного описания переменных, и текст
программы может начинаться непосредственно с выполняемых операторов.
Типы переменных задаются по умолчанию. Целая однобайтовая переменная
имеет вид:
			B(выражение)
целая 4-байтовая:
			D(выражение)
вещественная 4-байтовая:
			R(выражение)
вещественная 8-байтовая:
			S(выражение)
текстовая:
	T(выражение) или T(выражение 1, выражение 2)
Целые двубайтовые переменные являются основным объектом операций. Для
них допустима форма: C(выражение). Любой набор символов без скобок
и знаков действий, если он стоит на месте операнда, также по умолчанию
считается целой двубайтовой переменной. Например: ABC=200

	Написанная на AZ программа представляет в машинных кодах  СОМ-
файл и загружается системой в начало свободной  памяти.  Первые  65536
байтов AZ отводит на собственно коды программы и на стек (в конце этого
сегмента). Следующие 65536 байтов отводятся под данные, доступные
пользователю через переменные B(...), C(...), D(...), R(...),  S(...),
T(...). В(0) - начало этой области, В(-1) (допустимо также В(65535) -
ее конец. В(0) совпадает с Т(0) и является младшим байтом переменных
С(0), D(0), R(0), S(0). B(1) - старший байт переменной С(0) и
одновременно младший переменной С(1). Аналогично С(0) - младшее слово
переменных D(0), R(0), S(0). Вообще, В(i) - младший байт переменных
C(i), D(i), R(i), S(i).
	Остальная память свободна, обмен с ней ведется специальными
командами или переключением сегментных регистров.

	Первый попавшийся в тексте программы оператор ЕND означает
конец управляющей части. За ним может следовать описание подпрограммы,
начинающейся со знака подчеркивания и оканчивающееся также END. Затем
- другая подпрограмма и т.д. Подпрограмма может иметь несколько входов.
	Каждая метка и каждая двубайтовая переменная-имя действуют
только внутри своей подпрограммы (или управляющей части).  В  отличие
от этого переменные B(...), C(...), D(...), R(...), S(...), T(...),
T(...,...) являются глобальными.
	Вход в подпрограмму осуществляется, как правило, по операторам
С  или  B  .     Подпрограмма в свою очередь может обращаться к другой
подпрограмме и т.д.  При каждом обращении  по   C   значение   первого
аргумента автоматически поступает в регистр АХ, второго - в СХ, 3 - DX,
4 - BP, 5 - SI, 6 - DI. При обращении по  B   -  в AL, AH, CL, CH, DL,
DH, BL, BH.  Подпрограмма начинает работу с обратной  записи AX в свой
первый аргумент и т.д. по количеству аргументов, которых не может быть
больше шести. При вызове подпрограммы стек автоматически  наращивается
на 2 байта, в которые пишется адрес возврата; а по окончании ее работы
стек также автоматически укорачивается на 2 байта. Пример:
	C PP 20,30
	TXT C(20)
	END
	_ PP I,J
	C(I)=J/10
	END
Здесь подпрограмма РР записывает в С(20) число 3.
	Все параметры подпрограмм являются входными (это не  относится
к командам языка AZ). Возвращать результаты подпрограмма  может  через
основной массив и регистры. Для этой цели на вход можно подать  адрес,
по которому подпрограмма пошлет результат. Есть и другие способы вызова
подпрограмм, позволяющие и далее сокращать машинные коды.
	Почти во всех командах языка аргументы можно не указывать в
явном виде, если данные уже находятся в нужных регистрах.
	Вообще, для работы на AZ вовсе не обязательно знать о
регистрах, стеке и т.п. Но при желании регистры можно явно использовать
(с некоторыми ограничениями) в выражениях наряду с другими переменными.
Важно отметить, что транслятор по своей инициативе не передает
информацию в регистрах от оператора к оператору. Так что между любой
парой команд программист может вставить новые операции, в частности, с
регистрами.

	По умолчанию каждый вызов подпрограммы (не считая засылки
аргументов) занимает 3 байта (это код 232 и двубайтовое смещение). По
специальному указанию вызовы внутренних подпрограмм языка станут
двубайтовыми. Можно также указать список подпрограмм, вызовы к которым
станут двубайтовыми. Тогда транслятор от каждого вызова помещает в
загрузочный модуль код 204 и номер подпрограммы. Выигрыш в объеме
загрузочного модуля дают только те подпрограммы, к которым обращаются
не менее 3 раз (выигрыш = количество вызовов минус 2). Еще надо вычесть
объем блока, создающего этот эффект (44 байта). 

	AZ позволяет присваивать программам или их фрагментам имена и
далее для групп операторов указывать списки программ, куда эти операторы
надо включить транслятору. Это позволяет иметь единый исходный текст для
разных (но схожих) программ.

			5. Перечень команд языка

	AZ имеет массу других особенностей, которые, конечно, не
являются революционными и, может быть, даже вообще не бросаются в глаза.
Но каждая деталь языка, вплоть до длины ключевых слов, тщательно
вылизана и занимает однозначное место в общей конструкции. Возможно,
какое-то представление о деталях даст нижеследующий перечень команд
языка AZ.
	#  - прямое внесение кодов в загрузочный модуль
	%  - сравнение регистра AL
	A - вызов подпрограммы с байтовыми числовыми аргументами
	AA - вызов подпрограммы с двубайтовыми числовыми аргументами
	ABS - абсолютное значение
	ADR - адрес переменной
	AND - логическое "И"
	ATAN - арктангенс
	B - вызов подпрограммы с байтовыми аргументами
	C - вызов подпрограммы
	CLOF - закрыть файл
	CLOG - закрыть графику
	CLOM - убрать маркер мыши
	COS - косинус
	CURS - установка курсора
	DTB - занесение байтовых и текстовых данных в загруз.модуль
	DTC, DTD, DTR, DTS - аналоги для др.видов данных
	DEC - декремент
	DELF - удаление файла
	END - конец управляющей части или подпрограммы
	EXP - возведение в степень
	DAT - получение даты
	G - передача управления на метку
	G+  - передача управления по параметру на метку
	G-  - передача управления по параметру на метку с возвратом
	G/  - передача управления по параметру на подпрограмму
	I - оператор условия
	INC - инкремент
	INDF - управление файловым указателем
	JA,AE,JB,BE,JG,GE,JE,JL,LE,NE - условные передачи управления
	CX, LO - передачи управления по состоянию регистра CX
	KEX - получение кода с клавиатуры без ожидания
	KEY - то же с ожиданием
	KXYM - получение состояния клавиш и координат мыши
	LIN - рисование линии в графическом режиме
	LOG - логарифм
	L - оператор цикла
	MAKF - создание файла
	MAX - максимум
	MIN - минимум
	MMB - перемещение данных по любым областям памяти
	M - перемещение в основном массиве
	OPEF - открыть файл
	OPEG - открыть графику
	OPEM - показать маркер мыши
	OR - логическое "ИЛИ"
	OUTP - вывод текста из основного массива на принтер
	P - прибавление второго операнда к первому
	PAG - запись страницы на страницу
	PPP - закрашивание прямоугольника
	PROG - вызов другой программы
	READ - чтение текстового файла
	REAF - чтение файла
	RENF - переименование файла
	RET - выход из подпрограммы
	SCAB - побайтное сравнение строки с заданным байтом
	SCAW - аналогично для слов
	SBNE, SWNE - сравнение при неравенстве
	SETM - установка маркера мыши
	SIN - синус
	SOU - звук
	SQRT - квадратный корень
	STOP - выход из произвольного места программы
	STOB - заполнение области одними и теми же знаками
	STOW - аналогична STOB, но пишет словами
	S - вычитание 2-го аргумента из 1-го
	TEA - запрос (цветной) строки с клавиатуры с отображ.на экране
	TEB - вывод цветного текста на экран
	TEG - текст в графич.режиме
	TIM - получение времени
	TXT - вывод на экран текстов и чисел в текстовой форме.
	V - сравнение переменных
	W - сравнение строк побайтное
	WRIF - запись в файл
	_  - объявление подпрограммы
		Еще раз подчеркнем, что здесь собран минимальный
комплект команд, на основе которого уже можно строить операторы более
высоких уровней. Да и из этого набора достаточно десятка команд, чтобы
уже начать писать несложные программки.

                                                      Невесенко Н.В.
                                                   6 декабря 2002 г.

                         © 2002 Suncloud.Ru