makotan _at_ gmail dot com

「あるソフトウェア工学者の失敗」を読んでコードジェネレータで思った事

元ネタ→ http://www.shayashi.jp/myfailures.pdf


数学的に証明可能なソフトウェアにはバグが無い。ただし仕様レベルではバグが起きる事には対策が無い。
コードジェネレータが正しい限り生成したコードにはバグが無い。ただし入力ではバグが起きることには対策が無い。

大事な4つのモデル

プログラミングにはこの4つのモデルが必要

  • データ
  • 状態
  • 権限

細かく見て行くとさらに複雑に分かれてる(&もっと追加される)けどざっくりした分類
4つのモデルの種類的なバリエーションの豊富さと組み合わせの自由度と実行環境の豊富さが良くあるプログラミング程度でも100%のコード生成を困難にしている最大の理由

手作業プログラミング vs コードジェネレータ

手作業のプログラミングでは人間の脳内で組み合わせを考慮しつつ、機能を実現するコードを作る事が出来る
コードジェネレータは事前にモデル化された組み合わせを前提に機能を実現するコードを作る
事前にモデル化出来るものであればコードジェネレータの方が圧倒的に速いという事実がある
ちなみに、事前にモデル化が出来てコードを生成せずにそのまま動かす事が出来る事もある(モデルの複雑さを実行可能な計算量まで抑えれば可能)
結果的に、ある一定割合まではコードジェネレータの方が圧倒的に速く、そこを超えると人間の方が速いという状態になる

モデル化 vs プログラミング

コード生成に必要なのはモデル。モデルが複雑になればなるほどその情報を作る時にエラーが起きてバグが発生する
高いレベルの自動生成を目指すほどコード生成は定義自体にバグが起きやすい
プログラミングではバグが発生する事が前提として工程が組まれている
逆にバグが起きない程度のモデル化レベルを目指すと自動生成率が低くなる or ある程度まで機能が限定される
ここでコードジェネレータ作者の苦悩が起きる

コードジェネレータの苦悩

モデルを複雑にすればプログラミングの自動生成率は上がる。ただし入力時にエラーが起きやすくなり結果的に生産性が下がる
モデルをシンプルにしてトータルの生産性を目指せば自動生成率は下がる。ただし外部から期待される自動生成率は100%である
このバランスを何処にするのかがコードジェネレータ作者の最大の悩み