Концепции генерации кода

TLC интерпретирует выходной язык, который является общим языком программирования, и можно использовать его как таковой. Важно, однако, помнить, что TLC был разработан для одной цели: преобразовывать файл model.rtw в сгенерированный код. Таким образом выходной язык обеспечивает много функций, которые полезны для этой задачи, но не обеспечивает некоторые функции, которые обеспечивают другие языки как C и C++.

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

Потоки вывода

Типичный пример “Hello World” довольно прост на выходном языке. Введите следующее в файле с именем hello.tlc:

%selectfile STDOUT 
Hello, World

Чтобы запустить эту программу TLC, ввести

tlc hello.tlc

в подсказке MATLAB®.

Этот простой скрипт иллюстрирует некоторые важные концепции, лежащие в основе цели (и следовательно проект) TLC. Поскольку основная цель TLC должна сгенерировать код, это выводится (или поток) ориентированный. Это дает возможность обрабатывать буферы текста и выводить их легко. В вышеупомянутом скрипте директива %selectfile говорит TLC отправлять любой после текста, который это генерирует или не распознает устройству стандартного вывода. Синтаксис, который распознает TLC, начинается с символа %. Поскольку Hello, World не распознан, он отправляется непосредственно в вывод. Вы могли легко изменить выходное место назначения, чтобы быть файлом. Не открывайте поток STDOUT, но выбирайте, чтобы записать в Командное окно.

%openfile foo = "foo.txt"  
%openfile bar = "bar.txt" 
%selectfile foo 
This line is in foo. 
%selectfile STDOUT 
Line has been output to foo. 
%selectfile bar 
This line is in bar. 
%selectfile NULL_FILE 
This line will not show up anywhere. 
%selectfile STDOUT 
About to close bar. 
%closefile bar 
%closefile foo

Можно переключиться между буферами на сообщения состояния дисплея. Семантика этих трех директив %openfile, %selectfile и %closefile дана в Директивах компилятора Выходного языка.

VariableTypes

Отсутствие явных описаний типа для переменных является другой функцией TLC. См. Компилятор Выходного языка (Simulink Coder) для получения дополнительной информации о неявных типах данных переменных.

Записи

Одно из построений, наиболее относящихся к генерации кода из файла model.rtw, является записью. record подобен структуре в C или записи в Паскале. Синтаксис объявления записи

%createrecord recVar { ... 	
   field1		value1  ...
   field2		value2 ...
 	 ... 	
  fieldN		valueN ... 
}

где recVar является именем объявляемой записи, fieldi является строкой, и valuei является соответствующим значением TLC.

Записи могли вложить записи или подзаписи, в них. Файлом model.rtw является по существу один большой именованный CompiledModel записи, содержа уровни подзаписей.

В отличие от MATLAB, TLC требует что вы явным образом определения функции load, не расположенные в том же конечном файле. В MATLAB строка A = myfunc(B) заставляет MATLAB автоматически искать и загружать файл MATLAB или файл MEX под названием myfunc. TLC требует, чтобы вы в частности включали файл, который задает функцию с помощью директивы %addincludepath.

TLC предоставляет директиву %with, которая упрощает записи использования. См. Директивы компилятора Выходного языка.

Примечание

Формат и структура файла model.rtw подвержены изменениям от одного релиза генератора кода другому.

Чтение записи в из файла изменяемо, как другие записи, которые вы объявляете в программе. CompiledModel записи изменяется много раз во время генерации кода. CompiledModel является глобальной записью в файле model.rtw. Это содержит переменные, используемые для генерации кода, такие как NumNonvirtSubsystems, NumBlocks. Это также добавлено во время генерации кода со многими новыми переменными, опциями и подзаписями.

Функции, такие как LibGetFormattedBlockPath, обеспечиваются в библиотеках TLC, расположенных в (открытом) matlabroot/rtw/c/tlc/lib/*.tlc. Для полного списка доступных функций обратитесь к Справочному руководству по библиотеке Функции TLC на Компиляторе Выходного языка (Simulink Coder).

Присвойте значения полям записей

Чтобы присвоить значение полю записи, необходимо использовать qualified variable expression. Квалифицированное переменное выражение ссылается на переменную в одной из следующих форм:

  • Идентификатор

  • Квалифицированная переменная, сопровождаемая “.”, сопровождаемым идентификатором, такой как

    var[2].b
  • Квалифицированная переменная, сопровождаемая выражением в скобках такой как

    var[expr]

Псевдонимы записи

В TLC возможно создать то, что называется alias к записи. Псевдонимы подобны указателям на структуры в C. Можно создать несколько псевдонимов к одной записи. Модификации к искаженной записи видимы к каждому месту, которое содержит псевдоним.

Следующий фрагмент кода иллюстрирует использование псевдонимов:

%createrecord foo { field 1 }
%createrecord a { } 
%createrecord b { } 
%createrecord c { }  

%addtorecord a foo foo 
%addtorecord b foo foo 
%addtorecord c foo { field 1 }  

%% notice we are not changing field through a or b. 
%assign foo.field  = 2  

ISALIAS(a.foo) = %<ISALIAS(a.foo)>
ISALIAS(b.foo) = %<ISALIAS(b.foo)>
ISALIAS(c.foo) = %<ISALIAS(c.foo)>

a.foo.field = %<a.foo.field>
b.foo.field = %<b.foo.field> 
c.foo.field = %<c.foo.field> 
%% note that c.foo.field is unchanged

Сохранение этого скрипта как record_alias.tlc и вызов его с

tlc -v record_alias.tlc

производит вывод

ISALIAS(a.foo) = 1
ISALIAS(b.foo) = 1
ISALIAS(c.foo) = 0

a.foo.field = 2
b.foo.field = 2 
c.foo.field = 1 

Когда в функции, возможно создать псевдоним к локально созданной записи, которая является в функции. Если псевдоним возвращен в функцию, это остается допустимым даже после выхода из функции, как в следующем примере:

%function func(value) Output   
  %createrecord foo { field value }
  %createrecord a { foo foo }
ISALIAS(a.foo) = %<ISALIAS(a.foo)>
   %return a.foo
 %endfunction

 %assign x = func(2)
 ISALIAS(x) = %<ISALIAS(x)>
 x = %<x>
 x.field = %<x.field>

Сохранение этого скрипта как alias_func.tlc и вызов его с

tlc -v alias_func.tlc

производит вывод

ISALIAS(a.foo) = 1 
ISALIAS(x) = 1
x = { field 2 } 
x.field = 2

Пока существует некоторая ссылка на запись через псевдоним, та запись не удалена. Это позволяет записям использоваться в качестве возвращаемых значений от функций.

Похожие темы