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

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. См. Компилятор Выходного языка для получения дополнительной информации о неявных типах данных переменных.

Записи

Одно из построений, наиболее относящихся к генерации кода из файла 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 на Компиляторе Выходного языка.

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

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

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

Похожие темы