組込み開発とコンパイラー
私は長年、組込み開発に従事してきたベテランエンジニア.Tと言います。組込み開発を中心に、ソフトウェアエンジニアはどうあるべきか、など、日頃考えている事や感じた事をとめどなく書いてみようと思います。
コンピューターも間違える?
皆さんはコンピューターは指示された仕事は間違いなく遂行する機械だと思っていませんか?
はっきり言ってそれは幻想です。いや、間違いを犯すコンピューターは、もはやコンピューターとは言えないかもしれません。(この話は別の機会に譲ります)
コンパイラーも同じです。コンパイラーを開発するエンジニアや組込み開発エンジニアならいざ知らず、通常のアプリケーションを開発するエンジニアにとって、コンパイラーは神様に近い存在です。コンパイラーがバグる、というのは信じられないかもしれません。
組込み開発とコンパイラー
しかし、コンパイラーもソフトウェアの一種ですので、もちろん潜在バグを含んでいます。
プログラミングしてコンパイル、テストを行うと、期待した動作を行わないことは何時ものことです。いわゆるバグです。
それで何処にバグがあるのかを、組込みプログラムのソースコードと現象から追うのですが、どうしても分からない時があります。最近のデバッガは優秀ですので、ソースコードをステップ実行したり、その時の変数を参照したり、書き換えたりできますので、楽にデバッグできます。
組込みシステム開発のデバッグのコツ
しかし、組込みシステムの開発では、優秀なデバッガを使えないことがよくあります。そのような時にバグの原因が分からないと、『自分は悪くない、きっとコンパイラーのバグで、変な機械語に翻訳しているせいだ』とコンパイラを悪者にしたくなります。では、どうやってコンパイラーのバグを証明したらよいのでしょうか?
その方法の一つが、コンパイルオプションを変更して、アセンブリリストを出力させることです。アセンブリ言語レベルで不具合が発生するパターンを追いかけると、『あれ?』と気付くことがあります。そして、自分のバカさ加減に改めて恥ずかしくなるのです。『あれ?』と思った部分のソースコードを改めてみると、確かにアセンブリ言語と等価なソースコードがあるのです。自分のコードは絶対正しい、という思い込みがめくらにしているのかもしれません。
コンパイラーのバグを突き止める
しかし、組込みプログラムのソースコードと実際の動きがどうしても合わないことがまれにあります。アセンブリリストを出力させて検証すると、なぜかソースコードに記載の一行が抜けているのです。処理順に依存しない部分を前後させても、やはりその一行が抜けてしまいます。完全にコンパイラーのバグでした。
組込み開発で発生したバグで最初に疑うべきは自分自身
では、どうやってこのコンパイラーのバグを回避したらよいのでしょうか?
その時は、自分やっている組込み開発プログラムのコードに、必要な処理と全く関係がないおまじないを前後に書くことにより回避できることが分かりました。後の人におまじないコードが見つかってバカにされたくないので、しっかりと「これはおまじないコードだよ。理由はこれこれ・・・」とコメントを書いておきました。
自分がコーディングした組込み開発プログラムで発生する不具合の原因が分からなくても、最初に疑うのは自分自身です。しかし、神様みたいに君臨するOSやコンパイラーも不具合を含んでいることを忘れずに、それらの可能性を踏まえて広い視野で不具合に立ち向かうことも時には必要、というお話でした。
ちなみに、当社では組込み開発を始め、様々なシステム開発の相談、設計、実装を全国対応で行なっています。無料相談も実施していますので、お気軽にご相談ください。