シンボル

データ構造

  • このエントリーをはてなブックマークに追加

この記事は、リテラル からの続編です。

この記事は、絵でわかる プログラムとは何か(6)~シンボル~ の一記事です。

この記事のポイント

  • データ型の分だけ確保されたメモリ領域を参照するシンボル変数と言う。
  • 変数が参照するメモリ領域に、その中身としてのデータを書き込むことを代入と言う。
  • 再代入不可なメモリ領域を参照するシンボルは、変数ではなく定数と言う。
  • 複数のシンボルが共通のメモリ領域を参照し、再代入可能な場合、ミュータブルになる。
  • 複数のシンボルで、共通参照不可、あるいは再代入不可にすることをイミュータブルと言う。
  • 同じデータ型の複数の変数を、共通のシンボル名と通し番号で表したものを配列と言う。
  • 整数値の定数が複数ある時、それらをひとまとめのグループにしたものを列挙と言う。
  • 複数の変数を、参照連結し、一連のグループにしたものをリストと言う。
  • データをグループ化したものをコレクションと言い、コレクションの内部構造をデータ構造と言う。

変数(variable)

シンボルが示すメモリアドレスには、データを書き込むことができます。さらに2バイト以上のデータは、シンボル以降のメモリアドレスにも続けて書き込め、そのシンボルデータ型として確保されたメモリ領域分まで、ひとかたまりのデータとして扱えます。

メモリアドレスは通常、1バイト単位で割り振られています。なお、ここでのメモリアドレスは、仮想アドレス空間の仮想アドレスです。

このデータ型分確保されたメモリ領域を参照するシンボル変数(variable)と言います。変「数」と数はつきますが、数値以外のアドレスや文字列や論理値などのデータ型も、変数の参照対象になります。

変数が参照するメモリ領域に、その中身としてのデータを書き込むことを代入(assignment)と言います。

ミュータブルとイミュータブル

変数Aを、別の変数Bに代入すると、変数Bに、変数Aと同じメモリ領域への参照がセットされる場合があります。

複数の変数が、同一のメモリ領域参照しているとき、それら変数のどれからでも、共通参照先であるメモリ領域データを変更できてしまいます。これをミュータブル(mutable:変異可能)と言います。

ミュータブル(mutable)の元の、mutate という言葉は、「突然変異」という意味です。
ミュータント(mutant) = 突然変異体 という言葉は映画やゲームのタイトルにもなっていますね。

逆に、どの変数からもデータを変更できなくしたり、変更を加える変数にはコピーデータを参照させたりして、データが変異しないようになっていることをイミュータブル(immutable:変異不可能)と言います。

ミュータブルとイミュータブル
ミュータブルとイミュータブル

定数(constant)

変数と同様に定数も、データ型分確保されたメモリ領域を参照するシンボルです。ただし、そのメモリ領域には、初期値未設定の状態からの初期代入1回しかデータ書き込みが許されません。

  • ・・・再代入メモリ領域を参照するシンボル
  • ・・・再代入不可メモリ領域を参照するシンボル

なお、言語によって、定数変数を初期代入できる/できないの違いがあります。定数変数を初期代入すると、定数へ別のデータを再代入することはできませんが、変数へは再代入ができてしまいます。この場合、結果的に定数の中身が変わることが起こり得ること(ミュータブル)になります。

配列(array)

変数などのシンボルには、中身に合わせたシンボル名(識別子)を付けられました。

複数の変数それぞれに同じ種類の中身(同じデータ型)を入れて使う場合、それらの変数で一つのグループを作り、まとめて処理をさせたり、各変数に通し番号を付けて個々の処理をさせたり、と使い分けられれば便利です。

多くの高級言語では、「配列」という呼び名で、このようなグループが実現されています。

配列の宣言では、仮想メモリアドレス空間上に、まとまったメモリ領域を確保します。配列データ型に合わせた枠を、配列の個数分、連続させたメモリ領域です。

配列のメモリマッピング

こうすることで、配列名を使ってひとまとめの処理ができ(配列名は先頭アドレスを指します)、0から始まる配列内の通し番号で個別変数としての処理もできます。

  • 配列名・・・先頭アドレス
  • 配列名[]・・・配列全体
  • 配列名[番号]・・・配列内の指定番号要素(変数)

列挙(enumeration)

配列は、複数の「変数」を「連番」で識別可能にし、グループ化したものでしたが、
列挙は、複数の「整数値」を「識別子」で識別可能にし、グループ化したものです。

列挙された識別子は、整数値を表す定数と同じ扱いとなり、シンボルテーブルへ、その対応付けが記録されます。

整数値は自動だと連番になりますが、飛び飛びの整数値を自由に指定したり、同じ整数値に複数の識別子を対応させたりもできます。

リスト(list)

リストは、複数の「変数」を整列させ、グループ化したものです。

配列とは違い、はじめから連番が割り振られているわけではなく、変数の前後を、別の変数と「連結」することで、整列させます。このためリストは、連結リスト(linked list)とも言われます。

リストのメモリマッピング

連結(link)は、他変数への参照であるため、参照先を変えることで、簡単にリスト内各変数の順序を変えられます。リストに新たな変数を追加したり、リストから特定の変数を削除したりもできます。

なお、リストは応用範囲が広い分、その仕様が言語によって大きく異なったり、同じ言語内でも異なる仕様の数種類のリスト型があったりするので、注意が必要です。

データ構造

配列やリストで見てきたように、複数データのグループ化には、その後の利用まで考慮すると、様々な構成が考えられます。そして、どんな構成でデータを管理するかは、処理効率に影響してきます。

このようにデータをグループ化したものをコレクションと言い、コレクションの内部構造をデータ構造と言います。

コレクション内のデータ構造よりも、コレクション外から、コレクションそのものに着目した場合、コレクションのことをコンテナとも言います。

この記事のまとめ

データ型の分だけ確保されたメモリ領域を参照するシンボル変数と言います。
変数が参照するメモリ領域に、その中身としてのデータを書き込むことを代入と言います。
再代入不可なメモリ領域を参照するシンボルは、変数ではなく定数と言います。

複数のシンボルが共通のメモリ領域を参照し、再代入可能な場合、ミュータブルになります。
複数のシンボルで、共通参照不可、あるいは再代入不可にすることをイミュータブルと言います。

同じデータ型の複数の変数を、共通のシンボル名と通し番号で表したものを配列と言います。
整数値の定数が複数ある時、それらをひとまとめのグループにしたものを列挙と言います。
複数の変数を、参照連結し、一連のグループにしたものをリストと言います。

データをグループ化したものをコレクションと言い、コレクションの内部構造をデータ構造と言います。

次は、関数 に進みましょう。

この記事は、絵でわかる プログラムとは何か(6)~シンボル~ の一記事です。

コンピューターのしくみ全体を理解したい場合は、以下の2コースがお勧めです。

日本全国 オンラインレッスン にも対応しています。

知りたいことだけ単発で聞きたい場合は、 オンラインサポート をご利用ください。

記事を検索

コメントを残す

*

CAPTCHA