なぜ変数宣言のようなメモリに自由に名前を付けるシステムがつくられたのでしょうか まずはここで基本的なことを学んでみましょう

コンピュータのメモリにはなぜアドレスがつけられているのでしょうか?アスキーコードのようなものがつくられたのはなぜでしょうか?なぜ変数宣言のようなシステムが作られたのでしょうか?

#include < stdio.h>


#include < stdlib.h>



int main(void)


{


puts("Hello,World");


return EXIT_SUCCESS;


}


コンパイル結果


Hello,World


これは 「Eclipse」という統合開発環境でかかれた


プログラムです。


「Eclipse」統合開発環境では


他の統合開発環境では


return 0;となっているところが


return EXIT_SUCCESS;と書かれている場合がおおいいですね。


特徴ですね。


ためしに私たちのつかっている統合開発環境で


上記のプログラムをコンパイルしても


ちゃんと


コンパイル結果


Hello,World


が表示されます。


今のプログラムの中に


#include < stdlib.h>


と記述されていますね。


実は


return EXIT_SUCCESS;


を使用するには


#include < stdlib.h>


の記述が必要なのですが・・・



一体


#include < stdlib.h>


は何を意味しているのかというと・・・」


アレサ「はいっ


また別の情報が転送されてきました。


統合開発環境がちがうということは


その中のソースコードを機械語に翻訳する


コンパイラにも違いがあるというわけですね。


たとえば


コンピュータ内の


実数をもちいた計算において


計算結果を


小数点以下6位に収める際


小数点以下7位を


四捨五入するか そのままきりすてるかなど


具体的には


コンピュータ内で


数値計算


5.45678×3.45678=18.8628879684


が行われたとすると


この計算結果を


小数点以下6位までを表示する


%f出力変換指定子をもちいて


コマンドプロンプト画面にprintf出力表示するとき


小数点以下7位を四捨五入して


18.862888と表示するか


小数点以下7位を切り捨てて


18.862887と表示するかは


処理系(コンパイラ)によってちがいがあります。




010101110101010100001010100・・・・


はい、


文字コードについて


なぜ


文字コード=アスキーコードのようなものがつくられたのか?


ですか・・・


こちらの世界で少し調べてみましょう。


ええと


解析をこころみます。


010111010100100101010101111・・・


コンピュータは0と1から作られたデータしか扱うことができないため


文字  例えば  


文字Aという画像データも

のような記号の画像データも


0と1のデータの集まりで作られています。


つまり


文字や記号は0と1のデータのあつまりで作られた



            🍊画像データとして🍊


コンピュータにあつかわれています。


つまり


ディスプレイに表示された


文字とは画像データだったんですね・・・


コンピューターで文字をディスプレイに表示するとき


文字の画像データと数値(アスキーコード)を対応させておけば


数値を使って簡単に


文字の画像データをよびだし使用することができる・・


というところですか?


確かにこれは便利な方法ですね。


数値と文字の画像データを対応させておけば


その数値をつかって


簡単に 今この画面に表示されている文字を


呼び出せるというわけです。



では、これからが本質的なお話になると思うのですが・・・


0000000111//」


\\\\\\\\\\\______『『『『『『』』』」」」」」」---------


アレサ

「数値と文字の画像データの対応はどうしても


必要となってくるとおもわれます。


aという文字(画像データ)を表示するとき


自分でゼロから


aの画像データ


01010101000111010100000000000000000010010101010001110101000000000000000000100101000000000000000000000000000000000111111111111111111111101000000000010000001001111111111111111111111111111111111111111101000000000000000001010101010010100101001010000000000000000000000000000000001111111111111111111111010000000000100000010011111111111111111111111111111111111111111010000000000000000010101010100101001010010101010001110101000000000000000000100101000000000000000000000000000000000111111111111111111111010000000000100000010011111111111111111111111111111111111111111010000000000000000010101010100101001010


をうちこんでいたのでは とても手間がかかります。


そこで あらかじめパソコンに


このaの画像データを記憶させる。


そして aという画像データをパソコン内から


呼び出して使用する


という流れになっていくわけです。


ひとまず


数値(アスキーコード)と文字の画像データの対応のお話


はおいておきます。」


アレサ「ところで


実は


コンピュータ内のメモリに格納されているデータは


(1バイト)8ビットの単位ごとに


管理されています。


その(1バイト)8ビット単位のひとつひとつにアドレスという番号が


割り振られており


CPUがデータを呼び出すとき、そのアドレス番号をつかって


データを呼び出しています。」


アレサ「では ソーラーさんが


数値1などのデータをコンピュータのあるメモリに格納したとします。」


ソーラー「はい🌞」


アレサ「では ソーラーさんが


その数値1をコンピュータのあるメモリから


呼び出して使用したいとします」


ソーラー「はい🌞」


アレサ「どのように


数値1をコンピュータのあるメモリから


呼び出して使用しますか?」


ソーラー「はい?🌞


わかりません」


アレサ「つまり


たくさんあるメモリのうちの1つの8ビットの部分に


数値データ1が格納されているとします。


どうやって


たくさんあるメモリの中から


数値データ1を格納しているそのメモリ


をみつけることができるのでしょうか?」


ソーラー「勘です」


アレサ「勘 かもしれません。


    🍋あるメモリにデータを格納して🍋


    🍋そのデータを呼び出して使用する🍋



方法を昔の人もかんがえるわけですが・・・


コンピュータに命令をだしてメモリ内から


数値データ1を呼び出すには


    🍅 メモリに番号をつけておいて 🍅


       🍅 その番号を指定して 🍅


🍅数値データ1をとり出す方法以外考えられなかった 🍅



のではないでしょうか。



なぜか、どうやっても



 <メモリに番号をつけるしか>



コンピュータがメモリ内から


数値データ1を呼び出す方法をみつけることができません。



000000000000000000000000000・・・   



今 現在、わたし<アレサ>も


メモリに番号を付けないで


メモリ内に格納されている数値データ1を


呼び出す方法を考えているのですが


いまのところ おもいつきません。


みなさんにいいアイデアはありませんか?


メモリ内に格納されている数値データ1を


呼び出す方法ですか・・・


0001010101010010101010011111111・・・・・・


0111010100101???


01010101010・・・?


0111001・・・


数値データ1を呼び出すには・・・


0101010100111110101010010101010101000・・・???


??たとえば


メモリーDに数値データ1は記憶されているとします。


そこから


数値データ1を呼び出すには


そのメモリーDを指定するしか


数値データ1をとりだす方法が


ないのです


メモリーDを指定するにはメモリーDには名前がないと指定できません。


コンピュータは0と1しか理解できないので


メモリーDの名前は


必然的に0と1の組み合わせ(すなわち数値)


が対応することになります。



つまり数値データ1をとりだすとき


メモリーDにつけられた名前(たとえば00101010すなわち数値)を


よぶことになります。


すなわち


数値データ1をとりだすとき


ある数値が対応してくることになるのです。



01010111110101000101001010111・・・・・・・




メモリーDの名前(たとえば00101010)をつかって


(実は


コンピュータ内のメモリに格納されているデータは(1バイト)8ビットの単位ごとに


管理されています。


その(1バイト)8ビット単位のメモリのひとつひとつにアドレスという番号が


割り振られており


CPUがデータを呼び出すとき、そのアドレス番号をつかって


データを呼び出しています。)



00001010010101001111001010011・・・


数値データ1をとりだしたい


それには


>数値データ1が格納されているメモリーDの名前がいる。


>メモリーDの名前はコンピュータでも理解できる数値(たとえば00101010)で表すしかない


>メモリーDの名前にアドレス(たとえば00101010のような数値)


をつけたものの


00101010とプログラムに打ち込んで数値データ1を


よびだすのは面倒である


それに


数値データ1が保存されているメモリーの番号


00101010を覚えていないといけません


そこで登場するのが変数宣言なのです。



変数宣言

int b;

を行うということは


メモリにbという名前を付けることに相当します


こうすることにより


メモリにつけられている(アドレス)数値で


データをよびだしたり格納したりしなくても


bという身近な名前で


データをよびだしたり格納したり


できるようになります


このとき


もともと


メモリにつけられている番号00101010は変数bという名前で


上書きされて消えるということはなく


ちゃんと残っています


数値1をメモリに格納したいとき


変数宣言というシステムがあれば


変数宣言

int b;

b=1;


をおこない


数値1を変数bの名前でメモリに格納でき


printf("%d",b);


で数値1をprintf出力表示することができますが



もし


変数宣言というシステムがなければ


もともと

メモリにつけられている番号


11001001


などで


数値データ1をメモリに格納したり


メモリから呼び出したりしなければならなくなるというわけです。


そして


変数宣言

int b;

b=1;で


メモリにbという名前を付けるとき


int b;


とint型(4バイト)を bの名前の左隣に表記することにより


1バイト×4つ分のメモリを bという名前でまとめて管理することが


できています。


ですので


int b;

b=1;

が行われると


1バイト×4つ分のメモリにわたって


このように


00000000 00000000 00000000 00000001


数値1は格納され


printf("%d",b);


がおこなわれると


bという名前でまとめて管理されている


1バイト×4つ分のメモリ内のデータ


00000000 00000000 00000000 00000001



%d出力変換指定子をつかって


数値データ1に変換されて


コマンドプロンプト画面に


1がprintf出力表示されるというわけですの


char b;

b=1;

が行われるならば


char型(1バイト)の変数bに格納される


数値1は


以下のように


00000001


1バイトのメモリに格納されます


そして


printf("%d",b);


が行われると


bという名前が付けられたメモリに格納されたデータ


00000001


%d出力変換指定子をつかって数値1に変換されて


コマンドプロンプト画面に


1


printf出力表示されるというわけです



このように


変数宣言をおこない


メモリに名前をつけるのは


容易にデータをとりだすために


必要で自然なことなのでした。




ソーラー 「おお・・・


な~~~~んか楽しそうなことをやっておられますね。😊


アレサさん」


アレサ 「ようこそ いらっしゃいました。ソーラーさん」


ソーラー 「よばれて、とびでて、参上ぉおおおおおおお


でもさっきからいました」


アレサ 「00000000000000000000111111111111・・・・」 


ソーラー 「つまり、コンピュータがインダス文明時代に


つくられたとしても、


黄河文明でつくられたとしても


  🍓メモリに番号を付けることでしか🍓


🍓メモリに格納されたデータを呼び出すことができないんだね。🍓


    そして

     

   🍓 メモリに格納されたデータを


   メモリにつけられた数値でよびだすのは煩雑なため


   より簡単によびだせるよう


 🍓 さらに変数宣言によりメモリに名前を付けるんだね 🍓



文字の画像データに数値(アスキーコード)


が対応しているのも


同様な理由からなんだね


次のプログラムのように→」


#include <stdio.h>


int main()

{

printf("%c\n", 97);


return 0;

}


コンパイル結果

a


ソーラー「→


   文字の画像データaを


コマンドプロンプト画面に表示するとき


アスキーコード97が使用されているね。


このとき


コンピュータ内では


char型の形式でメモリに格納された


01100001(10進数97 アスキーコード97)


が使用されています。


つまり


これは


文字の画像データaを


コマンドプロンプト画面に表示するとき


文字の画像データaをおさめた


場所から


数値で


文字の画像データaをよびださなくても


文字の画像データaに割り振られた


アスキーコードでよびだせるよう設定されているからなんだね。」



アレサ 「そのようになるかとおもわれます。」


ソーラー 「で・・・雑誌ASCIIの出現も・・・・必然・・・」


アレサ 「11111100000・・・き、きいていらっしゃたの・・・000000」


ソーラー 「はい、


ここでの 超重要事項は雑誌ASCIIの出現です。(笑)


     雑誌ASCIIの出現は自然な流れなのです(笑)


なんか聞こえたかな~~~」


アレサ 「ああっ」


ソーラー 「ところで、


人間の脳ではデータの呼び出しはどうなっているのかな?」


アレサ 「11111100000・・人間の脳では・・・・・ですか???」


ソーラー 「コンピュータがデータをよびだすには記憶しているメモリの


名前がいるけど・・・・


人間の脳の中にも


データを記憶しているメモリのようなものがついているはずだけど


名前はついてないよね・・・


脳の中の1111000番のメモリに格納されている画像データをよびだしまーす


というような仕組みになっていないのに


思い出したい景色を呼び出すことができる。


すごいことだね。


人が何かを思い出そうとするとき


どうやってデータをよびだしてるのかな?」


アレサ 「そうですね・・・0000000000000


皆さんを見ていて思うのですが


皆さんの


脳の記憶装置の中のメモリには


いろんなデータが何重にもかさなって


書き込まれてるような気がします・・・・・」


アレサ「ですから 記憶がまざりあう 変化するというようなことが


起こっていると おもわれますの・・・」


ソーラー「そうおもうんだ?」


アレサ 「


メモリに🍓アドレス(数値)🍓をつけるのは


自然にして必然、


変数宣言はとっても便利、変数宣言でメモリになまえをつけてね


のエピソードでした」


ソーラー「突然ここで終わりになる???」





















  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます