スポンサーサイト

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

ちなみに、この知識はかじっただけですから、自分が納得できる説明ですんで、他人には分からないかもしれないですね。この説明だと

ちなみにね。さっきのクラメルの公式で、
1x+ 1y+ 1z= 1
1x+ 2y+ 3z =4
4x+ 3y+ 2z =1

っていうのはできません。なぜでしょう?

それはですね。例えば下の二つの式を足して、できる式 5x+5y+5z =5を考えて、すると、一番下の式を新しくできた式と置き換えて大丈夫なんですね(5x+5y+5z=5 から真ん中の式を引けば、その式を作れるから)。そして、この新しくできた式を「5」で割ると、一番上の式を作ることができますよね?

つまり、この条件は、二つしか式を与えていない、というのに等しいんですね。
すると、一応あのプログラムでは、「できません」的なことを言うようにしといたんですけどね。

まぁそんな感じです。そして、それはクラメルの公式では、3つの変数を公式にかけて出る値が0になると、そうなるんですね。(ちなみに上に上げた意外に矛盾しているというときも、そうなります。)つまり、FF関数のalphaの値が0になると、すぐにreturnするようにプログラムされてますね。

矛盾というのは、簡単には、
1x+1y+1z=1
1x+1y+1z=5

とかいう式を打った瞬間です。その場合もできないとプログラムが勝手に言います。

コメントアウトがない代わりにちょっと、補足しておきました。

ノシ
スポンサーサイト

知ったかぶっちゃ行けないね。誰だよフレネルの公式ってこの公式をHPに書いてたやつ。

すいませーん!!

フレネルの公式とか書いてたけど、正確には

クラメルの公式でした。


すいませんでした。

動的、静的。

ハイ。そして更なる更新です。次は、僕が少し意味分かんなかった言葉です。初心者だからこそ書ける記事かもです。
命題は、「動的、静的。」ですね。ほんと、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なだけに、駄目です。こういうときのために自分でアプリを作れれば!

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

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

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

@説明終了

長々失礼しました。
次回もよろしくお願いします

コンパイラ方式とインタプリタ方式それに中間言語方式

今回は書いたプログラムの実行の方法について、書いてみたいと思います。(結構話がそれていますが)

@説明開始
【概要】
Cなどの言語は、人間に分かりやすいようにされている言わば「高級言語」の部類に入る言語です。しかし、コンピュータは、Cで書けるようになったからといって、人間の言葉を少し理解したわけでは有りません。コンパイルをしますよね。gccとかそういうのです。それくらいは多分誰でも分かると思います。しかし、プログラムを実行する方法はコンパイルするだけではないんです。インタプリタ方式という方法があります。このインタプリタ方式というのは、人間に分かりやすいように書いてある高級言語を、コンパイルしながら実行しているんです。
                
これがインタプリタ方式の実態でしょうか?FC2の描画ソフト使って行ったので字が変ですね(汗)次回からはちゃんと現実世界で書きます...

【コンパイラ方式の長所短所】
この二つの方式はまさに一長一短なんですね。コンパイラ方式の長所としては、実行時の速さが挙げられます。まぁそりゃ当たり前ですね。機械語を実行しているのに他ならないのですから。
逆に、短所には、機械語に変換する手間がかかります。
【インタプリタ方式の長所短所】
基本的にコンパイラ方式の真逆ですね。実行するのに必要なステップを一回ですませる代わりに、コンパイルしながら実行しているわけで、実行効率が悪いんですね。じゃぁこんなの使わなくてよくね?ってことになってしまうんですが、この方式だとどんなOSの環境にも対応できるんですね。例えば、winPCで作ったプログラムを実行ファイルにしてmacに持ってくると使えない(はず)です。ただプログラムは同じなので、プログラムを持ってくればmacで使うことができます。macのアプリケーションがwinで使えないのと同じですね。

【中間言語を使う】
しかし、最近javaなどでは、中間言語を一度介してから、インタプリタ方式で実行するという方法が有ります。(obj-cにはないんじゃない?)これは、二つの方法のいいどこどりのようなものなんですね。(まぁ一度中間にコンパイルしなきゃいけないんだから完全にいいとこどりではないけど)この方式によって、実行効率はインタプリタより速く、しかし様々なOS環境に対応させることができるようになるんですね。

@説明終了

いつも、Cなどでなんとなく使っているコンパイラですが、ほかにも様々な方式(二つ)があることが分かりましたでしょうか?

まぁ知っている人がほとんどだとは思いますが、一応メモがてら更新しました。

なんでクラスなんてつくるの?

どうも。今回は、クラスにすると、大まかに何が便利なんだろう?ってことについて、書きたいと思います。
@説明開始

【クラスって何が便利なの?】
まぁ、みなさんもご存知のように、クラスを作ることによって解消される問題は、まず、複数の処理する内容(メソッド)と、複数の変数(インスタンス変数)をまとめることが挙げられます。
このようにすると、何が便利かな?って考えてみます。例えば、数年間によってたまったプリント(現在学生なので学生っぽい感じの表現です。ハイ。)、この中には様々な知識が詰まっていますね。しかし、数年すれば、その量はとんでもない数になっているはずです。この中から、知りたい内容を取ってくるのは、大変です。
しかし、いつに配られたプリントなのか?どのような種類のプリントなのか?のように分けていくと、だんだんその複数のファイルに分かれていきます。この中から、欲しい情報を取ってくるのは簡単だってことは、すぐに分かりますよね?
つまり、クラスに分けることで、整理整頓をしているということなのです。
さらに、クラス分けをすることの効能はこれだけではありません。クラスに分かれるということは、複数のクラスの中に、同じ名前のメソッドがあっても大丈夫ということも有ります。書類をフォルダ分けするとき、フォルダさえ違えば名前が同じでも大丈夫ということと同じですね。

また、クラスにすることによって、グローバル変数みたいだけどローカル変数のようでもある変数の作成(=インスタンス変数)を作ることができます。
グローバル変数は、プログラムが実行されてから、実行終了まで、存在するのですが、どこからでもアクセスできてしまうため、プログラムのその変数が変な動きをしたとき、片っ端からその原因について調べなくてはなりません。短いプログラムなら大丈夫ですが、長いプログラム(行数が万単位のような)になると、それを調べるのは本当に大変です。
ローカル変数は、小さな範囲からしかアクセスできないような変数です。しかし、その性質上プログラムで呼び出し時に作られた後抜けるときには、消えてしまいます。
つまり、インスタンス変数は、この両者の良いところのみをとった変数です。つまり、影響範囲は、選択したものに抑えますが、必要になるときから必要にならなくなるまで残り続けます。

最後のクラスの効能として、プログラミングの効率を上げるということが有ります。これは、必要なものをクラスにまとめておくことで、実行時に、複数のインスタンス作ることで、その分だけメソッドを呼び出すことができます。

このように、クラスを作ることによって、色々良いことが増えるわけです。
@説明終了

つまり、二度手間のようにも感じてしまうかもしれないクラスの作成はとても大事な作業なのです。
プロフィール

小さなプログラマ

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

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

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

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

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

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

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

この人とブロともになる

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