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

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 файл является записью. record подобна структуре на C или записи на Pascal. Синтаксис объявления записи:

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

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

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

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

Чтобы назначить значение полю записи, необходимо использовать 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

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

Похожие темы