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