Приложения, реализованные с MATLAB® Compiler SDK™ и MATLAB Production Server™ получают доступ к коду MATLAB через API, сгенерированные из функций MATLAB. Весь код 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 и пытается его развернуть, выполните следующие задачи:
Запустите код один раз в MATLAB, чтобы получить вашу сгенерированную функцию.
Упакуйте код MATLAB, включая сгенерированную функцию.
Совет
Еще одна альтернатива использованию EVAL
или FEVAL
использует указатели анонимных функций.
Если требуется возможность создания кода MATLAB для динамической обработки во время выполнения, конечные пользователи должны иметь установленную копию MATLAB.
В целом, надлежащие методики программирования рекомендуют не перенаправлять путь поиска файлов программы динамически в коде. Многие разработчики склонны к такому поведению, поскольку оно имитирует действия, которые они обычно выполняют в командной строке. Однако это может привести к проблемам при развертывании кода.
Для примера в развернутом приложении MATLAB и Java® пути являются фиксированными и не могут меняться. Поэтому любая попытка изменить эти пути (используя cd
команда или addpath
команда) завершается неуспешно.
Если вы найдете, вы не можете избежать размещения addpath
вызовы в коде MATLAB, используйте ismcc
и isdeployed
. Для получения дополнительной информации см. раздел Использование функций isdeplaced для выполнения специфичных для развертывания путей кода.
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.