コンピュータと計算の仕組みから、プログラミングの基本「変数と関数」を理解してみよう -理論編-

この記事は、[Life is Tech ! Advent Calenderその2](https://qiita.com/advent-calendar/2020/life-is-tech-2)の10日目の記事になります。

## この記事の目的
中学生高校生向けプログラミングスクール、Life is Tech ! で活動してそろそろ10年目。
その中で、プログラミングの基本となる考え方を学ぶことが一番難しいと見ていて思います。。
なぜかというと、コンピュータが見の周りに当たり前にありすぎてその仕組みや理由を知ることが難しいからではないでしょうか。
なので、コンピュータの仕組みとコンピュータの基本である計算というものに触れながら変数と関数という重要な２つの考え方を解説してみたいと思います。


### 注意点
できたら小学生にも理解してもらえたらいいなと思って書いています。そのため、説明として正確でない部分や意図的に省略している部分も多いことに注意してください。。

## 全体の要約
文章が少し長くなってしまったので、文章の要約はこちらです。
画像だけを見ても分かるように努めています。

- そもそも、コンピュータは計算機
    - たくさんの計算処理を人間が考えて命令している
- 計算機ということは以下の2つが必要
    - 計算する対象：データ（変数）
    - 計算する方法：処理（関数）
- 変数は1回利用して終わりではなく何度も計算に利用される
    - 名前をつけて管理する
- コンピュータは数字だけではなく、色んな物（文字や画像など）を計算する
    - データには種類を作ったほうが便利
        - その種類を型と呼んでいる
- 関数は便利だから使われている！
    - 処理を1箇所にまとめて何度も利用するため
    - つまり、関数とはどこかから呼ばれて、戻るための仕組み
    - 呼ばれる時と戻る時に、データも一緒に移動できると便利
        - これらが引数と戻り値

### 要約の補足
- 計算する方法は、本当は関数ではなくて処理
    - だが、今どきの開発環境は、処理というよりも関数として目で見ることが多いし対比構造にしたほうがわかりやすくなるので、乱暴にまとめている
    - 以下のように入門者が見る処理の多くは関数として触れられることが多い
        - Scratch: ブロックという関数でまとめられている
        - アプリ：イベント駆動として関数が呼ばれる形式で考えることが多い
        - ゲーム：メインループという関数、そこから呼ばれる関数


## コンピュータは電子計算機
さてさて、今は当たり前にあるコンピュータ、パソコンは、現代ではなんでもできる機械みたいなものですよね。
ですが、もともとコンピュータは弾道計算や航空機管制などのために作られていました。
つまり、弾道や飛行機の軌跡を「計算」するためです。

なので、コンピュータが行っていることはめちゃめちゃ複雑で早い計算ということができます。
プログラミングの基本を知るために、計算を一度見てみましょう。
わかりやすく、算数の足し算を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153766/f25d89a1-46b1-0b74-e702-22f86e67297b.png)

さて、この足し算というものを改めて眺めてみると2つのものがあることに気付きますか？

- 2,3,5などの**数字**
- +や=などの**計算記号**

計算にはこの2つが必要です。つまり、どのような数字をどのように処理するかということを決める必要があります。
さらに、コンピュータはただの数字の計算機ではありません。文字や画像や様々なものを扱っています。
なので、この数字というデータがもう少しいろんな機能を持っているのです。
それではまずは、計算の数字に当たるものから考えてみましょう。

## 変数とは、様々な種類があるデータ
計算で利用する数字は、コンピュータでいうところのデータということになりますね。
このデータというもの、プログラミングでは一度使ったら終わりではありません。
「このようなデータがあります」、「こうしてデータを変更します」、「このデータを参照します」
というように何度も利用することになります。なのでもちろん、データの中身が変わることが多いです。
そのため、プログラミングでのデータのことを「数」が「変わる」と書いて変数（へんすう）と呼んでいます。
変数は何度も利用するため、名前をつけて区別をしていきます。
まずは、プログラミングのデータは変数と呼ぶことを覚えておきましょう。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153766/7501851b-603f-973a-f3a5-d4c40edd01d6.png)

## 変数のデータ種類について
突然ですが、コンピュータ上でデータはどのように扱われているか知っていますか？
いろんな表現がありますが、究極的には「0と1の羅列」です。2進数というものですね。
例えば、アルファベットのaはASCIIという文字のルールでは `01000001`と定義されています。
このASCIIというルールは、0または1の数が8つあります。これを1byte（バイト）と呼んでいます。
（USBメモリの容量などのGBはギガバイトの略です。）
つまり1文字が1byteです。

次に数字、特に整数を考えてみましょう。整数というと、1や42などの小さい数を想像することが多いと思いますが、プログラミング言語では、より大きな数字が利用されてもいいように、数字については大きなデータとして準備していることが多いです。
そのため、プログラミング言語によって異なるのですが、多くのプログラミング言語において整数は4バイトもしくは8バイトの大きさを持っています。

文字は1バイト、数字は8バイト、明らかに大きさが違います。
この2つを同じようなデータとしては利用できないですよね。データの種類を区別する必要があります。
そこで、変数には種類が存在しています。その種類のことを「データ型」、もしくは単に「型」と呼んでいます。


### 変数のイメージについて
変数のイメージとして、初心者向け資料には箱のイメージとして説明することが多いです。
そして、型についてイメージとしては、箱の種類が四角だったり星型だったりで図示されていることがあるかもしれません。
ですが、中にはいるデータは0か1という点は一緒なので、大きさの違う箱というイメージを持っておくといいかもしれません。更に、変数には名前があるので、ラベルがついていますね。
（本当はデータ型はもっと優秀なのでサイズだけの区別ではないので、やっぱり箱の形が違うほうが現代にはちかいかもしれませんね。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153766/7501851b-603f-973a-f3a5-d4c40edd01d6.png)

## 関数を考える前に、プログラムの流れを考えてみよう

さてさて、関数についても同じように考えていきたいですが、関数について知るためには、コンピュータとプログラミングがどのように進化してきたのかを知っていきましょう。

最初に触れたように、コンピュータは弾道計算などのために第二次世界大戦ごろに大きく進化してきました。
年代にすると1950年前後です。
その頃のコンピュータは、今のようにコードでプログラミングを行うのではなく、紙テープやパンチカードで計算の処理を作っていました。
（より以前だと、配線を組み替えることで電子回路として計算をしていました）

![Punched Tape](https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/PaperTapes-5and8Hole.jpg/1920px-PaperTapes-5and8Hole.jpg)
画像出典：[紙テープ(Wikipedia) ](https://ja.wikipedia.org/wiki/%E7%B4%99%E3%83%86%E3%83%BC%E3%83%97)

この頃はもちろん、プログラミングはカードの流れに沿って順番に処理されていきます。
パンチカードは束（バンチ）になって、1つのプログラムとなっていたのです。
つまりプログラムは上から下に順番に行うことを決めて、そのとおり実行していくものでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153766/9bde717b-1f96-620e-7ee4-358f95fba0d8.png)

いろんなプログラムを作っていると、そして1つのプログラムの中でも同じことを行うということはありますよね。
そこで、プログラムのコードをまとめて利用できるとと便利だということになります。
そこで登場するのが関数です。

## 関数は処理をまとめて、別の場所から呼び出せるようにしたもの

関数があることで、同じような処理をまとめることができます。
そして、別の場所から呼び出してもとの場所に戻ってくることができます。
これだけでも便利ですが、さらに便利に利用する方法があります。
関数に移動するときに、データも一緒に移動させるのです。
例えば、消費税を計算する関数を考えたときには、今計算したい商品の金額を渡す場合などを想像するとわかりやすいかもしれません。
さらに、関数から戻ってくるときにも、一緒にデータが戻ってくる仕組みもあると便利になります。

この関数に移動するときに送るデータを「引数」、戻ってくるデータを「戻り値」と呼びます。
イメージとしては、ベルトコンベアを考えるとわかりやすいかもしれません。
（ベルトコンベアが複数の所につながっていることは少しイメージしづらいですが）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153766/c198123a-e1e8-520f-1e8c-a60c157c993c.png)


## 終わりに
コンピュータと算数から変数と関数を考えてみました。
少しでも、プログラミングを始めたばかりの人の手助けになれば幸いです。

## 参考文献
- [コーディングを支える技術](https://www.amazon.co.jp/dp/477415654X)
- [オブジェクト指向UIデザイン](https://www.amazon.co.jp/dp/B0893RK6WC)
    - 後半にコンピュータの歴史が出てきます。