階層構造を意識して、信頼性の高いプログラムを組もう!:マイクロマウスで始める組み込み開発入門(5)(1/2 ページ)
マイクロマウスの組み立てキット「Pi:Co Classic」を完成させた北上くんとえみちゃん。早速、サンプルプログラムで迷路を走らせようとするえみちゃんに「待った」をかけた北上くんは、自らの思い「Pi:Co Classic構想」を語り始める――。今回は、マイクロマウス【プログラミング編】の序章をお届けする。
前回のあらすじ
組み込み技術者に要求される要素が“ギュッ”と詰まった「マイクロマウス」。北上くんと新入社員のえみちゃんは、スキルアップを兼ねてマイクロマウスの開発を始めることにしました。はんだ付けほぼ初心者にもかかわらず、組み立てキット「Pi:Co Classic」の基板を完成させたえみちゃん。途中失敗もありましたが、きちんと問題を解決し、無事に基本動作の確認まで完了しました(拍手:パチパチパチ)。喜びもつかの間、早速、サンプルプログラムでPi:Co Classicを走らせようとしたえみちゃんに、北上くんが「待った」をかけました。何やら今後の方針について、北上くんには思うところがあるようです。北上くんの熱い思いを聞くべく、2人はお好み焼き屋へと場所を移すのでした……(前回の記事へ)。
プログラムの階層構造化とは?
――ジュウ〜、ジュウ〜(鉄板の上でお好み焼きが焼ける音)
センパイ!
今のままでもワタシたちの『Pi:Co Classic』は迷路を走るんですよね?
もちろん、走るよ!
調整すれば、ちゃんと完走だってできるはずだよ。
えー。
だったら、サンプルのソースコードを読むだけでも、勉強になりませんかね?
そうだね。
人の書いたソースコードを読むのは、とてもいい勉強になると思うよ。
でもね……(クワッ!!)。
(ゴクリッ)
(こ、これは長くなるぞぉ〜。どうせならもう1枚、豚玉追加しておけばよかった……orz)
さて、お待ちかねのマイクロマウス【プログラミング編】に突入する前に、お好み焼きを食べながら、北上くんが鉄板よりも熱く語った「Pi:Co Classic構想」を読者の皆さんにもお伝えしておきましょう。
いきなり質問です。プログラムを書く際に、プログラマーが心掛けなければならないことは何だと思いますか?
――答えは、「正しく動作するプログラムを書くこと」です。
この心掛けは、全てのプログラム開発に共通して言えることですが、特に品質が問われる組み込みシステムの場合には、強く意識しなければなりません。
ただ、皆さんよくご存じの通り、「言うは易く行うは難し」です。“不具合ゼロ”を実現するのは、簡単なことではありません(むしろ不具合ゼロは不可能といえます)。それに、そもそもプログラムが正しく動作しているかを、どのように検証・証明すればいいのか? という問題もあります。
「それなら、正しく動くかどうか、実行してみればいいでしょ!」というご意見は、至極もっともなのですが、残念ながら現実的ではありません。想定内の処理ならばともかく、想定外の処理をどこまでテストできるのか? という問題があるからです。
となると、正しく動くことが、分かりやすく論証できるような記述がプログラムには求められます。何だかややこしいですね。早い話が「プログラムの中身を分かりやすく・読みやすく書こうね」ということです。
分かりやすい・読みやすいプログラムというのは、
1.バグが潜みにくく
2.バグを発見しやすい
という特徴があり、「品質の向上」が期待できます。
そして、
3.再利用がしやすい
というメリットもあり、システム開発における「コスト削減」にも寄与します。
では、分かりやすい・読みやすいプログラムはどのように書けばよいのでしょうか。バグがあったときに、問題の切り分けがラクになるような記述方法とは? プログラムを再利用しやすくするためには? ……など、具体的にどうしたらいいのでしょうか。
その答えが、プログラムの「モジュール化」です。
モジュールとは、プログラム内の「部品」のことです。私たちが、「1人に、1つずつ、大切な命〜♪」を持っているように、モジュールにも、1つに、1つずつ、大切な使命を与えてあげましょう。「1つのモジュールに1つの機能」。これを徹底することが重要です。
そして、もう1つのポイントが、「モジュールの独立性」です。
例えば、グローバル変数を使ってモジュール間を遷移していると、どこでどんな値が格納されているのかが分かりにくくなり、不具合が発生した場合、問題箇所の特定が難しくなります。こうしたことのないように、必要なデータは“パラメータ”として関数に渡し、モジュールの独立性を高める必要があります(注)。要するに、モジュール単体でデバッグできるようにしておくことが肝心なのです。
システムに必要となる機能を部品としてモジュール化し、階層を
- 迷路解析などを行う「アプリケーション層」
- ドライバ層のモジュールを条件に応じて呼び出す「コントローラ層」
- ハードウェアを直接制御する「ドライバ層」
ときっちりと分けておくことで、「理解しやすく」「保守・修正が容易」で「再利用が可能」なプログラム構造となります。
いまさら言うまでもありませんが、C言語は典型的な構造化プログラミング言語です。しかし、ただ漠然とC言語でプログラミングしても可読性や品質は向上しません。プログラマー自身が、プログラムのモジュール化や階層構造を意識して、プログラムを記述することで、初めて実現できるのです。
参考:山浦恒央の“くみこみ"な話(22): | |
---|---|
⇒ | 構造化プログラミングの苦難の歴史 |
う、う〜ん。センパイ……。
階層構造化って、ややこしくて難しい気がします……。
いやいや、そんなことないよ!
むしろプログラムを階層構造化した方が、いろいろラクなんだって!!
そうなのかなぁ〜。
実際に、『Pi:Co Classic』のソフトウェア構成図を見れば、イメージしやすいと思うよ。
ホントですかぁ〜。
じゃあ、見せてくださいよ!
Copyright © ITmedia, Inc. All Rights Reserved.