3種類のメモリ
「C++プログラミング言語の歴史と特徴」連載第13回目の今回も前回に引き続き次の公開論文を精読していきます。
第1回連載資料論文
今回は、「3.2 Storage」節の意味を考えます。英文に慣れていない方は、もしかすると、タイトル内の"Storage"という単語に戸惑いを感じられているかもしれません。英文の場合、"同じ単語は繰り返し使用せず、別の単語で置き換える"という習慣のようなものがあるようです。このため、"Storageって何だろう?"と悩んでおられる方は、"Strorageは後になって別の単語で置き換えられるはず"、という気軽な感覚でそのまま読み進められるとよいでしょう。次の文を見てみましょう。
In C and C++, there are three fundamental ways of using memory.
この文には、"memory"という単語があります。つまり、"storage"の別の表現が"memory"なのです。英文に慣れる、英語に上達するということは、闇雲に単語を増やすことではなく、英語文化圏を支える発想を学ぶことです。この逆の姿勢で臨むと、上達しないばかりか、必ず挫折することになるでしょう。ほとんどの日本人は、大変不幸なことに、英語学習における挫折者といってよいと思います。Bjarne Stroustrup氏も英語の学習者の一人ですが、ご覧のようなすばらしい英文を書いています。同氏は、この論文の中で、C++学習論に触れながら、外国語学習について次のようなことを述べています(筆者とStroustrup氏の対話)。私たちには耳が痛い言葉ですね!
"You wouldn't try to learn a foreign language from a dictionary and grammar, would you? "
この英文は、"外国語を学ぶとき、文法や辞書からそれを学ぶようなことはしないでしょう!"と解釈できます。筆者はこの文から、"日本の常識は世界の非常識"という表現を思い出します。
私たちは、Storageはメモリのことであることを知りました。ということは、この第3.2節は、メモリについて論じていることが分かります。ところで皆さん、メモリとはいったい何ですか?皆さんはメモリに関してどのようなイメージをお持ちですか?Stroustrup氏は、(CとC++の視点に立つと)メモリは次のような3種類に分類できる、と述べています。
・Staticメモリ
・Automaticメモリ
・Freeストア
ご覧のように、大変難しい用語が並んでいます。最後のFreeストアという表現は、それほど一般的に使用されるものではなく、通常は、"ダイナミックメモリ"や、単に"ヒープ"、と呼ばれていると思います。このため、第1のStaticメモリと第3のFreeストアはまったく異なる性格を持っていることが分かると思います。Staticメモリの説明を読んでみると、次のような文に出会います。
Static memory, in which an object is allocated by the linker for the duration of the program.
この文を支障なく理解できてしまう人は、おそらく、かなりのベテラン開発者といってよいでしょう。文内には、object、linkerなどの高度な専門用語が登場します。ここでは、Staticメモリというのは、プログラマではなく、リンカという開発ツールによって管理されるメモリであることを覚えておきましょう。リンカとは何か、コンパイラとは何か、という議論はこの連載では行いませんが、ご想像のように、大変難しいものです。ということは、メモリに関しては、次のような結論が出てしまいます。
"Staticメモリを理解することは難しい。さらにいえば、プログラム内でStaticメモリを使用する際には、その使用目的を明確にしておかないと、後になってどのような問題が発生するか予測できない。何らかの問題が発生した場合、その問題を解決することはたいへん難しい!"
Staticメモリの説明には、Global変数、staticクラスメンバ、static変数などの用語も登場しています。Stroustrup氏の代表的な書籍「The C++ Programming Language」(Special Edition)を読むと、"Static変数はグローバル変数の代わりに使用できる"、などという説明もあります。難しいでしょう。なぜ難しいのでしょうか?それは、Staticメモリという概念は、Cから継承したものだからです。Cを学ぶことは可能ですが、C開発者になり、それで生計を立てることは、(筆者は)たやすいことではない、と考えています。このため、メモリに関するこれ以上の説明はいたしません。メモリの使い方をしっかり覚えたい方は、(開発現場で)多数のCプログラムを毎日作ってください。それ以外の学習方法はない、と筆者は思います。
それでは参考のために、残りの2つのメモリの説明も見ておきましょう。Automaticメモリの説明は次のようになっています。
Automatic memory、in which function arguments and local variables are allocated.
この文から判断すれば、Automaticメモリは、関数呼び出し時のメモリの使い方の一つであることが(なんとなく)分かります。説明文内には、stackという用語も見えます。ここでは、Automaticメモリは、関数やスタックと深い関係がある(とともに、バーファーオーバーランなどのセキュリティ問題と深い関係がある)、ということを覚えておきましょう。
それでは最後のFreeストアの説明を読んでおきます。
Free store, from which memory for objects is explicitly requested by the program and where a program can free memory again once it is done with it (using the "new" and "delete" operators).
ご覧のように、大変難しい説明です。ここでは、Freeストアというのは、プログラム内で明示的に(プログラマの明確な目的に応じて)確保されるメモリである、ということを覚えておきましょう。「プログラム内で明示的に確保する」ということは、確保したメモリはプログラマの責任で管理する、ということを意味します。このFreeストアの使い方を誤ると、原因の特定がたいへん難しい問題が発生します。たとえば、Webサーバーなどが"あるとき突然ダウンしたり、動作異常を起こす"ようになってしまうのです。Webサーバーでインターネットビジネスをしている場合、関係者の表情がどのように変化するか想像できますか?真っ青!、でしょう。
今回は、メモリを取り上げましたが、"メモリを理解することはとにかく難しい"ということを学びました。メモリはその機能概要を頭で理解することは比較的簡単なのですが、メモリの効率的、かつ、安全な使い方を学ぶ方法は、日夜の経験以外にはない、と筆者は考えています。初めてCを学ぶ人がポインタや配列で挫折するのは自然のことです。経験がない、からです。そもそも経験のない人にポインタや配列を教えること自体無謀といわざるを得ません。
メモリは難しい!、という叫び声を聞きつけて、それなら、"隠してしまおう"と考えた人たちがいます。彼らの成果が、Javaであり、.NETなのです。このように、C/C++を学んでおくと、Javaや.NETを使用するメリットをはっきり理解できるようになります(メモリばかりにこだわっていると開発生産性は上がりません)。なお、本文内には簡単なソースコードが紹介されていますから、それを応用するプログラムを自分なりに作ってみるとよいでしょう(例_1、例_2)。
前へ |
次へ
Copyright©豊田孝 2004-
2008
本日は2008-12-04です。