ビジネス WinDbg入門 アクティブなスレッドと非アクティブなスレッド


C++設計者から見たC言語

 「C++プログラミング言語の歴史と特徴」連載第11回目の今回も前回に引き続き次の公開論文を精読していきます。

第1回連載資料論文

 今回は、「3 The C Programming Model」節の最初の2つの段落の意味を考えます。2つの段落は、Cの概要を解説していますが、その解説はあくまでも、Bjarne Stroustrup氏から見たCの概要であることを忘れないようにしましょう。Stroustrup氏は、C++は自分の世界観や哲学の反映、という立場をとっています。しかし、Cに関しては、これは筆者の考えですが、自分の世界観や哲学を表現したものとはみなしていない、と思われます。簡単に言ってしまえば、Cは自分の考えを表現する言語ではなく、あくまでもマシン(電子回路)を使うもの、とみなされていると思います。もしこれが事実に反しているとしても、CとC++の間には大きな発想上の違いがあると認識しておいた方が賢明です。設計上の発想はまったく異なっているからです。

 この節のタイトルは、「The C Programming Model」となっています。英語でSleeping Babyといえば、"今眠っている赤ん坊"という意味ですが、Sleeping carとなると、"眠るための車、つまり、寝台車"という意味になるようです。Programming Modelは、英語文法的にはSleeping carに近く、"プログラミングするためのモデル"と解釈できます。このため、「The C Programming Model」というタイトルは最終的には、"Cでプログラムを開発する際に知っておくと便利な発想や考え方"、と考えて差し支えないでしょう。

 第1段落は、"A fundamental property of computers in widespread use has remained remarkably constant.."という文で始まっています。プログラミングの入門書などをお読みになったことのある方は、このような文を目にすると、"なるほど"と感心したり、"その通り"と首を縦に振られていることでしょう。多くの入門書は"新しいIT技術が次々に登場しても、コンピュータの基本は変化しない"と主張しているからです。しかしこの段落は、次の文で終了しています。

"Either way, from a higher-level language point of view, the use of these facilities is messy and machine-archtecture-specific."

 この一文は、C的な発想を否定しています。文内の「a higher-level language」は、C++を指していると考えて差し支えありません。つまり、C++から見た場合、コンピュータが進化しようが退化しようが基本的にはどうでもよい、というわけです。もちろん、C++は現実にはC機能をサポートしていますから、コンピュータの内部構造の変化などどうでもよいことにはなりませんが、作業効率を重視するアプリケーション開発者にとっては、"コンピュータの内部構造の変化などは、どうでもよいこと"であることは間違いありません。

 第1段落では、上から3行目にある"function call stack"という表現を覚えておきましょう。これはスタックレジスタを活用したメモリ管理を指し、基本的には、プログラマではなく、コンパイラ開発者の問題です。ご存知じかと思いますが、関数呼び出しでは、使用されるメモリはスタックレジスタ経由で管理されます。このメモリ管理はパターン化され、単純そのものですから、"バッファーオーバーラン"がいとも簡単に発生し(インターネット越しに外部から自分のメモリを勝手に再利用されてしまうこと)、インターネットが普及した今日では、セキュリティホールを作り出す最大の原因となっています。

 第2段落は、"C is by far the most successful language providing the programmer with a programming model that closely matches the machine model."という文で始まっています。この文は、簡単に言ってしまえば、Cのプログラミングモデルはマシンモデルと同じ、と述べています。プログラミングモデルというのは、すでに述べたように、プログラムを作るうえで知っていると便利な発想や考え方という意味を持っていますから、この文は、"プログラミング言語Cを使用するときには、コンピュータの内部構造を知っていると便利ですよ"と述べていることになります。筆者は、このような背景もあり、"Cはコンピュータ初心者(や生産性を重視するソフトハウス経営者)が採用すべきプログラミング言語ではない"と考えています。Cは、プログラミングの知識とコンピュータの知識を同時に要求する、きわめて難しい言語といってよいのです。相当の覚悟がなければ、C言語で生活できるようにはならない(つまり、家族を養えない)、と筆者は考えます(裏を返せば、いったん習得してしまえば、手放せないことになるでしょう)。

 第2段落の中ほどには、"functions for program abstraction"という表現が見られます。この表現の意味を説明する前に、皆さんに質問です。皆さんの考えておられる"関数"とはどのようなイメージですか?おそらく、ほとんどの人は、ある機能を提供する便利な道具、という感じではないでしょうか。つまり、適当な引数を渡して、必要な処理をしてもらい、その結果を受け取る、ということです。それでは、Stroustrup氏の表現を見てください。直訳すれば、"関数とは、プログラムを抽象化するためのもの"となります。皆さんの知識は、この表現の前では、"知識とみなされないほど陳腐なもの"と映ってしまいますが、いかがでしょう?

 "functions for program abstraction"を正確に解釈するためには、Stroustrup氏の人柄、人生観などを理解しておく必要があります。はっきりしていることは、我が国でこのような表現を用いることができる人はまずいない、ということです。関数というのは確かにプログラミング作業では必ず使用するものです。関数なくしてCプログラムは存在し得ないでしょう。"functions for program abstraction"は、"関数というのは、プログラムを抽象化するための道具"という意味ですが、さらに一歩踏み込んで解釈すれば、"プログラムというのは、私たち人間の認識内容の表現であり、Cはマシン指向言語ではあっても、表現の道具としてかろうじて関数を持っている"、ということになります。この意味では、関数は表現力に富むCプログラムを書くための道具、です。Cには関数に加えて構造体というものがありますが、C++にはそれをさらに発展させたクラスがあります。さて皆さん、自分自身や自分の感じていることを表現したい場合、どちらの言語が表現力に富んでいると思いますか?

 「abstraction」という単語は、Stroustrup氏が好んで使用する単語の一つです。一般的には、抽象、抽象化されたもの、などの意味ですが、抽象化する、とはどういうことでしょうか。それは、"無視する内容を選択すること"です。自白すれば、この表現もStroustrup氏の書籍で学んだものです(参照)。"豊田孝を表現すること"は、"豊田孝の一部を無視すること"です。いかがでしょうか。皆さん。C++の世界は結構奥が深いでしょう。

前へ | 次へ



 WinDbgスクリプティング講座  ホーム


Copyright©豊田孝 2004- 2008
本日は2008-12-04です。