Приложения, реализованные с помощью MATLAB ® Compiler SDK™ и MATLAB Production Server™, получают доступ к коду MATLAB через API, созданные из функций MATLAB. Весь код MATLAB, упакованный для использования в этих приложениях, должен быть записан как функция MATLAB.
Компилятор защищает код от несанкционированных изменений. Развертываемые файлы MATLAB приостанавливаются или замораживаются во время компиляции. Это не означает, что вы не можете развернуть гибкое приложение - это означает, что вы должны разработать приложение с учетом гибкости. Если требуется, чтобы конечный пользователь мог выбирать между двумя различными методами, например, оба метода должны быть доступны в развертываемом архиве.
Среда выполнения MATLAB работает только с кодом MATLAB, который был зашифрован при создании развертываемого архива. Любая функция или процесс, которые динамически генерируют новый код MATLAB, не будут работать в среде выполнения MATLAB.
Некоторые панели инструментов MATLAB, такие как продукт Deep Learning Toolbox™, генерируют код MATLAB динамически. Поскольку среда выполнения MATLAB выполняет только зашифрованные файлы MATLAB, а панель инструментов глубокого обучения создает незашифрованные файлы MATLAB, некоторые функции панели инструментов глубокого обучения не могут быть развернуты.
Аналогичным образом невозможно развернуть функции, которым необходимо проверить содержимое файла функции MATLAB. HELP, например, является динамическим и недоступным в развернутом режиме. Вы можете использовать LOADLIBRARY в развернутом режиме при наличии прототипа функции MATLAB.
Вместо компиляции функции, которая генерирует код MATLAB и пытается его развернуть, выполните следующие задачи:
Выполните код один раз в MATLAB для получения созданной функции.
Упакуйте код MATLAB, включая сгенерированную функцию.
Совет
Другая альтернатива использованию EVAL или FEVAL использует анонимные дескрипторы функций.
Если требуется возможность создания кода MATLAB для динамической обработки во время выполнения, конечные пользователи должны иметь установленную копию MATLAB.
Как правило, оптимальные методы программирования рекомендуют не перенаправлять путь поиска программы динамически в коде. Многие разработчики склонны к такому поведению, поскольку оно имитирует действия, которые они обычно выполняют в командной строке. Однако это может привести к проблемам при развертывании кода.
Например, в развернутом приложении пути MATLAB и Java ® являются фиксированными и не могут изменяться. Поэтому любая попытка изменить эти пути (с помощью cd команды или addpath не удается выполнить команду).
Если вы находите, вы не можете избежать размещения addpath вызовы в коде MATLAB, используйте ismcc и isdeployed. Дополнительные сведения см. в разделе Использование встроенных функций для выполнения путей кода, специфичных для развертывания.
isdeployed функция позволяет указать, какая часть кода MATLAB является развертываемой, а какая нет. Такая спецификация минимизирует ошибки компиляции и помогает создать более эффективный, поддерживаемый код.
Например, использование неизбежно addpath при написании startup.m. Используя ismcc и isdeployed, вы указываете, когда и что упаковано и выполнено.
if ~(ismcc || isdeployed) addpath(mypath); end
С течением времени рефакторизируйте, оптимизируйте и модулируйте код MATLAB, содержащий некомпилируемые или не развертываемые функции, которые используют isdeployed. Ваша конечная цель - «изящная деградация» неразвернутого кода. Другими словами, код должен представлять конечному пользователю как можно меньше препятствий для развертывания до тех пор, пока он практически не будет устранен.
Разбейте код на разделы кода времени разработки и времени выполнения:
Код времени разработки - это код, который в настоящее время развивается. Почти весь код проходит этап постоянной перезаписи, отладки и оптимизации. В некоторых панелях инструментов, таких как продукт Deep Learning Toolbox, код проходит период самостоятельного обучения, так как реагирует на различные перестановки и шаблоны данных. Такой код почти никогда не предназначен для развертывания.
Код времени выполнения, с другой стороны, затвердел или стал стабильным - он находится в готовом состоянии и готов к развертыванию конечным пользователем.
Рассмотрите возможность создания отдельного каталога для кода, который не предназначен для развертывания, или для кода, который вызывает код, не подлежащий развертыванию.
Не используйте следующее:
Глобальные переменные в коде MATLAB
Статические переменные в MEX-файлах
Статические переменные в коде Java
Состояние этих переменных является постоянным и является общим для всего процесса.
При развертывании приложений использование постоянных переменных может вызвать проблемы, поскольку процесс MATLAB Runtime выполняется в одном потоке. В один и тот же процесс нельзя загрузить более одной из этих непостоянных статических переменных. Кроме того, эти статические переменные плохо работают в многопоточных приложениях.
При программировании на основе упакованного кода MATLAB следует учитывать, что экземпляр среды выполнения MATLAB создается для каждого экземпляра нового класса. Если один и тот же класс снова создается с использованием другого имени переменной, он присоединяется к экземпляру среды выполнения MATLAB, созданному предыдущим экземпляром того же класса. Короче говоря, если сборка содержит n уникальных классов, будет создано максимум n экземпляров MATLAB Runtime, каждый из которых соответствует одному или нескольким экземплярам одного из классов.
Если необходимо использовать статические переменные, свяжите их с экземплярами. Например, определение переменных экземпляра в классе Java предпочтительно, чем определение переменной как static.
Необходимо иметь действительную лицензию MathWorks ® для панелей инструментов, используемых для создания развертываемого кода MATLAB.