Lustreは、リアクティブシステムをプログラミングするために設計された、形式記述、宣言型、同期
データフロープログラミング言語です。この言語は、1980年代初頭に研究プロジェクトとして始まり、その正式な仕様は1991年のIEEEの論文集で発表されました。その後、1993年に
Esterel Technologies社が開発した商用製品であるSCADEに、
Esterelとともに中核言語として統合されました。
現在、Lustreは航空機、ヘリコプター、原子力発電所などの重要な制御ソフトウェアに使用されており、高い信頼性が求められる分野で活躍しています。
Lustreのプログラム構造
Lustreプログラムは、`node`と呼ばれる文で構成され、以下のように定義されます。
node foo(a : bool) returns (b : bool);
let
b = not a;
tel
ここでは、`foo`がノードの名前、`a`が入力変数、`b`が出力変数です。この例では、ノード`foo`は入力`a`の否定を計算し、その結果を`b`として返します。
内部変数
ノード内で使用する内部変数は、以下のように宣言できます。
node Nand(X, Y : bool) returns (Z : bool);
var U : bool;
let
U = X and Y;
Z = not U;
tel
この例では、`U`が内部変数として宣言されています。重要なのは、式の順序が結果に影響しないことです。つまり、`U = X and Y;`と`Z = not U;`の順序を入れ替えても、結果は変わりません。
演算子
Lustreで利用可能な変数型は、ブール値、整数型、実数型、タプル型です。演算子には以下のようなものがあります。
算術演算子: `+`, `-`, ``, `/`, `div`, `mod`
論理演算子: `and`, `or`, `not`
比較演算子: `==`, `<`, `<=`, `>`, `>=`
条件付きアクション: `if then else`
特殊演算子
プログラム例
エッジ検出
以下のコードは、ブール値の入力`X`のエッジを検出するノード`Edge`を定義します。
node Edge (X : bool) returns (E : bool);
let
E = false -> X and not pre X;
tel
この例では、`pre X`は入力`X`の前の値を参照します。`->`演算子は初期化を表し、最初のサイクルでは`false`を、それ以降は`X and not pre X`の計算結果を`E`に割り当てます。
関連項目
Esterel
SIGNAL (別のデータフロー指向同期言語)
同期プログラミング言語
データフロープログラミング
出典
Synchrone Lab Official website
SCADE product page
The Lustre Programming Language and Related Tools - [Verimag]
A TUTORIAL OF LUSTRE - [Verimag]