LoginSignup
3
2

自己再構築(self reconstruction)による算譜(program)自動生成器(generator)自動生成器(generator)の作成

Last updated at Posted at 2018-02-27

画面生成

ある組織からの依頼で、計測機器の画面表示機能(PCで構成)のソフトウェアを作成したいとのこと。画面は、ある期間が経つと項目が増えたり、配置を変えたりする。

自動生成

自動生成器(program generator)を作成した。
実は、そんなにカッコ良いものではない。

step1 計測機器の画面表示機能をまず作成した。

最初の仕様の画面の縦に数項目、横は二項目。
いわゆるメニューシステム。
階層構造のメニュー。最初は三層構造。

step2 部品に分割。

縦の項目、縦の項目の並び、縦項目の並びを横に並べるのは共通部品。
メニューの項目が、次のメニューを呼び出す機能も共通部品。
共通部品は、大きさ、個数、表示方法などで任意の使い方ができるようにした。

step3 上記ソースコードを生成できる機能をつけたプログラムにした。

最初は自分のプログラムを読み、自分のプログラムを出力する自己複製(self-copy)機能。

自動生成器の自動生成器

自己複写による自動生成器は、その機能は自動生成器自体を自動生成する機能の記述であることに気がついた。

最初に作成した自動生成器をA, Aを生成できる自動生成器をBとする。

自動生成きBは、メニューの数、メニューの構造などを引数(parameter)として指定すれば、よい。メニューの一つの項目にメニューの構成を変えるメニューを設定。

その下のメニューで、メニューの縦の項目、横の列数が指定できる。

AとBでは、共通で利用できる書庫(library)があることが分かった。

書庫の中でも、自分自身を自己複写(self copy)する部分と、一部の機能の範囲や個数、配置などを変更して自己構築(self construction)する部分があることが分かった。

step4 計測機器の画面表示機能を生成する機能を、共通部品だけで構成した。

たな追加部分も、その機器の測定項目、表示桁数、表示の種類などでる。表示の種類が、整数、小数、浮動小数点数指数表現、16進数など、表示の形式が言語が対応している場合には、全ての書式を表示できる関数を用意。四捨五入、切り捨てなど、その関数で用意しなかった新しい機能があれば、その部分の関数を追加すればよい。
これらをまとめると自己再構築(self reconstraction)による算譜(program)自動生成器(generator)自動生成器(generator)の原型が出来上がり。

お蔵入り

試作を納品したところ、「こういうものは、お金にならない。」
という理由でお蔵入りした。
応用ソフトを各世界の厳しさを知り、もっぱら道具類の作成と、試験に専念するようになった。

後になって気がついたのは、「保守できる人がいない」ということ。
もし、根本的なところで機能変更があった時に、論理を再構成できる人でないと保守できないらしい。

備考

作成した言語はBasicです。DOS上の案件でした。N88-BASICなどの特定の機種で動作する機能などを使わずに、DOSの色々なBASICのなるべく共通部分だけで試作したものです。

何らかの時効が成立していると仮定して、差し障りのないように表記しています。

関連資料

OOP54-CPP. Gracefully handle self-copy assignment
https://wiki.sei.cmu.edu/confluence/display/cplusplus/OOP54-CPP.+Gracefully+handle+self-copy+assignment

self_copy.cpp
#include <new>
  
struct S { /* ... */ }; // Has nonthrowing copy constructor
  
class T {
  int n;
  S *s1;
  
public:
  T(const T &rhs) : n(rhs.n), s1(rhs.s1 ? new S(*rhs.s1) : nullptr) {}
  ~T() { delete s1; }
 
  // ...
  
  T& operator=(const T &rhs) {
    if (this != &rhs) {
      n = rhs.n;
      delete s1;
      try {
        s1 = new S(*rhs.s1);
      } catch (std::bad_alloc &) {
        s1 = nullptr; // For basic exception guarantees
        throw;
      }
    }
    return *this;
  }
};

ISO/IEC 14882:2017 Programming Language C++ -
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf

文書履歴

ver 0.10 初稿 20180227
ver 0.11 self copyについてのC++の記述を追加 20180320
ver 0.12 自己生成がメニューシステムであることを追記 20180325

最後までおよみいただきありがとうございました。

いいね 💚、フォローをお願いします。

Thank you very much for reading to the last sentence.

Please press the like icon 💚 and follow me for your happy life.

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2