Embedded World 2021への道:第2回
私の頭の中は、複雑さとそれを一般的に減らす必要性の板挟みにあります。私のプレゼンテーションでは、何十年にもわたって複雑さにどのように対処してきたかを示し、どのようにして今の場所にたどり着いたのかを人々に思い出させ、あまり知られていない単純化のテクニックをご覧にいれようと思っています。
先月も言いましたが、セミリタイア状態なので技術的な事柄を追求する時間があります。最近、クライアントの組み込み開発ツールを使いこなす際に、忘れてしまったC言語の構文を調べなければならなかったので、ブライアン・カーニハンとデニス・リッチー(K&P)の『The C Programming Language』(邦題:プログラミング言語C)を手に取り、勉強し直しました。実はこの教科書本は、初版と第2版の両方を持っています。
出典:Wikipedia(https://en.wikipedia.org/wiki/The C Programming Language)
まえがき、はじめに、第1章を読み返していたら、この言語を学び始めた頃の記憶が蘇ってきました。私は1970年代の後半、アセンブリ言語のプログラマーとしてキャリアをスタートさせました。自分の思考をより高いレベルの概念に切り替えるのに苦労したことを覚えています。アセンブリ言語のプログラミングは、私のHP-67プログラム電卓のプログラミングのようなものでした。正しい結果を得るために、マシンのレジスタと手順を直接操作するのです。私はアセンブリ言語プログラマーになりました。アセンブリ言語は、プログラムを書くのは面倒でしたが、シンプルなものでした。当時の私にとっての唯一の利点はCPUを切り替えることだったので、この上位レベルが本当に価値があるのかどうか疑問に思いました。
私のアセンブリ言語プログラムは、オハイオ州シンシナティのボールドウィン・ピアノ&オルガン・カンパニー社製の電子楽器に組み込まれた9つのマイクロプロセッサのうちの1つに使用されました。ボールドウィンは電子オルガンを発明し、最先端の技術にこだわりました。ミュージシャンが演奏している和音をデコードしながら、伴奏のリズムを生成するには、非常に厳しいリアルタイム制約がありました。パフォーマンスを予測できれば成功も同然でしたが、複雑さを軽減することはできませんでした。
とにかく、K&Rの教科書本の第1章はどれもチュートリアルです。うれしいことに、本に載っている例題を私のLinuxマシンに打ち込み、逐次コマンドを実行してこれらのサンプルコードをコンパイルし、それを実行するとすべてが説明どおりに機能しました。とてもいい気分でした。この本は1978年に初版が発行されたものです。私のLinuxマシンは、2020年10月7日にリリースされたLinuxの最新バージョン(つまり、5.8.14)を実行していますが、単純なCプログラムの動作を妨げるものは何も変更されていません。よく出来たものです!「動くなら下手にいじるな」という格言を思い出しました。
これを受けて、C++の本も手に取って導入部を読み直すことにしました。1991年に出版されたビェルネ・ストロヴストルップ(Bjarne Stroustrup)著『The C++ Programming Language, 2nd edition』(邦題:プログラミング言語C++第2版)です。私が所蔵しているCとC++の本は、どちらもそれぞれのプログラミング言語作成者によって書かれたものです。発明者の考えを読むのは楽しいものです。後続の著者たちによって書かれた本は、先行の著者の考えを読める利点があったため、物事をより明確に説明しているかもしれませんが、概念を学ぶために実際に必要なものがいくつもあると肥大化する可能性もあります。
出典:https://stroustrup.com/2nd.html
ストロヴストルップ氏は、わずか10ページで、C++における彼の目標(コンピュータ科学者の目標と言ってもいいかもしれません)を推進した一連の技術について説明しています。その戦略とは、コンピュータプログラムで解決できる現実問題のモデリングの複雑さを根本から軽減することでした。
彼は、手続き型プログラミングから始め、モジュラープログラミング、データ抽象化、そして最後にオブジェクト指向プログラミングを説明しました。おさらいすると、ストロヴストルップが表現した手続き型プログラミングはこうでした。
彼はモジュラープログラミングを、こう表現しました。
ここでは複雑さを減らすために、モジュールの中にデータを隠す、つまり非表示にします。これはシステムを単純化するための重要な属性で、それがカプセル化の概念の始まりです。
ストロヴストルップは、データ抽象化のパラダイムをこう続けます。
彼によれば、データの抽象化には問題がないわけではありません。彼は、抽象化を新しい用途に適応させるには、その定義を修正する必要があると説明しています。したがって、一度定義を修正する必要があると、定義されたものを正確に再利用することはできません。これにより、彼はオブジェクト指向プログラミングの概念にたどり着きます。
これで、階層の概念ができました。これは、複雑さを軽減するためのコア概念です。
私がこのブログシリーズで書いていることは、Embedded Worldでの私の基調講演のための準備リサーチではありません。私は自分の技術の数珠つなぎのカスケードに乗っかっていますが、一連のブログで書いている概念が私の思考を形作ったものです。次回は、もっと多くのことをお伝えしたいと思います。
Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.
Visit TechForum