Запись развертываемого кода MATLAB

Пакетные приложения не обрабатывают файлы MATLAB во время выполнения

Компилятор защищает ваш код от несанкционированных изменений. Развертываемый MATLAB® файлы приостанавливаются или замораживаются во время компиляции. Это не означает, что вы не можете развернуть гибкое приложение - это означает, что вы должны проектировать свое приложение с учетом гибкости. Если необходимо, чтобы конечный пользователь мог выбирать между двумя различными методами, например, оба метода должны быть доступны в развертываемом архиве.

MATLAB Runtime работает только с кодом MATLAB, который был зашифрован при построении развертываемого архива. Любая функция или процесс, который динамически генерирует новый код MATLAB, не будет работать против MATLAB Runtime.

Некоторые тулбоксы MATLAB, такие как продукт Deep Learning Toolbox™, генерируют код MATLAB динамически. Поскольку MATLAB Runtime выполняет только зашифрованные файлы MATLAB, а Deep Learning Toolbox генерирует незашифрованные файлы MATLAB, некоторые функции в Deep Learning Toolbox не могут быть развернуты.

Точно так же не могут быть развернуты функции, которым необходимо изучить содержимое файла функции MATLAB. HELPдля примера является динамическим и недоступным в развернутом режиме. Можно использовать LOADLIBRARY в развернутом режиме, если вы предоставляете ему прототип функции MATLAB.

Вместо компиляции функции, которая генерирует код MATLAB и пытается его развернуть, выполните следующие задачи:

  1. Запустите код один раз в MATLAB, чтобы получить вашу сгенерированную функцию.

  2. Упакуйте код MATLAB, включая сгенерированную функцию.

Совет

Еще одна альтернатива использованию EVAL или FEVAL использует указатели анонимных функций.

Если требуется возможность создания кода MATLAB для динамической обработки во время выполнения, конечные пользователи должны иметь установленную копию MATLAB.

Не полагайтесь на изменение директории или пути для управления выполнением файлов MATLAB

В целом, надлежащие методики программирования рекомендуют не перенаправлять путь поиска файлов программы динамически в коде. Многие разработчики склонны к такому поведению, поскольку оно имитирует действия, которые они обычно выполняют в командной строке. Однако это может привести к проблемам при развертывании кода.

Для примера в развернутом приложении MATLAB и Java® пути являются фиксированными и не могут меняться. Поэтому любая попытка изменить эти пути (используя cd команда или addpath команда) завершается неуспешно.

Если вы найдете, вы не можете избежать размещения addpath вызовы в коде MATLAB, используйте ismcc и isdeployed. Для получения дополнительной информации см. раздел Использование функций isdeplaced для выполнения специфичных для развертывания путей кода.

Используйте функции isdeployed для выполнения специфичных для развертывания путей кода

isdeployed функция позволяет вам указать, какой фрагмент вашего кода MATLAB развёртывается, а какая нет. Такая спецификация минимизирует ваши ошибки компиляции и помогает создать более эффективный, ремонтируемый код.

Например, вы считаете неизбежным использовать addpath при написании startup.m. Используя ismcc и isdeployed, вы задаете, когда и что упаковано и выполнено.

if ~(ismcc || isdeployed)
    addpath(mypath);
end

Постепенно рефакторируйте приложения, которые зависят от некомпилируемых функций

Со временем рефактор, поток и модуляризация кода MATLAB, содержащего некомпилируемые или не развертываемые функции, которые используют isdeployed. Ваша конечная цель - «изящное ухудшение» неразмещаемого кода. Другими словами, код должен представлять конечному пользователю как можно меньше препятствий для развертывания, пока он не будет практически устранен.

Разделите код на секции кода во время проектирования и во время выполнения:

  • Design-time code код, который в настоящее время развивается. Почти весь код проходит фазу вечной перезаписи, отладки и оптимизации. В некоторых тулбоксах, таких как продукт Deep Learning Toolbox, код проходит период самообучения, так как реагирует на различные сочетания данных и шаблоны. Такой код почти никогда не предназначен для развертывания.

  • Run-time code, с другой стороны, затвердел или стал стабильным - он находится в законченном состоянии и готов к развертыванию конечным пользователем.

Рассмотрите создание отдельной директории для кода, который не предназначен для развертывания, или для кода, который вызывает неработаемый код.

Не создавать и не использовать непостоянные переменные статического состояния

Избегайте использования следующего:

  • Глобальные переменные в коде MATLAB

  • Статические переменные в файлах MEX

  • Статические переменные в коде Java

Состояние этих переменных является постоянным и разделяется со всем в процессе.

При развертывании приложений использование стойких переменных может вызвать проблемы, поскольку процесс MATLAB Runtime запускается в одном потоке. Вы не можете загрузить больше чем одну из этих непостоянных статических переменных в один процесс. В сложение эти статические переменные плохо работают в многопоточных приложениях.

При программировании против упакованного кода MATLAB вы должны знать, что для каждого образца нового класса создается образец MATLAB Runtime. Если тот же класс создается снова с использованием другого имени переменной, он присоединяется к образцу среды MATLAB Runtime, созданному предыдущим образцом того же класса. Короче говоря, если сборка содержит n уникальных классов, будет создано максимум n образцов среды MATLAB Runtime, каждый из которых соответствует одному или нескольким образцам одного из классов.

Если необходимо использовать статические переменные, привязайте их к образцам. Например, определение переменных образца в классе Java предпочтительнее, чем определение переменной как static.

Получите правильные лицензии на функциональность тулбокса, которую вы хотите развернуть

У вас должен быть действительный MathWorks® лицензия для тулбоксов, используемых для создания развертываемого кода MATLAB.

См. также

|

Похожие темы