Lustre (プログラミング言語)

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]

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。