Интерпретатор
Интерпретатором является сама программа IxBase. Размер программы составляет порядка 460Кб. Код скомпилирован в 1993 г. При компиляции использован стандартный набор функций CLIPPER 5.1. Это было сделано в расчёте на то, что в будущем возможна миграция на другую программную платформу или операционную систему. Использование стандартных функций даёт больше шансов для такой операции.
Для полной гармонии и согласованности с операционной системой и оконным режимом работы программы подключена библиотека CT2. Эта библиотека формирует пользовательский интерфейс с использованием окон.
Используется библиотека SIX для работы с индексами типа *.CDX. Этот индекс хорош тем, что очень быстр и создает только один физический файл на диске. Иногда это очень удобно, например, для проектов, где задействовано большое количество таблиц. Каждая таблица – это два файла. Операционная система имеет ограничение на количество открываемых файлов. Для операционной системы ДОС это значение по умолчанию равно 20, то есть одновременно можно открыть двадцать файлов, или десять таблиц.
Для работы с текстовыми файлами используется библиотека NANFOR. Очень часто приходится экспортировать и импортировать данные в текстовом формате. Самым универсальным в этом смысле является текстовый файл. Для такого рода шлюзования необходим удобный инструмент. Идеально, чтобы он напоминал способ работы системы управления таблицами. Все это предоставляют функции библиотеки NANFOR. К текстовому файлу можно обращаться как к таблице, используя аналогичные функции навигации.
В рамках данного проекта организован специальный посредник работы с итераторами таблиц и массивов. Итераторы – это специальные функции, которые выполняют определённый набор операций для каждой записи таблицы. Итераторы в качестве аргументов требуют блоков кода, например:
dbEval ({|| F:=FieldGet (1)}, {||.t.}, {||.t.})
где dbEval – итератор таблицы;
{||.t.} – блок кода;
FieldGet (1) – операция для текущей записи;
aEval (A:=aArray (10), {| i,x | P1:=x})
где aEval – итератор массива.
Однако в системе управления базами данных CLIPPER версии 5.1 вызов блока кода из блока кода недопустим (этот недостаток ликвидирован в системе xHarbour)
eval (eval ({||.t.}))
поэтому необходим посредник, с помощью которого блок кода можно передать в виде строки, например
stEval (» F:=FieldGet (1)»,». t.»,». t.»)
где stEval – итератор для текущей записи;
«.t. " – блок кода в виде строки;
FieldGet (1) – операция для текущей записи;
asEval (A:=aArray (10), " P1:=x»)
где asEval – итератор массива.
Движок блоков кода
Сами по себе блоки кода – потрясающее достижение в программировании. Продолжение развития этой идеи, блоков кода (тримплетты) и виртуальной машины мы видим и в технологии Java. Блоки кода повсеместно используются в исходном тексте рассматриваемой программы. Это стало стилем программирования и элементом, позволяющим перенести часть исходного кода из компилируемой части программы в базу данных. Блоки кода позволяют строить очень изящные конструкции. Уменьшается объём исходного кода, повышается функциональность и выразительность программного кода.
Блоки кода можно хранить в базе данных в виде строк. С другой стороны, блоки кода можно хранить в массиве в скомпилированном виде, готовом для немедленного использования. Эти и другие свойства блоков кода дают возможность построить очень простой и эффективный движок блоков кода системы IxBase.
Напомним, что представляет собой блок кода. Блок кода – это безымянная функция. Синтаксис этой функции следующий:
{| a1,a2 |.t.}