exponenta event banner

Концепции создания кода

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 приведены в директивах компилятора целевого языка.

Типы переменных

Отсутствие явных описаний типов для переменных является еще одной особенностью TLC. Дополнительные сведения о неявных типах данных переменных см. в разделе Компилятор целевого языка.

Отчеты

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

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

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

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

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

TLC обеспечивает %with директива, облегчающая использование записей. См. раздел Директивы компилятора целевого языка.

Примечание

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

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

Функции, такие как LibGetFormattedBlockPath предоставляются в библиотеках TLC, расположенных в matlabroot/rtw/c/tlc/lib/*.tlc (открыто). Полный список доступных функций см. в справочнике библиотеки функций 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

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

Связанные темы