組込み開発と高効率なプログラム

私は長年、組込み開発に従事してきたベテランエンジニア.Tと言います。組込み開発を中心に、ソフトウェアエンジニアはどうあるべきか、など、日頃考えている事や感じた事をとめどなく書いてみようと思います。

目次

新人組込み開発エンジニアだった私の開発業務

私が新入社員として入社したコンピューターメーカは、初期の銀行における勘定系リアルタイムオンラインシステムを稼働させた実績がありました。稼働させた当時のコンピュータの能力は、今と比べ物になりません。現在のスマホより遥かに貧弱でした。

限られたメモリサイズなので、開発に使用した言語はアセンブリ言語です。OSも汎用ではなく、トランザクションプロセシング専用のOSを新規に開発していました。(ここではTPモニターと呼びましょう)

オンラインシステムの開発に挑戦

入社して暫くした頃に新規のリアルタイムオンラインシステムを稼働させる開発プロジェクトがスタートしました。システム開発をある程度経験したこともあり、オンラインシステムに興味を抱いていたので、上司にそのプロジェクトに参画したいと希望を出したところ、幸いにも当該プロジェクトに配属されました。

新規リアルタイムオンラインシステムでは、実績のある前述のTPモニターを使用していました。それで、参考のためにTPモニターのアセンブリコードを調査することになりました。(TPモニターのソースコードは社員であっても普段は閲覧できません。開発担当外にはマル秘でした。しかし、『調査のため』ということで特別に閲覧させて貰いました。)そして、そのアセンブリコードを見て、驚いたことを今でも覚えています。

達人組込み開発エンジニアの書いたプログラム

TPモニターのアセンブリ言語で書かれた関数は、一目見るだけで何をやっているかが理解できるのです。もちろんメモリ制約が厳しいため、極限まで無駄を省いてコンパクトに実装されています。

しかし、一部トリッキーなコードはありましたが、オブジェクト指向的な要素をふんだんに取り込んでいる素晴らしい実装でした。これが達人が書いたプログラムかと、今でも思い出すたびに鳥肌が立つ思いです。

なお、効率的なプログラムを実装したければアセンブリ言語を使いなさい、とは言いません。勘違いしないようにお願いします。

国内達人組込みエンジニア vs アメリカの著名研究所の研究員

余談ですが、ベテランエンジニアがある処理をC/C++言語で実装しました。たまたまですが、必要に迫られて同等の機能を、アメリカの著名な研究所の研究員がアセンブリ言語で実装していたのです。二人が同じ処理を実装していたことを知り、「どちらが作ったものが早いか競争しよう」となったのです。皆さんは、どちらが勝ったか予測できますか?

勝ったのはC/C++で実装したベテランエンジニアでした。スマートな実装をしていたこともありますが、勝った要因の多くはコンパイラです。コンパイラが優秀だったため、研究員のアセンブリ言語より高効率な実行コードを生成したのです。研究員は地団太を踏んで悔しがっていました。

組込み開発エンジニアが高効率なプログラムを書くために

興味のある方は、コンパイルスイッチの最適化オプションを変えてコンパイルして得られたアセンブリコードを比較してみてください。実行速度を比較してみても良いでしょう。

デバッグレベルの最適化で生成されたアセンブリコードは、素直で分かりやすいコードです。一方、リリースレベルの最適化で生成されたアセンブリコードは、もはや人間には一筋縄では理解できません

優秀なコンパイラは、生成したアセンブリコードを更にこねくり回して、同じ結果が出る処理速度が速いアセンブリコードに生まれ変わらせるのです。

高効率なプログラムを書く場合、C/C++やその他の高級言語を使い、アルゴリズムの最適化を頑張り、優秀なコンパイラに任せる方が近道と言えます。(どのように書けばコンパイラがどうアセンブリ言語に変換するのかを理解しておくと鬼に金棒です。)

ちなみに、当社では組込み開発を始め、様々なシステム開発の相談、設計、実装を全国対応で行なっています。無料相談も実施していますので、お気軽にご相談ください。

この記事を書いた人

株式会社スクラムソフトウェアで、長年の組込み開発エンジニアとしての経験から、実際の開発業務と若手エンジニアの技術指導を行っています。

目次