
年の初め、State Atomic Energy Corporation Rosatomには 、原子力発電所で使用されるソフトウェアの正当性について質問がありました。 同社の専門家は、PORTALソフトウェアプラットフォームに関するドキュメントを見つけられませんでした。 このシステムは、さまざまな地域の複数の発電所で使用されており、電源ユニットおよび機器管理の状態に関する情報を収集、処理、表示するためのソフトウェアです。
結局のところ、システム開発者のアーカイブには、設計、技術、および運用に関するドキュメントはなく、一部の従業員はソフトウェアコンポーネントの正体不明のバージョンで作業しています。 このような重要なシステムのソースコードに個人がアクセスすると、原子力発電所の故障が深刻な結果につながる可能性があるため、セキュリティについて考えるようになります。
足はどこから成長しますか
上記のような状況は、世界中で珍しいことではありません 。 多くの点で、この理由は、企業ができるだけ早く問題を解決し、市場に最初に参入することを望むことです。 その結果、開発者は「プログラムを設計する」のではなく、すぐに作成する必要があります。 この場合、ソフトウェアのドキュメントはしばしば省略されます。
何かを変更する必要がある場合、プログラマーはコードを編集するだけで、そのような介入のそれぞれが将来の問題の踏み台になるとは考えていません。 おそらく、他の開発者がこれを行う必要があります。 十分に詳細なドキュメントやメンテナンスなしで他の人のコードを理解するだけです。簡単ではありません。
自動プログラミングが登場
オートマトンプログラミングは、プログラムまたはそのフラグメントが何らかの形式的なオートマトンのモデルとして解釈されるプログラミングパラダイムです。 この用語は、1991年にITMO大学のプログラミング技術学部長のアナトリーシャリトによって提案されました。
プログラムの動作原理を理解するために、それとやり取りする人なら誰でも、ソフトウェアの動作を遷移グラフを使用して説明します 。 遷移グラフは多くの場合1つのモニター画面に収まるため、記号表記を使用すると、最も複雑なアルゴリズムであってもコンパクトでわかりやすい方法で表現できます。 これにより、全体像を一目で把握できます。
自動プログラミングのフレームワークでは 、プログラムは設計された後にのみ作成されると想定されています。 さらに、各プロジェクトは必然的にドキュメントのリリースで終了します。 ソリューションの作業の論理を記述するマシンの設計により、プログラムのデバッグは最小限で済み、すぐに実行できる状態になります。 デバッグの必要性がまだ発生する場合、状態、遷移、およびアクションの観点からオートマトンの動作を反映するデバッグプロトコルを生成できます。
アルゴリズムの構築にオートマトンアプローチを使用する例として、バイナリツリーの直接トラバーサル問題(0〜9)の解決策を示します。

二分木の例
各頂点には、独自の番号と子頂点へのポインタが含まれていると想定しています。 C ++では、この構造は次のように表すことができます。
struct Node { int id; // Node* left; // Node* right; // };
また、出力シーケンスの頂点番号を表示するput(int x)関数と、次のインターフェイスを使用してスタックを実装するクラスを紹介します。
template class Stack { void push(const T& x); // x void pop(); // const T& top() const; // };
提案されたアルゴリズムの考え方は、二分木を横断するとき、3つの移動方向、左、右、上を区別できるということです。 現在の移動方向、現在の頂点のプロパティ、スタック内の極端なシンボルに応じて、次に移動する場所を決定できます。 したがって、各移動方向を機械の制御状態と比較すると便利です。 ツリートラバースオートマトンの回路図とその遷移図を以下の画像に示します。

ツリーウォークを実装するマシンの回路図

ツリーウォークを実装するマシンの遷移図
ステートマシンの理論は、CorezoidがITソリューションの名を冠したクラウドプラットフォームを構築するために成功裏に使用されたことに注意してください。 Anatoly Shalyto は 、この方法を現代の開発に実装する必要性について次のように述べています。「プログラマーは非常に賢く、他の数学的な抽象化と同様に、必要なときに機械を使用します。 そして、私は言います:常に[自動プログラミング]を使用して、動作がバックグラウンドに依存する複雑な動作を持つプログラムを記述する必要があります。
Anatoly Shalytoによれば、プログラムの品質は、テストと検証だけでなく、プロジェクトの作業の最初から顧客と開発者との関係を構築することによっても確保されています。 自動化されたプログラミング方法論に基づいた正式な技術タスクは、これを達成するのに役立ちます。
PS上記のテキストから、自動プログラミングの助けを借りて「おもちゃ」の問題のみを解決できるという印象を受けるかもしれません。 しかし、これはそうではありません。
与えられた例は、このプログラミングパラダイムでは一般的ではありません。上記のタイプの計算アルゴリズムの実装ではなく、パターン作成者が嫌う先史時代に依存する複雑な動作を伴う制御アルゴリズムを対象としています。
確かに、計算アルゴリズムを教えながら、自動プログラミングが役に立ちました。GeorgyKorneevとMatvey Kazakovは、非常に複雑な離散数学アルゴリズムの場合でも、毎回手動で記述するのではなく、ビジュアライザーの設計と構築の自動化に使用できることを示しました魂を込めて」 ここにプロジェクトのドキュメントの例を示しますが、複雑なプロジェクトのドキュメントの例を示します。
さらに複雑なプロジェクトのドキュメントはこちらにあります 。 サイトis.ifmo.ruには、学生やその他の多くのプロジェクトがあり、その研究で多くの質問に答えることができます。 ポリカルポバN.I.の本 とShalyto A.A. 自動プログラミング。 SPb。:Peter、2010 はこちらにあります 。
そして夢を見ないでください-書いてください:shalyto@mail.ifmo.ru。