トリッキーなコードを書こう!

高木です。おはようございます。

「C++ 経験者」の検索結果が1ページ目に浮上したかと思ったら、すぐに陥落してしまいましたね。
まあ予想通りの展開です。
これ以上は本腰を入れてSEOしないといけないので、やめておきます。

今回の話題は、タイトルの通り「トリッキーなコードを書こう!」です。
以前にも書きましたが、ブログなタイトルはキャッチ―なものにすべきなので、タイトルだけを見て早合点するのはやめたほうがいいです。

はじめに、「トリッキー」について説明しておきましょう。
このブログはいろんな方が読まれているので、知っていることを前提に話すのはやめたほうがよさそうですからね。

「トリッキー」というのは、trickの形容詞で、「奇をてらった」とか「ずるい」とか「巧妙な」といった意味があります。
プログラミングだけで使う特殊な用語ではなく、スポーツなど、全然の別の分野でも使われる言葉です。
プログラミングの世界では、普通はトリッキーなコードというのは嫌われます。
一方で、主に遊びの目的で、トリッキーなコードに挑戦したり、競い合ったりすることもあるようです。

後者の遊び目的については、やりたい人はやればいいですが、私はほとんど興味がありません。
そうではなく、実践的な目的でトリッキーなコードを書けるように訓練することをいつも勧めています。

これは何も、やみくもトリッキーなコードを多用するように勧めているのではありません。
日ごろからのトレーニングとして、トリッキーなコードを書く練習をすべきだという意味です。
あくまでも練習であって、実際の製品のコードで多用すべきという意味ではないのです。

トリッキーなコードを普段から練習しておくと何がうれしいかというと、できることの限界を広げることができるのです。
素直な書き方しか知らない、できないプログラマーの場合、実現できる範囲が限られてしまうことがあります。

具体的な話をしましょう(といっても難しすぎない範囲で)。

C言語を使っていて、ある型の境界調整を調べたいということはよくあります。
C11であれば_Alignof演算子が使えますし、GCC拡張が使えるなら__alignof__演算子もずいぶん昔から使えます。
けれども、C89からC99ではそういった演算子はないので、別の方法を考えないといけません。

この問題を素直な手法で実現するのは無理というものです。

基本データ型に限れば、一通りの型を手作業で調べて、マクロにでもしておけばいいでしょう。
けれども、構造体のようなユーザー定義型ではそうはいきません。

このようなとき、ちょっとトリッキーな方法を使えば簡単に解決できます。

現在ではこの手法はそれなりに知られるようになりましたので、トリッキーと思わないプログラマーも結構いるかもしれませんね。
でも、多くのプログラマーにとっては、意味が分からないトリッキーなコードにしか見えないと思います。

今回の例のように、誰でも容易に理解できる平易な表現だけでは実現できないことは実際にあるのです。

μITRONのメモリ保護拡張(μITRON/PX)では、ALING_TYPEというマクロを提供することになっています。
TYPEのところには様々な型が入ります。
標準では、VB、VH、VW、VD、VPが入るのですが、それ以外の型に対応してもいいことになっています。

10年あまり前、このμITRON/PX仕様に対応したTOPPERS/HRP2カーネルの開発に少し関わりましたが、そのときにも担当者が悩んでいました。
ALIGN_STRUCTという構造体の境界調整数を調べるマクロを作る必要があるけれど、どうしてもできないということで。
それに対して、上記のalignofマクロを提案することで、すんなり問題解決できたのを覚えています。

これは一例にすぎませんが、少しトリッキーと思えるような手法も、できるようにしておくのは悪いことではないのです。
今回紹介した例のように、それでしか解決できない問題を解決するときには大いに役立ちます。
必要に迫られてから解決方法を模索したのでは、おそらくまともな結論を導けなかったでしょうね。

このように、一般的には嫌われるトリッキーなコードも、日ごろから使えるように訓練し、研究しておくことは無意味ではないのです。