MATLAB ® Coder™ преобразует и оптимизирует динамически типизированный код MATLAB в статически типизированный код C/C + +. Статически типизированные языки требуют явного объявления типов переменных, и эти типы определяются во время компиляции. Определенные изменения и оптимизации, выполняемые генератором кода, позволяют использовать типы данных и функции MATLAB в сгенерированном коде. Дополнительные сведения о типах данных и функциях, поддерживаемых для генерации кода, см. в разделах Определение данных и Языковые функции MATLAB, поддерживаемые для генерации кода C/C + +.
Эти изменения и оптимизации приводят к тому, что созданный код отображается иначе, чем код MATLAB. Сгенерированный код может не сопоставляться с кодом MATLAB по принципу «один к одному» из-за следующих причин:
Примечание
В зависимости от исходного кода эти случаи могут происходить несколько иначе, чем показано здесь.
Кодер MATLAB генерирует автономный код C/C + + и код MEX из кода MATLAB. Одна функция в коде MATLAB может быть преобразована в несколько функций в сгенерированном коде. Две или более функций в коде MATLAB также могут стать одним телом функции в сгенерированном коде. Этот процесс называется встроением функций. По умолчанию генератор кода использует внутреннюю эвристику для определения того, нужно ли встраивать функции или нет. Дополнительные сведения см. в разделеcoder.inline и управление встроением для точной настройки производительности и читаемости сгенерированного кода.
Выходы функции MATLAB могут становиться возвращаемыми значениями в C или переходными. Один скалярный вывод в коде MATLAB рассматривается как возвращаемое значение в сгенерированном коде.
Функция addOne имеет входную переменную x и выходная переменная y. Для этого примера: x имеет тип double.
function y = addOne(x) y = x + 1; end
Код, сгенерированный для фрагмента, показан здесь:
double addOne(double x)
{
return x + 1.0;
}Вход в функцию addOne, x, рассматривается как переменная, передаваемая по значению в сгенерированном коде. Вывод функции MATLAB возвращается значением в сгенерированном коде.
Для массивов выходные данные могут передаваться по ссылке. Фрагмент кода, показанный здесь, использует double вход x и вывод массива y.
function y = addMat(x) z = [1:100]; y = z + x; end
Выходная переменная y преобразуется в переменную массива pass-by-reference в сгенерированном коде, показанном здесь:
void addMat(double x, double y[100])
{
int i;
for (i = 0; i < 100; i++) {
y[i] = ((double)i + 1.0) + x;
}
}Для функций точки входа, имеющих несколько выходных переменных, выходные данные могут передаваться по ссылке в сгенерированном коде. Этот фрагмент кода имеет два double скалярные выходы, y и z, с double скалярный вход x.
function [z,y] = splitOne(x) y = x + 1; z = x + 2; end
Выходные переменные y и z преобразуются в передаваемые по ссылке переменные в сгенерированном коде:
void splitOne(double x, double *z, double *y)
{
*y = x + 1.0;
*z = x + 2.0;
}Дополнительные сведения о поведении передачи аргументов функций точки входа в сгенерированном коде см. в разделе Развертывание сгенерированного кода.
Значения констант в коде могут не сохраняться в созданном коде. Эти значения могут быть удалены для оптимизации созданного кода. Постоянное сворачивание удаляет вычисления, которые могли присутствовать в коде MATLAB, и заменяет их результатом. Дополнительные сведения см. в разделе Постоянное сворачивание.
Рассмотрим этот фрагмент кода:
function y = removeConst x = ones(10); y = x + 1; end
Генератор кода удаляет матрицу констант x для сохранения памяти и назначения постоянного значения в качестве результата. Созданный код выглядит следующим образом:
void removeConst(double y[100])
{
int i;
for (i = 0; i < 100; i++) {
y[i] = 2.0;
}
}Неиспользуемые входы или постоянные входы в функции, не являющиеся точками ввода, в коде MATLAB удаляются из тел функций в сгенерированном коде.
Специализации функций генератора кода могут изменить функцию на версию, в которой тип ввода, размер, сложность или значение могут быть настроены для конкретного вызова функции. Это делается для создания эффективного кода C за счет дублирования кода. Дополнительные сведения см. в разделе Специализированные функции или классы.
В предыдущем примере для доступа к матрице требуются дополнительные строки кода в C/C + +. A10около-10 матрица представлена в виде массива из 100 double элементы в созданном коде. A for используется для доступа ко всем элементам массива в этом случае. C/C + + не поддерживают многие матричные операции, поэтому генератор кода преобразует матрицы и операции с матрицами в массивы и методы, такие какfor петли для доступа к этим массивам.
Созданный код может использовать стандартные библиотеки C для выполнения математических операций или других функций в коде MATLAB. Список поддерживаемых языковых функций см. в разделе Языковые функции MATLAB, поддерживаемые для генерации кода C/C + +.
Для генерации кода массив может быть фиксированного или переменного размера. Массивы переменного размера могут отображаться в генерируемом коде в различных форматах. Код может быть создан для массива фиксированного размера, если генератор кода может определить размер массива. Создание кода также допустимо для массива фиксированного размера с верхней границей. Динамически выделенные массивы также генерируются в определенных случаях. См. раздел Создание кода для массивов переменного размера.
Создание кода для массивов фиксированного и переменного размера может дать следующие объявления переменных в сгенерированном коде:
double x[10]; // Fixed-size array double y_data[20]; int y_size[2]; // y_data and y_size denote an upper-bounded array emxArrayReal_T *z; // Dynamically allocated array
Если код MATLAB содержит локальные переменные, занимающие много памяти, то в созданном коде они могут быть объявлены как локальные переменные, статические локальные переменные или как переменные в struct который передается в функцию точки входа в сгенерированном коде. Можно управлять этим преобразованием, управляя памятью, выделенной для созданного кода. См. раздел Использование пространства в стеке управления.
Чтобы реализовать массивы ячеек в сгенерированном коде, генератор кода может перевести их как struct, статический массив или динамический массив. Дополнительные сведения см. в разделе Создание кода для массивов ячеек.
Генератор кода может создать две хозяйственные функции, инициализировать и завершать, если они необходимы. Эти функции можно найти на закладке Сгенерированный код в отчете по созданию кода. Функция инициализации инициализирует состояние, в котором работают сгенерированные функции точки входа C/C + +. Функция завершения освобождает выделенную память и выполняет другие операции очистки. Дополнительные сведения см. в разделе Использование сгенерированных функций инициализации и завершения