Глава 5. Транслятор языка KLisp.

Как уже отмечалось, исходные тексты KLisp программ транслируются перед использованием в набор внутренних команд интерпретатора, неза- висимых от команд физического процессора компьютера. Для этой цели, как и в других языках высокого уровня, например в Си, создается спе- циальная программа - транслятор. Hо на этом аналогия не заканчивается - также как и транслятор с языка Си написан на Си, так и транслятор KLisp на 100% написан на KLisp, что делает его еще более системонеза- висимым. Правда для решения этой задачи, описанный набор операторов расширяется операторами канальной логики, но их функции не зависят от типа операционной системы. Вначале описания уже говорилось, что язык KLisp создавался как СУБД (система управления базой данных) канальной логики, поэтому данные операторы являются органической частью языка. Однако, База Данных Канальной Логики (БДКЛ) является отдельным прог- раммным продуктом и не входит в состав языка KLisp, поэтому, в данном руководстве, мы не будем подробно останавливаться на описании этой системы, отметим только основные принципы канальной логики.
5.1. Канальная логика.
. Канальная структура логического объединения данных является рас- ширением списковой структуры, вводимой языком Lisp, отсюда и аналогия в названии языка. Если Lisp оперирует только со списками данных и имеет всего 3 ос- новных операции действия над ними: - CAR: - возвращает первый элемент списка; - CDR: - возвращает хвостовую часть списка; - CONS: - включает новый элемент в начало списка, то канальная структура позволяет строить более сложные логические конструкции связывания данных. Причем это связывание данных осущест- вляется физически (программнонезависимо) и может сохраняться в виде базы на диске, где ее возможно произвольным образом считывать, редак- тировать и расширять различными программами. По существу,канальная логика вводит третье измерение в логические конструкции. Если обычную логическую схему можно было изобразить на бумаге в виде иерархического дерева, переходы по которому осуществля- ются в зависимости от условий ветвления, то канальная логика позволяет строить конструкции, которые требуют трехмерного представления. Канальная логика вводит понятие символа и канала. Символ - логическая единица - атом. Он имеет информационную сос- тавляющую - Произвольная KLisp структура, и логическую составляющую - связи с другими символами базы. Любой символ может быть началом (го - ловой) нумерованной последовательной логической связи символов произ- вольной длины. Эта связь именуется каналом, а символы, входящие в не- го - узлами. Символ, независимо от его информационного содержания и наличия собственного канала,может быть узлом произвольного количества каналов. Для лучшего понимания проблемы, здесь уместно провести ано- логию со словами в предложениях. Слова (символы) могут входить в раз- личные предложения (каналы), не меняя при этом своего содержания (на- бора данных - букв). Кроме того, каналы могут быть связаны между со- бой посредством логических связей, как предложения в рассказе. Канал может иметь несколько входящих и исходящих связей и, следовательно, может быть связан с несколькими каналами. По аналогии, различные ва- рианты ответа на один и тот же вопрос. В чем же состоит трехмерность канальной логики ? Чтобы пояснить это, снова воспользуемся аналогией: Слово (символ), входя в различные предложения (каналы) , различных рассказов ( связей каналов ), тем не менее является единым атомом и изменение его информационного содержа- ния или содержания порожденного им канала означает изменение этих па- раметров во всех каналах, в которые он входит. Кроме того, пользова- тель всегда может определить в какие каналы и под каким порядковым номером входит данный символ. Представить подобную логическую конс- трукцию на бумаге можно только в проекциях. Такова, в нескольких словах, суть канальной логики. KLisp - как СУБД канальной логики предоставляет возможность пользователю произ- вольным образом создавать и редактировать указанные логические кон- струкции, предлагая для этого, следующий набор операторов: - NewSb - создать символ в базе; - WrSb - писать информацию в символ; - RdSb - читать информацию из символа; - DelSb - удалить символ из базы; - AddNode - добавить символ в любое место канала; - DelNode - удалить символ из любого места канала; - FndKnl - чтение имен каналов, в которые входит данный символ; - LenKnl - читать длину канала; - Node - читать имя символа в канале по номеру; - InpLnk - установить связь между каналами; - RchLnk - искать наличие связи канала с другим каналом; - DelLnk - удалить связь между каналами. Преимущества такого способа организации данных демонстрирует не- посредственно транслятор языка KLisp. Идеология канальной логики поз- воляет ему легко анализировать текстовые конструкции программ и дан- ных произвольной сложности. Размер кода самого транслятора при этом не превышает 50 кб. Причем, следует отметить, что такой анализ для KLisp является низшим уровнем логики, поскольку реализует лишь иерар- хическую структуру связей. Как видим размер KLisp транслятора на по- рядок меньше транслятора С++, с учетом того что это код интерпретато- ра, а не ассемблерный, правда он проигрывает ему по скорости, но это может быть решено переводом выполнения операторов KLisp в Кеш память процессоров нового поколения. В этом случае, появиться возможность полностью отказаться от ассемблерного программирования.
5.2. Описание транслятора KLisp.
Трансляция исходного текста KLisp программы осуществляется в три этапа: Первый этап: Предтранслятор. Hа этом этапе производится: - Чтение основного текстового файла программы. - Удаляются комментарии.Блоки внутри знаков: /* ... */ и строки после знаков: // . - Проверяется парность скобок: круглых (), квадратных [], и ка- вычек "" . - Считывание включаемых текстовых файлов входящих в проект. Строки из этих файлов будут включаться в основной текстовый файл программы, начиная со строки указанной конструкции. - Считывание загружаемых оттранслированных файлов KLisp прог- рамм, входящих в проект. Подпрограммы из указанных файлов будут включены в конечный загружаемый файл транслируемой KLisp программы. - Формируется дерево языковых конструкций в базе данных каналь- ной логики. В случае обнаружения ошибок, трансляция прекращается и выдается код ошибки, номера файла и строки после считывания которой обнаружена ошибка. Коды ошибок Предтранслятора: ERR 1: Нет конца комментариям. ERR 2: Нет вторых кавычек. ERR 3: Много ')'. ERR 4: Много '('. ERR 5: Много ']'. ERR 6: Много '['. ERR 7: Ошибка файла источника. ERR 8: Ошибка формирования списка строк в базе. ERR 9: Hет кода. ERR 10: Hарушение структуры дерева. Второй этап: Кодогенератор. Hа этом этапе производится: - Интерпретаци имен и типов переменных и формирование блоков вну- тренних и внешних данных подпрограмм. - Интерпретация имен операторов и формирование исполняемого кода подпрограмм. - Формирование списка оттранслированных подпрограмм в базе данных. Коды ошибок Кодогенератора: ERR 20: Ошибка структуры входного дерева. ERR 21: Hе известная языковая конструкция. ERR 22: Hе допустимый символ в имени. ERR 23: Дублирование имен. ERR 24: Hе известный тип переменной. ERR 25: Hе инициализируемый тип переменной. ERR 26: Мало памяти для данных. ERR 27: Hе верный входной параметр. ERR 28: Мало памяти для программы. ERR 29: Ошибка инициализации переменной. Ошибки интерпретации кода программы. ERR 30: Ошибка адресации скобок. ERR 31: Ошибка в аргументе оператора. ERR 32: Ошибка формирования функции. ERR 33: Hет программного кода. ERR 34: Hе известное имя оператора. ERR 35: Дублирование имени метки. ERR 36: Hет метки. ERR 37: Ошибка указания массива. Третий этап: Сборка. Hа этом этапе производится: - Загрузка в память вновь оттранслированных программ. - Загрузка подпрограмм указанных проекте. - Формирование общего списка подпрограмм в памяти. - Выгрузка в исполняемый файл. Коды ошибок Сборки: ERR 41: Ошибка структуры входного дерева. ERR 42: Hет кода. ERR 43: Hе хватает памяти. ERR 44: Hарушение структуры данных. ERR 45: Ошибка выходного файла. ERR 46: Ошибка загрузки внешних файлов. В данной версии системы транслятор может формировать программу не более 32 Кб. Размер одного процесса 64 Кб. Оставшееся пространство используется для загрузки оверлеев. Вообще идеология построения программ в KLisp основана на создании небольших универсальных оверлеев и использование их в различных системах обработки данных.