Разработка интерпретаторов
  • Разработка интерпретаторов
v3.0.3
Search Results for

    Show / Hide Table of Contents

    Рабочий цикл нативного интерпретатора

    Нативный интерпретатор — это библиотека *.dll, собранная на Delphi, C++ или другом языке, который компилируется в машинный код. Ассистент берётся за нативный интерпретатор, только если вы прямо об этом попросили или правите уже существующий нативный интерпретатор; новый интерпретатор по умолчанию создаётся на C# — см. Рабочий цикл .NET.

    Справка по библиотеке — в разделах Программная библиотека интерпретатора, Файл настроек интерпретатора и Интерфейс интерпретатора. Подробности для ассистента — в навыке develop-native-interpreter.

    Что нужно ассистенту

    • Исходники интерпретатора и проект, которым он собирается, — или явная просьба создать новый.
    • Компилятор: RAD Studio для Delphi, компилятор C++ или другой.
    • Объявления интерфейсов SDK. Они приходят пакетами NuGet из того же источника, что и пакет SDK для C# (см. Версии продукта), с той же версией: для Delphi — SprutTechnology.NCInterpreterSDK.bpl.x64 (модули IDL.<Имя>.pas и пакеты *.bpl, *.dcp), для C++ и других языков — SprutTechnology.NCInterpreterSDK.tlb (библиотеки типов *.tlb, заголовки *.h и описания *.idl). Оба пакета подтягивают по пакету на интерфейс, со своими номерами версий: STNCInterpreter, STNCAnalyzer, STNCFormers, STNCCustomInterpreter и STNCConnect (интерфейс защиты, его использует защищённый интерпретатор). Ассистент берёт объявления из них, а не придумывает. Если пакета нужной версии в источнике нет, обратитесь в службу поддержки.
    • Файл *.snci, с которым интерпретатор загружается.

    Что обязательно для библиотеки

    • Библиотека экспортирует две функции: NCT_GetInterface и NCT_FreeMemory. Если хотя бы одной из них нет, продукт библиотеку не загрузит.
    • Строка, которую возвращает GetIdentifier, равна LibraryID в файле *.snci. Оба идентификатора, LibraryID и ID, уникальны.
    • Для текущих продуктов собирается 64-разрядная библиотека, её имя указано в LibraryFileName_x64. 32-разрядная, с именем в LibraryFileName_x32, нужна только для 32-разрядного продукта старой версии.
    • Дочерний интерпретатор получает родителя через SetInterface и вызывает его по правилам наследования интерпретатора.

    Регистры можно задать и в файле *.snci, и в самой библиотеке. Удобнее объявлять их в библиотеке вместе с обработчиками: тогда новое слово — одна строка в списке регистров и один обработчик.

    Цикл

    1. Соберите исходники без изменений и проверьте, что библиотека загружается и моделирует ваши УП. Сохраните результат как исходный.
    2. Перед поиском ошибки в моделировании проверьте экспорт функций, разрядность, идентификаторы и пару *.snci и *.dll: большая часть «не работает» начинается здесь.
    3. Внесите одно небольшое изменение, соберите, прогоните все УП и сравните с предыдущим результатом — см. Проверка и подтверждение результата.
    4. Отлаживайте под отладчиком вашего компилятора, присоединившись к CAM системе или NC Тюнеру, и читайте журнал взаимодействия с интерпретатором.

    Защищённый интерпретатор

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

    Чего не делать

    • Ядро и библиотеки продукта не меняются ради того, чтобы интерпретатор заработал.
    • Особенности реализации на Delphi не считаются частью двоичного интерфейса: в C++ и других языках интерфейс сверяют с библиотекой типов и с работающим интерпретатором.
    • Компиляция — ещё не конец работы: библиотека должна загрузиться и смоделировать ваши программы.
    In this article