コードとメモリの関係
ここからは、今までの内容をもとに、コンピュータ内部での動きはどのようになっているのか、を見ていきます。
今までやってきた内容についても深入りしていきますので、前の内容を思い出しながら読んでみてください。
コードを書いたら、それをコンピュータに渡して結果が返ってきます。
では、渡したコードはコンピュータのどの部分に渡され、脳みそが無いのにどこでコードを処理しているのでしょうか。
このコンピュータの脳みそ部分にあたるのが、「メモリ」という場所です。
メモリ
コンピュータは機械ですので、電気でものを考えます。
このように、ONかOFFか(通電しているかいないか)の2通りの状態になる小さなスイッチ(トランジスタ)がいくつも並んでいるのがメモリです。トランジスタ1個で1ビット(bit)、8個で1バイト(byte)という単位になります。(USBメモリなどの〜GB ギガバイトはこのbyteのことです。)
この2通りの状態をON=1、OFF=0とし、いくつも組み合わせることによって、数値を表すことができます。2進数というものです。(上の図だと10110、と表すことができます。)
※2進数とは
コンピュータの世界での数字(2進数) | 人間の世界での数字(10進数) |
0 | 0 |
1 | 1 |
10 | 2 |
11 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
このように、数値は2進数に変換されメモリの中に格納されます。
文字列は、文字記号に対応する数字を割り振って管理しています。(例:00010100ならA、など)
文字コード表(iOSだとUTF-8)というものがありますので、気になる方は調べてみてください。
なぜ定数・変数を書くのか(PC内部での事情)
定数・変数の節にて「一度書いたコードやデータを「使い回す」ことができます。」とありました。
コーディングの手間が省けるのはもちろんのこと、メモリへのデータの受け渡しも省略できるのです。
定数・変数を宣言することで、メモリのトランジスタをここからここまで、という風に場所を確保し、代入によってその中に2進数へ変換したデータを入れます。
何回も使うデータを定数・変数を使わずに書くと、その度にやりとりが発生し、コンピュータの負担が重くなります。
型の役割
型はデータの種類であるということをお話しました。
データの種類によって、使うメモリの場所取りの範囲(トランジスタ何個分を確保するか)が変わります。
定数・変数宣言時の型は、メモリの場所取りの範囲を指定する、と言えます。(Swiftの型はオブジェクトで提供されていますので(参照:Swiftの基本的な型)、下記はイメージとして捉えてください)
上の表のように、ここからここまでをデータ格納庫として使う!と取り決められます。
例えば、Bool型はtrueかfalseかの2値しかないので、トランジスタ1個分=1ビット(0と1の2種類が表現できる)を用意すればOKです。
しかし文字列や数値では何ビットものトランジスタが必要になります。
フラグとしてBool型を利用する時には、Bool型の代わりに数値(0,1)や文字列("true", "false")を利用することもできますが、Int型、String型では使わない部分のメモリ場所を占有し、0,1や"true", "false"以外のデータが入る余地ができ不具合が入り込む可能性があります。
正しい型のデータを使用し、扱うことが大切です。