C言語プログラミングに関するスモールトーク

毎週お届けしている本コラムも今年の12月には10周年を迎える。筆者は連載当初から参加しているメンバのひとりであり、10周年かと思うとなかなか感慨深いものがある。この10年を振り返ってという話題はまた別の機会に譲るとして、筆者自身はずいぶんと変化した。そのひとつに「連載当初はバリバリとプログラミングをしていた一方で、最近は自らコードを書くことがめっきり少なくなった」ということが挙げられる。「これが35歳定年説の実体か?」とも思いつつ、それでも先日、とあるプログラムを書くためにコードの森を探検するチャンスが久しぶりにあった。今回はそのときに気がついた「ちょっとしたトピック」を紹介しよう。

C言語によるオブジェクト指向プログラミング

世の中に「オブジェクト指向プログラミング」という考え方がある。古くから提唱されている概念であり、近代的なプログラム言語はほとんどオブジェクト指向でデザインされているといっても過言ではない。オブジェクト指向の概念を乱暴に説明すると、扱うデータを「オブジェクト」と呼ぶ塊として捉え、さらにそのデータを操作するプログラム(これを「メソッド」と呼ぶ)も、そのオブジェクトの持ち物として扱おうというものだ。これによりデータとアルゴリズムが散逸することを防ぎ、プログラム開発の効率が高まったり、プログラムを維持する保守性が向上したりといったメリットが期待されている。

ところで未だに様々なシーンで活用されており根強い支持を受けているプログラム言語にC言語がある(本コラムのバックナンバー「C言語はなぜ廃れないか」も参照されたい)。C言語は歴史も古く、当然ながらオブジェクト指向言語ではない。しかしオブジェクト指向の考え方に基づくプログラミングスタイルはC言語でもそれなりに実現することができ、例えばCOOL (C-language’s Object Oriented Language)といったプログラミング手法も提唱されている。筆者もその昔画像処理のC言語ライブラリを開発した際に、オブジェクト指向をベースとしてC言語ライブラリを設計した経験がある。C言語ながらオブジェクト指向を取り入れて美しくデザインされたGTK+というプログラムライブラリに感銘を受け、見様見真似で自らのライブラリを設計したものだ。

オブジェクト指向プログラミング言語ではないC言語で、なぜわざわざオブジェクト指向をやろうとするのか。その答えはいくつかあるが、ここでは「オブジェクト指向の考え方は優れているが、それをプログラム言語でサポートしようとするとどうしてもプログラム言語の仕様が膨らんでしまう」という点を指摘しておきたい。「C言語はなぜ廃れないか」でも指摘したように、C言語はハードウェアに近いシンプルなプログラミング言語である。一方で、オブジェクト指向プログラミング言語の多くはいわゆる高級言語として提供される場合が多い。それ故に、システムに近いところをプログラミングしたり、汎用性を確保したり、パフォーマンスを重視したりといったプログラミングではC言語が有利となる。このようなC言語の柔軟性とオブジェクト指向の開発効率を両立させようとしたとき、C言語でオブジェクト指向プログラミングをする意義が出てくる。

オブジェクトシステムの実現

先に紹介したGTK+から派生したライブラリで、GObjectというシステムがある。このGObjectはまさに、C言語でオブジェクト指向プログラミングを実現しようとするための基礎的なコードを提供するものである。本ライブラリも版を重ね、かなり高度なオブジェクトシステムを構築することができるようになっている。

ところが物事は一般的に、多機能になればなるほど複雑になる。そして複雑になればなるほど使い方が難しくなる。そこで高度に複雑化したGObjectには、オブジェクトを簡単に使えるようにするためのからくりがいくつか用意されている。そのひとつがGObject Builderと呼ばれる仕組みである。このGObject Builderを使えば、GObjectを設定するための複雑なC言語プログラム・ソースコードを書かずとも、簡略化されたGObject Builder用ソースコードを書くだけでGObjectを利用できるというのだ。

GObject Builder用のソースコードは、C言語にオブジェクト指向のエッセンスを散りばめた独特のプログラムスタイルで記述される。同プロジェクトのウェブサイトに掲載されている説明によれば、その文法はJavaの影響を受けているとのこと。Javaの文法がその根本的な部分に関してC言語に影響を受けていることと対称的で面白い。

C++が通った道と同じ道

さてここまで読んで「cfront」という言葉を思い浮かべた方は、古くからC++プログラミングに親しんできたベテラン開発者か、もしくは特殊な環境でC++プログラミングをされている開発者の方に違いない。

C++というプログラム言語がある。これはC言語にオブジェクト指向プログラミングの文法を組み込んだ、C言語のオブジェクト指向拡張ともいえるプログラム言語である(同様のアイデアでC言語を拡張したプログラム言語に、Objective-Cという言語もある)。このC++、現在でこそC++で書かれたプログラムのソースコードを、直接、オブジェクトコードに変換できるが、その昔は、いったんC言語のソースコードに変換してからC言語のコンパイラ経由でオブジェクトコードに変換していた。そのC言語ソースコードへのトランスレータがcfrontと呼ばれるツールだった。

GObject Builderを利用したプログラミングは「GOBソースコード → Cソースコード → オブジェクトコード」という変換をたどる。これは「C++ソースコード → Cソースコード → オブジェクトコード」という昔のC++プログラミングを彷彿とさせる手続きだ。

GObject Builderの立場は「あくまでC言語プログラムの一部として利用するためのツール」であり、新たな言語を開発したのではないという違いはある。GObject Builderの開発者はこのことを意識していたかどうか、とくにこの件に関する記述が関連文書の中には見つからなかったため、その答えは定かではない。しかしcfrontの出力したCプログラムを追いかけてデバッグしていた時代を懐かしく思い出したオジサンプログラマは、「歴史は繰り返すものだなあ」と感慨に耽った次第である。