開発者が語る、無線技術についてや製品開発の秘話、技術者向け情報、新しく興味深い話題、サイレックスが提供するサービスや現状などの話題などを配信していきます。11:36YS前回に続き、プログラミングの話です。単純に数を数えてみるさて「数を数える」プログラムコードを考えてみましょう。最初に思いつくのは、グローバル変数を定義して必要なときに加算や参照することです。いう風に変数が増えてゆき、段々「どれが何を数えているんだっけ?」と混乱してきます。何であるか」をソースコードと別のドキュメント(※註)に記すことが「良いプログラマー」の行いとされていました。※註:いわゆる「変数仕様書」です。当時はこういうドキュメント類も手書きの紙の書類でした。それどころかソースコード自体も紙に鉛筆で書いて「パンチャー(何故か女性作業員が多かった)」に渡しマシンに「打ち込んでもらう」時代もありました。今ではそんな職場光景は想像すらしにくいかも知れませんね。実はそんなに単純でもないさて「単純」なはずのこのプログラム、場合によっては正常動作しません。数千回に一回カウントが「すっぽ抜ける」現象が起きたりします。値を弄るようなことをすれば発生します。操作と呼びます)、「値を書き戻す」前に割り込みが入ると「書き戻すべき値が書き換えられており、そこに古い値を上書きしてしまう」ことが発生するからです。Condition)と呼んだりします。値の操作前後を割り込み禁止に設定したりします(※註)。いった機能が実装されていますが、詳細は割愛します。操作を行う可能性のある場所全てに適切な割り込み操作を行わなければならないことです。増えていた場合は、それらに対しても対策が必要です。全てのファイルを検索して全ての対応箇所に2行を挿入してゆくのは大変で、見落としとかコピペミスとかの「ケアレスミス」混入の余地もどんどん上がってゆきます。Programming)の考え方では、繰り返される定型操作は「サブルーチン」としてまとめることが推奨されます。言語の場合、これは「関数」という形で実装されます。いう関数呼び出しに換えれば良いわけです。これには「お約束を1箇所にまとめてコードの見通しを良くする」とか、「移植時に弄る箇所が1箇所に集約される」といったメリットも一緒についてきます。剥き出しのグローバル変数のままです。書いて「数千回に一度のすっぽ抜け」を再発させてしまわないとも限りません。古典的な構造化プログラミングでは、そういう「うっかり」を防ぐ仕組みを作ることができません(可能だけれども無駄に複雑になったり、不自然なコーディングが必要になったりします)。Programming)は、そこに枠組みを与えることができます。{disable_interrupt();cnt++;enable_interrupt();}};という格好で「カウンタークラス」を定義します。count.get());のような格好になります。クラスは構造体の拡張であり、「オブジェクト名.メンバ名」でクラスの内部メンバにアクセスすることができます。置いてあるので「外から」直接操作はできません。操作の前後で割り込みが禁止されることは自動的に保証されます。これを「隠蔽」と呼んだりもします。クラスは柔軟で強力な機構ですが、「型」に縛られる弱点があります。型を使いたい)場合があるかも知れません。「テンプレート」という文法が拡張されました。テンプレートを使ったカウンタクラスは下記のようになります。クラスを使う側の都合で型を指定します。ところに入れる型」です。型だろうが、その「型」がテンプレートで使われている演算子(ここでは参照、代入、加算の3つ)をサポートしている限り「何でも」渡すことができます。それに実用的意味があるかどうかは別ですが。テンプレートを使うことにより、ソースコードから「型」を排除して純粋なアルゴリズムの骨組みだけを実装することも可能です。Programming)」と呼んだりもします。純粋クラスは「構造体と関数のセット」であり、コンパイラを通すと「クラス構造体へのポインタを第一引数に持つ関数群」がオブジェクトとして生成されます。テンプレートクラスでは呼び出し側で指定するまで型が未定なので、原則として事前コンパイルができません。マクロに近いものになっています。いまどきのコンパイラではテンプレートクラスでもライブラリを作れるようにはなっていますが内部的にはかなり無茶なことをやっていて、その無茶はコンパイルエラーのメッセージやデバッガでのシンボル表示に現われます。画面を2周3周するほど長いエラーメッセージやデバッガでの引数表示を見るとゲッソリします。テンプレートまで「以前はどうしていたのか」「それでどんな問題が起きて」「何故新しい言語が発明されたのか」を解説してみました。クラスには「継承(Inheritance)」とか「多様性(Polymorphism)」といった機能も重要ですが、今回はバッサリ割愛しています。いう「オブジェクト指向ならでわの機能」を大上段に振りかぶって解説することは、「オブジェクト指向ってなんか難しい」と敬遠される原因になると思っています。いいや」と投げ出してしまった人が少なくないんじゃないかと思います。動的メモリ管理(new/delete)必須なんだよね?」という誤解を解く一助になれば幸いです。個人情報の取り扱いについて。