TLC интерпретирует целевой язык, который является общим языком программирования, и можно использовать его как таковой. Важно, однако, помнить, что TLC был разработан для одной цели: преобразовать
файл к сгенерированному коду. Таким образом, целевой язык предоставляет много функций, которые полезны для этой задачи, но не предоставляет некоторые функции, которые предоставляют другие языки, такие как C и C++.model
.rtw
Можно найти некоторые из следующих примеров общего программирования, полезных для ознакомления с основными конструкциями, используемыми в 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
приведены в Директивах компилятора целевого языка.
Отсутствие явных объявлений типов для переменных является другой функцией TLC. Дополнительные сведения о неявных типах данных переменных см. в разделе Компилятора целевого языка.
Одна из конструкций, наиболее релевантных для генерации кода из
файл является записью. record подобна структуре на C или записи на Pascal. Синтаксис объявления записи:model
.rtw
%createrecord recVar { ... field1 value1 ... field2 value2 ... ... fieldN valueN ... }
где recVar
- имя объявляемой записи, fieldi
является строкой, и valuei
- соответствующее значение TLC.
Записи могут иметь вложенные записи или подзаписи в них. The
файл по существу является одной большой записью с именем model
.rtwCompiledModel
, содержащего уровни подзаписей.
В отличие от MATLAB, TLC требует, чтобы вы явно функции load определения, не расположенные в том же целевом файле. В MATLAB линия A = myfunc(B)
приводит к тому, что MATLAB автоматически ищет и загружает файл MATLAB или файл MEX с именем myfunc
. TLC требует, чтобы вы специально включили файл, который определяет функцию, используя %addincludepath
директива.
TLC обеспечивает %with
директива, которая облегчает использование записей. См. «Директивы компилятора целевого языка».
Примечание
Формат и структура
файл может быть изменен с одного релиза генератора кода на другую.model
.rtw
Запись, считанная из файла, изменяется, как и другие записи, которые вы объявляете в программе. Запись CompiledModel
изменяется много раз во время генерации кода. CompiledModel
- глобальная запись в
файл. Он содержит переменные, используемые для генерации кода, такие как model
.rtwNumNonvirtSubsystems
, NumBlocks
. Он также добавляется во время генерации кода со многими новыми переменными, опциями и подзаписями.
Функции, такие как LibGetFormattedBlockPath
предоставляются в библиотеках TLC, расположенных в
(откройте). Полный список доступных функций см. в Ссылке по библиотеке функций TLC на целевом языковом компиляторе.matlabroot
/ rtw/c/tlc/lib/* .tlc
Чтобы назначить значение полю записи, необходимо использовать 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
Пока существует некоторая ссылка на запись через псевдоним, эта запись не удаляется. Это позволяет использовать записи в качестве возвращаемых значений из функций.