Компилятор
Компилятор внутреннего языка программы Инфо-Бухгалтер позволяет значительно ускорить работу настраиваемых документов, по сравнению с интерпретатором. Благодаря этому можно реализовывать на внутреннем языке довольно сложные алгоритмы, необходимые для автоматизации бухгалтерии, складского учета, расчета зарплаты и тому подобное без существенного замедления работы программы.
Также компилятор производит формальную проверку всего написанного текста программы, что исключает досадные опечатки и ошибки, которые могли встречаться в программах для интерпретатора. Поэтому, большинство ошибок удается устранить на этапе разработки документа и конечному пользователю не приходится с ними сталкиваться.
Поддерживается компиляция для бланков, типовых операций и просто фрагментов текста. В последнем случае создаются программы в виде файлов с расширением ibx. Такие программы можно вызвать из меню, внутреннего языка с помощью функции СТАРТ_ПРОГ, а также для настройки бланка.
Принцип работы компилятора.
Компилятор преобразует текст внутреннего языка в бинарный код, который может исполняться Инфо-Бухгалтером. В отличие от компиляторов в машинный код, компилятор Инфо-Бухгалтера создает специальный набор инструкций, которые понимает исполняющий модуль. Иными словами, интерпретация текста программы заменяется на интерпретацию бинарного кода, которая выполняется в десятки раз быстрее.
Компилятор производит разыменование данных - переменных и функций. Для отладки программы предусмотрена возможность хранить в коде имена переменных и функций, а также ссылки на исходный текст. Разыменование данных существенно ускоряет доступ к переменным и функциям. Доступ осуществляется по внутреннему номеру (адресу) переменной или функции, который назначает компилятор. Упаковка данных в линейную структуру позволяет избежать перебора при поиске по номеру. Интерпретатор же производил поиск переменных и функций по имени методом деления пополам.
Разыменование данных не могло не сказаться на индексных переменных, т.к. сама идея их действия была основана на именах. Отныне под именем индексной переменной будем понимать ее префикс. В связи с этим а!001 и а0!01 не одно и то же, как это было раньше, а две разные индексные переменные а и а0. В рамках одной индексной переменной поиск осуществляется по строке индекса методом деления пополам. Поэтому с увеличением количества элементов индексной переменной возрастает время доступа к элементу.
Каждая используемая функция компилируется и хранится отдельным фрагментом в коде. При загрузке кода в память создается шаблон функции, который представляет собой непосредственно откомпилированный код, информацию о локальных переменных, функции и ее результате. При исполнении функции структура локальных переменных строится на основании информации из шаблона. Аналогично создается переменная результата функции. Код функции не компилируется из шаблона - исполняемый экземпляр функции имеет ссылку на этот код и свою текущую позицию в коде. Механизм шаблонов функций был создан для того, чтобы была возможность иметь одновременно в памяти несколько экземпляров одной функции. Такая ситуация возникает при вложенных вызовах и рекурсии. Созданные по шаблону экземпляры функций имеют разные локальные данные и текущую позицию в коде, но один код.
Теперь нарисуем примерную схему откомпилированной программы на языке Инфо-Бухгалтера.
Во-первых, имеется основной код программы. С первой команды этого кода начинается выполнение. Компилятор записывает самыми первыми в основной код команды инициализации общих переменных с заданием начального значения (если таковые имеются в подключенных библиотеках). Далее следует код формульной части.
Во-вторых, имеются структуры общих переменных и общих индексных переменных и шаблонов функций. Доступ к этим структурам имеется в любой точке программы.
В третьих, структуры локальных и локальных индексных переменных, доступные только из основного кода и существующие на протяжении всего времени расчета.
И, наконец, структуры обычных локальных и локальных индексных переменных функций, которые динамически создаются при входе в функцию (по шаблону) и уничтожаются при выходе из функции.
Определения и реквизиты рассматриваются компилятором как внешние данные. В код записывается название определения или реквизита. Если на момент исполнения программы в Инфо-Бухгалтере не задано определения или реквизита с таким названием, то вызывается ошибка времени выполнения.
Определения и реквизиты не являются взаимозаменяемыми, т.е. если на момент компиляции Адрес был реквизитом, а при выполнении Адрес является определением, то так же вызывается ошибка.
В сетевой версии на время расчета все изменения определений и реквизитов производятся в буфере на рабочем месте и лишь после окончания расчета заносятся в базу данных. Таким образом, если с двух рабочих мест запущены программы изменяющие определения и реквизиты, то в результате в базе останутся данные измененные программой, которая закончила работу последней. Вообще говоря, не рекомендуется изменять значения определений и реквизитов средствами внутреннего языка.
Настройка компилятора
Настройка компилятора осуществляется в закладке Документы пункта Установка/Настройки Главного меню:
- Записывать в код отладочную информацию
- Эта опция позволяет сохранить в коде названия переменных и функций, а также ссылки на исходный текст для каждого оператора. Программа с отладочной информацией работает на несколько процентов медленнее, но позволяет при возникновении ошибки времени выполнения узнать ее позицию и перейти в исходный текст на эту позицию.
- Выводить предупреждения компилятора
- Данная опция служит для того, чтобы обратить внимание разработчика бланков на ситуации, формально не являющиеся ошибками, но допустимыми только в том случае, если разработчик создает их умышленно. То есть это дополнительная степень защиты от случайных недоразумений при разработке бланков. Предупреждения выдаются в окно ошибок, но не останавливают процесса компиляции. Иными словами, они являются лишь информацией к размышлению.
- Автоматическое распознавание индексных переменных
- При установке данной опции компилятор пытается автоматически распознать индексные переменные. Однако не всегда возможно правильное распознавание, поэтому рекомендуется явно указывать, что данная переменная является индексной при помощи ! или [].
- Объявлять графы ввода общими переменными
- При компиляции бланка или типовой операции переменные, связанные с графами ввода, объявляются в качестве общих переменных. Это позволяет обращаться к ним из кода библиотечных функций. Если опция не установлена, то переменные граф ввода доступны только из формульного раздела. Подробнее о взаимодействии функций с графами см. Вывод информации при обработке событий и вызове функций.
Для каждого бланка можно задать индивидуальные опции компилятора. Для этого в редакторе бланка надо вызвать пункт контекстного меню Параметры компилятора.