Рабочий цикл нативного интерпретатора
Нативный интерпретатор — это библиотека *.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, и в самой библиотеке. Удобнее объявлять их в библиотеке вместе с обработчиками: тогда новое слово — одна строка в списке регистров и один обработчик.
Цикл
- Соберите исходники без изменений и проверьте, что библиотека загружается и моделирует ваши УП. Сохраните результат как исходный.
- Перед поиском ошибки в моделировании проверьте экспорт функций, разрядность, идентификаторы и пару
*.snciи*.dll: большая часть «не работает» начинается здесь. - Внесите одно небольшое изменение, соберите, прогоните все УП и сравните с предыдущим результатом — см. Проверка и подтверждение результата.
- Отлаживайте под отладчиком вашего компилятора, присоединившись к CAM системе или NC Тюнеру, и читайте журнал взаимодействия с интерпретатором.
Защищённый интерпретатор
Интерпретатор, который проверяет свои данные через интерфейс защиты, описан в разделе Интерпретаторы с защитой. Проверяйте его из контейнера, в котором он будет поставляться: из обычной папки он данных защиты не получает. Без своих данных защищённый интерпретатор должен отказаться моделировать. Как именно он об этом сообщит, решает его автор: ассистент делает так, чтобы интерпретатор выдавал понятное сообщение, но уже существующий может молча давать пустую траекторию — тогда сначала проверьте данные защиты.
Чего не делать
- Ядро и библиотеки продукта не меняются ради того, чтобы интерпретатор заработал.
- Особенности реализации на Delphi не считаются частью двоичного интерфейса: в C++ и других языках интерфейс сверяют с библиотекой типов и с работающим интерпретатором.
- Компиляция — ещё не конец работы: библиотека должна загрузиться и смоделировать ваши программы.