変数の謎~『A=A+1』っておかしい?~

COBOL

こんにちは、もちきなこです。今日の議題は、下記2点です。

  • 『A=A+1』が式としておかしいのではないか?
  • 変数とは何なのか?

プログラミングを始めるにあたって当たり前に目にするもので、少し疑問に思っても、すぐに自分なりに解釈・納得して勉強を進めることが多い部分だと思います。今日は、私が疑問に思った理由と、考えたうえでの自分なりの解釈をまとめてみました。

『A=A+1』は式としておかしいのか?

まず、私がこの式を疑問に思った背景が下記です。

  1. 『=』を数式の『等号』と捉え間違えていた
  2. JAVAでの参照型や参照渡しに疑問を残したまま、COBOLの案件に参画し、変数の概念について考えた

まず、1点目の理由については、よくある解釈の勘違いです。『=』という記号には、『等号』と『代入』の2点の意味があり、プログラミングの中で使われる『=』は、後者の『代入』を表しています。算数や数学では、どちらの使い方でも登場するため、振り返ってみたときに意味を勘違いしてしまい、疑問に思っていました。これは、悩んだとしてもそんなに時間がかからず考え方の軌道修正ができました。

そして、今回この記事を書こうと思った理由が、2点目の理由に関連しているため、この部分を掘り下げて説明をしていこうと思います。

参照型、参照渡しとは?

まず、参照型とは何なのか。

参照型とは、直接値が入っているわけではなく、値が入っている部分(変数)のアドレス(住所)を保持している型のことです。

では次に、参照渡しとは何でしょうか?

参照渡しとは、関数などに引数を渡す際に、その変数のアドレス(住所)を渡す方法のことです。この場合、変数の値を書き換えると、引き渡す際に設定された変数の値も書き換わります。(イメージしずらいかもしれませんが、グローバル変数とローカル変数の違いのような感じで、値の有効範囲が違うとイメージしてもらうとわかりやすいかもしれません。)

参照の例として、変数AとBがあり、それぞれ以下のように定義されているとします。

A=B
B=120

そうすると、条件から、上の式のBに下の式の値を代入し、A=120と分かります。

最初にJAVAを学んだ時点では、Aに変数名を代入し、代入した変数名の値を参照しているという理解でした。まだこの時点では、アドレスという概念がほとんどわからないまま、ほかの場所(変数名)を値として持っているという理解だったんです。そしてこの不明点が多い状態のまま、COBOLの言語を勉強していきます。

COBOLの変数の特徴?

COBOLでは、変数を宣言する際に以下のように記載します。

01 HENSUU PIC 9(3) VALUE 123.

『HENSUU』が変数名、変数の桁数が括弧内の『3』桁、入っている値の内容が『123』です。ただ、この変数の項目を引数として渡す場合、渡される情報は、『変数名(最初の文字のアドレス情報)』です。

そのため、COBOLを学んで、変数に対する認識が変化しました。COBOLでいう変数は、『値』であると同時に『アドレス情報』を表しています。わかりにくいですが、『値』=『アドレス情報』なのです。最初にJAVAを学んでいた人には、この考え方はわかりにくいと思いますが、COBOLなどの古くから利用されている言語を学ぶと、理解できるようになります。

プログラミングにおける変数とは?(主にCOBOL?)

まず、私がCOBOLを学習する前の変数に対する認識が、以下です。

任意の変数を宣言し、変数名という箱の中に、指定された値が入っている(人間目線)

ですが、COBOLを学習した後に、変数に対する認識が以下のように変化しました。

変数とは、コンピュータが認識できる文字の羅列から、『先頭のアドレス情報』と『桁数』、『型』を指定するするもので、その値を呼び出す場合に、人が認識できるように変数名を使用して記載がされる(コンピュータ目線)

上記は、どっちが正解でどっちが間違いというわけではなく、どちらも正しいと私は考えています。

そもそもコンピュータは、私たちが理解できるプログラミング言語によってコンピュータに指示を出し、コンピュータの処理の内容を指定しています。そのため、私たち側からみると、変数に対しての認識は前者で正しいです。反対に、コンピュータ側からすると、2進数や16進数などで、ひと続きに連なっている文字の羅列の中から、変数名で指定された『先頭のアドレス情報』、『桁数』を取り出し、もう1つの『型』の情報によって、私たちに表示する文字列を決めていると考えられます(下記画像参照)。

したがって、プログラミングにおける変数は、アドレス情報であり、値である。『私たちがわかりやすい変数名という形を使って、コンピュータが処理するのに必要な情報を定義したものである』ということがわかりました。

結論

 『A=A+1』はおかしくない!変数Aが、アドレス情報だとするのであれば、左辺の『Aのアドレス情報』に対し、右辺の、『Aのアドレス情報の値に1を加算したもの』を代入しているため、論理的に整合性は取れています。

そして、この疑問をきっかけに、変数についての理解を深めるきっかけになりました。考えれば考えるほど奥が深いし、面白くて楽しかったです。

というわけで、記念すべき1記事目はこれで終了です!

コメント