2011年1月19日水曜日

ソフトウェアIC化考案(1)

1.決められた定石について考える。

そもそも自分のスタート地点が組み込み屋なので、「ソフトウェアIC化」という考え自体が
ハードウェア寄りな気質がある。

1-1.現状について

Wikipediaによるとソフトウェアコンポーネントというのは、
http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88

抜粋)
ソフトウェアコンポーネントを効果的に再利用可能にするには多大な労力と注意が必要である。特に以下のような点が重要である:

* 完全に文書化すること
* テストをしっかり行うこと
* 特に各種入力値を入力したときの動作をしっかり確認すること
* 分かり易い(あるいは利用し易い)エラーメッセージを返すこと
* 想定していない状況で使われる可能性があることを念頭において開発すること

1つのプログラムを作るのに、これだけの労力を払って
「価値はあるのか。」
という問題がある。
Borland社のDelphiで成功したコンポーネント思考の開発手法はあるが、
.Net製品を見ると肥大化しすぎているように思う。
もし準拠して作るならば、
「自分でコンポーネント部品を作ってからメインロジックを組み込む」
この手順を踏まないといけなくなるので、これが1つの制約になって敷居が高くなってるように見える。

1-2.ソフトウェアの定石
プログラム言語とは、「機械語にするための言語」であって、
ソフトウェアは「人間のやっている事を自動化するためのロジック」である。
最近のフレームワークは、ソフトウェアの効率化であって、本来目的以外のロジックも含むデメリットがある。
そこで機械にやらせたいソフトウェア(ロジック)をどうすれば出来るのか、ものすごい基本的な部分を
定石と定義しておく。

まず揺れ動かない部分、スタートアップとメイン。
void main()
{
    x1_init();
    x2_init();

    for(;;){
        //他のモジュール内のメインを動かす
        x1_main();
        x2_main();
        ....
        //アプリケーション終了イベントで抜ける
    }
    x1_finalize();
    x2_finalize();
}

Web系などアプリ層をメインにしている人はフレームワークに任せていて
自分でMain処理をあまり書かないかもしれないが、本来これが基礎になっている。
この部分にやりたい事すべてを入れ込めるかがカギで、
できるだけ1周期内で分岐もせずに、必要な処理以外実行されない構造に出来るかが
ポイントだろう。

ここで、組み込みソフトの場合は電源モードなど動作状態を変える必要があって、
もし動作状態を変える場合は、他のメインループ処理を追加する形になる。

static int PowerMode = 1;

void main()
{
    //全体の初期化
    init();

    //メインループ
    switch(PowerMode)
    {
    case 1:
        x1_init();
        x2_init();

        for(;;){
            //他のモジュール内のメインを動かす
            x1_main();
            x2_main();
            ....
            //アプリケーション終了イベントで抜ける
        }
        x1_finalize();
        x2_finalize();
        break;
    case 2:
        x3_init();
        x4_init();

        for(;;){
            //他のモジュール内のメインを動かす
            x3_main();
            x4_main();
            ....
            //アプリケーション終了イベントで抜ける
        }
        x3_finalize();
        x4_finalize();
        break;
    }
    
    //全体の終了処理
    finalize();
}
ここでインライン化せずに関数に置き換えてしまうと、
コールスタックに戻り先が格納されてしまうので注意。
あえてベタ書きでサンプルコードを記述した。

上記メインループからどうやって一番最適なモジュールが作れるかを次までに考えてみる。


構想メモ:
 ソフトウェアの定石はテンプレートで作成できる構造を狙っている。
それを実現するにはまず、分岐処理の排除、ロジックはなるべく1パスの単純構造になるように設計する点。
コメントを投稿

Androider