スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

動的、静的。

ハイ。そして更なる更新です。次は、僕が少し意味分かんなかった言葉です。初心者だからこそ書ける記事かもです。
命題は、「動的、静的。」ですね。ほんと、appleのドキュメントや、wikipediaは分かりにくいんですよ。みても全くわからない。今回は、この二つの言葉に発展して、オブジェクト指向言語のメモリの使われ方について書きたいと思います。そしてさらには、ガベージコレクションにまで発展させていきたいと思います。もしかすると、時間的都合で二回に分けるかもしれませんが、書く前にそんなことは分からないので先に宣言しておきます。

@説明開始
【動的、静的】
動的。なんて言われてもなんにもわからない(だからこそ初心者なんだ!)。動的とは、プログラムの実行時に行われる処理、逆に静的とは、プログラムのコンパイル時に行われる処理のことだったんですね。これで、今回の命題についての説明は終わってしまいます。(こんな少しでいいんだから書いてくれればいいのに。って書いてあるのかな?知らないけど)なので、ついでにオブジェクト指向言語のメモリの使い方についても説明します。

【オブジェクト指向言語のメモリの使われ方①概要】
基本的にプログラムが実行するときにひつようなメモリ領域は三つです。静的領域とヒープ領域とスタック領域です。まず、静的領域はどのように使われるのか?この時の「静的」の意味は、文字通り動かないということを表しています。つまり、プログラムの開始から終了まで変わらない情報、つまり、グローバル変数や実行するコードを格納します。また、この二つを格納することから、静的変数領域、コード領域の二つに分けて説明することも多いです。
次に、ヒープ領域です。これは、静的領域の逆ですね。つまり「動的」な情報が格納されるわけです。つまり、ここには、作られたり消されたり、様々な動きが起きるんですね。
最後に、スタック領域です。ここは、スレッド制御のために使われます。じゃぁスレッドってなんなんだよ。ってことになります。
スレッドとは、コンピュータの実行単位の一つと言えば分かりやすいかもしれないですね。プロセスのような単位です。wikiはここですhttp://http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89_%28%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%29。まぁコレみても難しいんですので簡単に説明すると、例えばskypeというアプリケーションありますよね?しかし、skypeで友達を待っているとき、そのまま待っていてもつまらないので、webブラウザなどを立ち上げて、ウェブサーフィンなどをしたりしますよね(少なくとも僕はそうです)。そして、それらのスレッドは、skypeは、チャット送受信を行うスレッドだったり、ビデオチャットをするスレッドだったりがあります。また、webブラウザには、入力を受け付けてるスレッドだったりとにかく色々なものがあります。つまり、スレッドとは、このようなものの単位と考えてください。
したがって、スタック領域には、ローカル変数や、メソッドの引数などが、格納されることになります。

ハイ。追記です。(2010/12/26)
ええと、どこまでいったか忘れてしまいました。確か(上見ればいいんだがめんどくさい。)、3つの領域と、その使い方(オブジェクト指向プログラミング言語の)についてまででした(だったはず)。では今回はその先についてと、最後はobj-c2.0の新機能の一つガベージコレクションについて説明して今回の記事を終わらせたいと思います。
【オブジェクトの生成】
で、ここからガベージコレクションに話を飛ばすためには、この話をしなければならんのですね。オブジェクトはどこにどんな感じに生成されるのかを簡単に説明します。
オブジェクトが生成されるとき、このオブジェクトどこに格納されるのかな?っていうと、入ってきたり出て行ったりする場所。ヒープ領域に格納される訳です。ええ!?って僕は思ったんですが、(僕だけかもしれない)こんなことしたら、メモリが圧迫されそうですよね(このことをメモリリークといいます)。ですが、最近はPCの性能も上がりこんなことをしても大丈夫になったのです(まぁだからこそ昔は無かったのですね)。ただ、さすがに現在の市販の安いPCの場合こんなことばっかりずっとやってて、不要になったインスタンス消すのを忘れてると(メモリの解放ですね)、メモリリークされてきます。ここで登場するのが!ガベージコレクション(ゴミ集め)なんですね(ですね、ですねいいすぎですねいいかげんうざくなるかもしれないまぁ押さえといてください)。
【参照(ポインタ)】
そして、ガベージコレクションを理解するための最後の項目です。「ポインタ」、「ポインタ」、「ポインタ」...
ほんと、ポインタというと頭が真っ白なのか真っ黒なのか分からなくなったりしますが、まぁ実はそこまで難しくないので(今回は)大丈夫だと思われます。というより、参照という方がいいのではないでしょうかね。まぁポインタでよくある例は、「住所」を使って行う説明でしょうね。まぁでもそれはおいておいて、(これからは参照に統一します。あ、気まぐれでもしかするとポインタとか書くかもしれないですが)本題です。オブジェクトを生成するとき、変数に格納したりしますが、そんときに変数に格納されてるのが参照なんです。つまり、オブジェクトは参照しまくっているってことですね。んん。説明が下手なことを実感する。絵を描きたいんだが、この前の絵での疲労度がトラウマとなって書きたくない。後で、良い描画のフリーソフト取ってこなきゃ(というか考えてみると確かxcode内蔵のサンプルコードとして、描画ソフトが入ってるんだよな。あれでもいいか。多分使いにくかっただろうけど)。macなだけに、駄目です。こういうときのために自分でアプリを作れれば!

では暇だったら、今度絵を乗っけとくんで、今覚えるべくは「オブジェクトはお互いに参照し合っている」ということです。
【ガベージコレクション】
「オブジェクトは参照し合ってる」ということを、一つ前に書きました。これをしっかり覚えておいてくださいね。
オブジェクト指向プログラミング言語は、オブジェクトを生成するとそれをヒープ領域に格納すると書きました。そして、メモリリークを防ぐためには!ガベージコレクションとかいう変なのがあるってとこまで触れましたね。
「ガベージコレクション」を直訳すると、「ゴミ集め」です。つまり、メモリリークを防ぐためヒープ領域を無駄に使っている邪魔者を除去してくれるのです。実際では、プログラマがオブジェクトをヒープ領域から取り除く作業を行わなくても勝手に邪魔者とガベージコレクタ(ガベージコレクションを行うシステムのこと)が、勝手に取り除いてくれるという非常に便利なものです。

でもどうしてガベージコレクタは、ヒープ領域にあるたくさんのオブジェクトの中から、「ゴミ」を見つけられるのでしょう?
答えは、さっきまで強調していた「オブジェクトは参照し合っている」ということにあります。つまり、どのオブジェクトからも参照されなくなったオブジェクト、それは、「ゴミ」になります。一番最初参照するのは、外から(ヒープ領域外から)ヒープ領域内のオブジェクトを参照し、参照の手をどんどんつないでいきます。しかし、誰からも参照されなくなってしまった仲間はずれのオブジェクトは処分されてしまうのです。でも、それだけではありません。自分は参照しているけど、誰からも参照されていないオブジェクトも処分されます。さらに、二つもしくは複数くらいでループしているが、外からの参照は受けていないオブジェクトも処分されます。つまり、お互いに参照し合っているが、根本にたどることができない参照の手のつなぎの部分これも処分されます。

う~ん。長ったらしい上に、要点の分かりづらい文になってしまった。上の部分をまとめていうと、「参照し合っているオブジェクトのネットワークの中で自分の部分から根本にたどることのできないオブジェクトが処分の対象になる」ということです。コレも今度絵をのせますね。

@説明終了

長々失礼しました。
次回もよろしくお願いします
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

小さなプログラマ

Author:小さなプログラマ
小さなプログラマです。

これはあくまで、「勉強ログ」なので間違っている場合が多々あります。

なので、このブログに書いてあることは、8%くらいの信じ度でお願いします。

間違っているじゃないか!と言われてもあれなので。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
メールフォーム

名前:
メール:
件名:
本文:

カテゴリ
カウンター
検索フォーム
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。