DRAKON(ロシア語: ДРАКОН; Дружелюбный Русский Алгоритмический язык, Который Обеспечивает Наглядность)はソ連がブラン計画のため開発したビジュアルプログラミング言語。

開発は1986年に始まり、ブラン計画で使用されていた、PROL2(ПРОЛ2)、DIPOL(ДИПОЛЬ)、LAKS(ЛАКС)をDRAKONという1つのユニバーサル言語で置き換えることを目的としていた。

ブラン計画が公的に終了した5年後の1998年、"Grafit-Floks"と呼ばれる自動CASEプログラミングシステムの開発をもって言語開発は終了。

後にシーローンチや他の宇宙計画で使用されることとなる。

本言語には純粋なDRAKONだと考えられるモデリング及びマークアップ言語としての使い方と、複数の言語ハイブリッドにおける一プログラミング言語としての使い方がある。言語ハイブリッドにおいてはDRAKON-C, DRAKON-ASM, DRAKON-Java等の言語ファミリーとして使用される。その際にファミリー内のすべての言語は統一されたグラフィカル文法を持つ。それが異なる言語使用における図表の類似を実現する。

ダイアグラムを迅速に作成できるDRAKON Editor(作者: Stepan Mitkin, Alexander Ilyin, Maas-Maarten Zeeman, Vasil Dyadov, Vasili Bachiashvili)はその実践であり、Windows, MacOS, Linuxで利用できる。

## デザイン

ドラコン チャートはアイコンとマクロアイコンで構成される。

マクロイコンの重要な部分は価数点である。 (図では黒丸で示されています)。これらのポイントに、アイコンまたはマイクロアイコンを連続して入力し、drakon エディターによって列に配置できる。

DRAKON は、説明、計画、戦略を目的として、さまざまなプログラミング言語で書かれたコンピューター プログラムの理解を助ける、学習しやすいビジュアル言語として作成された。

DRAKON は、プログラムの全体的な構造を表すために従来のフローチャートを形式化した drakon-chart を使用する。プログラミング言語のコード スニペットをDRAKON アイコンに追加すると、DRAKONから各種コードを生成できる。これによりプログラムの開発と並行して、読みやすいフローチャートの作成と保守を同時に行える。

大規模な多目的プログラムのドラコン チャートは複雑で理解しにくい場合がある。(ドイッチュ限界)同様の問題は、大規模なプログラムのコードを保守する際にも存在し、テキストベースの言語と同様モジュール化の考えで克服できるのではないかと言われている。

## 例

### テトリスの例

DRAKON 言語でのプログラムの簡単な例

これらの例は、テトリスゲームを実装する実際のコードである。例は DRAKON-JavaScript 言語で示されている。 DRAKON 言語のアイコン (ビジュアル プリミティブ) は、アルゴリズムの全体的な構造を定義している。アイコン (プリミティブ) 内のコード・スニペットは JavaScript で書かれている。

#### advanceStep

advanceStep関数は、ゲームのコア ロジックを実装する。advanceStepは、決定木として表されるステート マシンである。ゲーム エンジンは、advanceStep を定期的に呼び出す。このステート マシンには、「Play」、「ドロップ」、および「終了」の 3 つの状態がある。ゲームは現在の状態に応じてさまざまなアクションを実行する。例えば、「Play」状態において、落下中の飛び道具があり、その飛び道具が下に移動できる場合には、一段下に移動する。

DRAKON を使用すると、アルゴリズムの読み取り者は、決定木中のすべての可能なパスを視覚的に追跡できる。

|  |
| --- |
| JavaScript code generated from the DRAKON-chart: ``` function advanceStep() {     var _sw_8;     _sw_8 = module.state;     if (_sw_8 === "playing") {         if (module.projectile) {             if (canMoveDown()) {                 moveDown()                 return getStepPeriod()             } else {                 freezeProjectile()                 return noProjectile()             }         } else {             return noProjectile()         }     } else {         if (_sw_8 === "dropping") {             if (canMoveDown()) {                 moveDown()                 return DropPeriod             } else {                 freezeProjectile()                 module.state = "playing"                 return getStepPeriod()             }         } else {             if (_sw_8 === "finished") {             } else {                 throw new Error("Unexpected Choice value: " + _sw_8);             }             return undefined         }     } } ``` |

#### noProjectile

noProjectile関数は、落下するProjectileがない場合の処理を行う。塗りつぶされた行がある場合、その行はグリッドから削除される。それ以外の場合、ゲームは新しいProjectileの挿入を試みる。Projectileを入れるスペースがない場合、ゲームは負ける。

|  |
| --- |
| JavaScript code generated from the DRAKON-chart: ``` function noProjectile() {     if (clearRow()) {         return getStepPeriod()     } else {         createProjectile()         if (isGameLost()) {             gameOver()             module.state = "finished"             return undefined         } else {             return getStepPeriod()         }     } } ``` |

### clearRow

clearRow関数は、ギャップのない行に到達するまで、すべての行をボトムアップでスキャンする。このような場合、その列はグリッドから削除され、スコアが増加し、ゲームのテンポが上がる。

|  |
| --- |
| JavaScript code generated from the DRAKON-chart: ``` function clearRow() {     var row, rows;     rows = module.glass.rows     row = rows.length - 1;     while (true) {         if (row >= 0) {             if (rowHasHoles(row)) {                 row--;             } else {                 deleteRow(row)                 increaseScore()                 increaseSpeed()                 return true              }         } else {             module.addedScore = 0             return false          }     } } ``` |

### DRAKON実行アニメーション

下の図は、シルエット DRAKON アルゴリズムの実行を示している。アルゴリズムの実行は、実行順序でダイアグラム要素を強調表示することによってアニメーション化される。

「釣り」のシルエットは 4 つの木で構成されている。

- 釣りの準備
- 魚がかかるのを待つ
- 釣りの仕事
- 帰る

各木の主要なパスは、串と呼ばれる太い垂直線を強調表示することによって示される。

フロー グラフには、ヘッドライン アイコンから制御フロー グラフの各頂点  までのパスが常にある。したがって、シルエットには、どのような状況でも到達不能なコードが含まれることはない。