※かなり書き途中な記事だよ

◆はじめに

夢と絶望の魔境、プログラミングの世界へようこそ!ぼくはプロレタリアプログラマー人間だよ!気さくにプロプロ人って呼んで欲しいな💖

今日は君たち先天性下等生物どもにプログラミングの基礎を教えるよ!絶対に逃がさんぞ!君もプログラマーという名の家畜になり下がろう!🐷🐷🐷🐷🐷🐷🐷🐷

…はい。えーじゃあやっていこう。

ある言語についてじゃなくて、プログラミングするうえで登場する概念的なところの説明をしていく。初心者向けに。

◆値と変数

変数つかうよね。「値を入れる箱」とかいう教わり方をしたかもしれないな。

ネタバレすると、変数は箱じゃないです。変数です。

とりあえず「変数」というものの機能をおさらいしよう。

int hoge;
hoge = 1;
int fuga;
fuga = hoge + 10;

この例を上から順次よむ。

  • 変数「hoge」を作成
  • 数値「1」を代入
  • 変数「fuga」を作成
  • hoge変数に「1」が入っている状態で、変数「fuga」に「hoge + 10」を代入している。

代入は「ぶち込む」ってこと。結果的にfugaは「11」になるだろう。

大多数のプログラミングの言語では、記号「=」に「代入演算子」の機能を割り当てている。右辺を「評価」した結果を左辺の変数に「代入」するのが代入演算子の機能だ。右辺左辺っていうのは「=」の右側と左側のこと。「評価」っていうのは計算のことだと思えよ。

変数に代入した、つまり、変数にぶち込んだ値を「変数名」により再利用することが出来る。また、「変」とつくように、変数に入っている値は変えることができる。つまり再度値を代入することができる。

変数を箱として捉える「代入」に対して、変数をラベル(なふだ)として捉える「束縛」という概念がある。値にその「ラベル」を貼り付けて、ラベルを使って値を読み出すという考え方だ。束縛と代入は概念的には違うんだが、「変数への値の代入は、値に変数名をラベリングするようなものだ」って考え方も許される。し、そのほうが頭に入りやすいような気がする。なぜなら「変数」のキモは「変数名」だからだ。箱が主役ではなく、箱についた名前、すなわちラベルが主役といえる。

▼右辺に代入先が出てくるやつ

これ

int hoge;
hoge = 1;
hoge = hoge + 1;

このコードは初心者にとってスッと理解できるものではないだろう。

こういうのは束縛のほうが理解しやすい。流れをたどってみよう。

  • 「hoge = 1」の右辺が評価され、結果は「1」だった。
  • 値「1」に「hoge」変数が束縛される。
  • 「hoge = hoge + 1」の右辺が評価され、結果は「2」だった。
  • 値「2」に「hoge」変数が束縛される。

結果としてhogeは2であると結論付けることができる。変数は箱ではないし、変数としか言いようがないんですよ。新しい概念だ。

整数値がすべて含まれている集合に「1」も「2」も含まれるだろ?そこに対して「hoge」というラベルを貼ったり剥がしたりしているようなものだ。実際は数値に上限があるから「すべての整数値」とはいかないが。

▼式

。英訳すると「Expression」。

さきほどから「評価」という言葉が登場していたが、評価されていたものはそりゃあもう「式」だ。

hoge = 1 + 1;

の右辺は式。

hoge = 1;

の右辺も式。

hoge = hoge + 1;

の右辺も式です。

式が評価されると最終的に「値」になる。値は変数に代入することができる。

「return」の右側に書かれているものも式だな。

じゃあ例えば、以下の例はどのように動作するだろうか。「hoge」と「fuga」に入る値は?

int hoge;
int fuga;
fuga = hoge = 1;

これは、言語によって異なる。そもそも許されない構文かもしれない。

理解のキモは「hoge = 1」自体が式であるか否かだろう。例えばJavaScriptとかだと式として扱われる。「hoge = 1」という式を評価した結果、値「1」が算出される。また、変数「hoge」に「1」が代入される。「hoge = 1」が「1」と評価されるわけだから、「fuga」には「1」が代入されてしまう。

気持ちわる。JavaScript気持ちわる。

キモい理由として、式のくせに「状態」を変化させてしまうということだ。

「状態」についてはあとで解説する。

▼変数の宣言、定義

大抵の言語では、「変数つかうよ」と宣言しなければそれを使うことができない。宣言はつまり準備と読み替えてもいい。宣言は英語で言うと「declaration」だ。

さっきもあったけど「int hoge;」とかが宣言の例だな。「int」っていうのは「Integer」つまり「整数」の意味で、これはC言語系の変数宣言といっていいかもしれない。言語によって変数宣言のルールは異なる。「整数」といった風に用途を定めずに変数を宣言することも可能かもしれない。

「定義」という言葉は変数には使わない。なぜなら、変数は中身が変わるからだ。中身が変わるんじゃ「義を定める」ことができないだろう。

▼アドレス

メモリってあんじゃん。パソコンに載ってるやつ。「メモリ8GB」みたいな。プログラムがなんらかの計算を行うとき、そのメモリ、メインメモリを使って変数を作ってます。

メモリの「記憶領域」が8GBあるわな。そのうちの例えば32bitをプログラム(のプロセス)が「使うわ。俺以外さわるんじゃねぇぞ。」と予約する。

その予約した32bitには、メインメモリ上での位置がある。その位置の事をアドレスと呼んでいる。説明してるとキリがないから白目剥きながら納得しろ。

予約した32bitの、その開始位置アドレスに名前を付けて、プログラムからアクセスできるようにする。それが変数の宣言と言える。「開始位置」って言ってんのは、つまりデータは一本の長い紙テープみたいなものだからだ。8GBのうちの32bitの範囲は1列に隙間なく並んでいる。だから開始位置と長さが分かればデータを取り出すことができるだろ?

変数名とアドレスが紐づいていて、そのアドレスに格納されているデータを読みだして使用している。そういうこと。

「メモリの記憶域を予約すること」は「確保」と呼称される。

▼初期化

変数の初期化。変数を宣言しながら値を代入することができる。

int hoge = 1;

このときの「1」は式だし、より厳密には「初期化子」と呼ばれる。「はつき ばけこ」と読む。嘘だけど。

変数を宣言しながら代入できるのは便利だし、また別の意味を持っていたりする。

さきほどメモリ領域の確保の話をしたが、その確保したメモリ領域の内容って一体全体どうなっているだろうか。

これは、まず分からない。何が入っているか不明だ。だから初期化子を指定してやる必要がある。具体例を見てみよう。

int hoge;
int fuga = 0;
fuga = hoge;

このとき、fugaの値はどうなる?それは誰にも分らないんですね。変数「hoge」のメモリ領域を確保したときに、たまたまそこに入っていた値になってしまうからだ。だから初期化子をつかって値を確定しておいたほうがよかろう。

C言語の話をしているからそんな感じだ。だが、大抵の言語に於いて整数値の変数を宣言した時は、自動的に「0」で変数を初期化してくれる。しかし言語に依存するものだ。初期化せずに変数を宣言するってのはそういうリスクがつきまとう。気になったら動作確認しておけ。

▼型

変数には、「入る値」「入らない値」がある。どういうことだろうか。なんでも入ってくれないと困るわ。訴えるぞ。

型システム」という仕組みがある。例えば「string」「char」「int」「long」「配列」とかみたことあるだろ。それらが型だ。

型は言語によって取り扱いがことなるんだが、Cを参考に見てみよう。

int hoge = 1;

これはよかろう。整数の変数に1が入った。

char hoge = 1;

これはまずいね。一文字を表現する「char」に整数値をいれようとしている。ルール違反だろう。文字なら「1」ではなく「’1’」だ。

こんなルールがある理由には、メモリが絡んでくる。また、コードの可読性にも関わってくる。

まずメモリ。「char」を1バイトの情報量だとする。かたや「int」は4バイトだったとするわな。変数宣言で「char」を作ったら、1バイトのメモリ領域が確保される。だが、そこに整数値である4バイトを入れようとしたらもう爆発することうけあい。

そうでしょ?

だから、「型」がどれくらいの情報量なのかっていうのを定めて、それぞれの型には定められた値しか入れられないようにしたってわけだ。「long」っていう変数が「int」よりも大きい整数を入れられるのは、「long」変数が確保しているメモリ領域が「int」よりも大きいから。

可読性の話をすると、型は定まっていたほうが読みやすいし、誤動作を起こしづらくて安全。なんでって、じゃあ例えば変数の型が定まっていない世界があったとする。ある変数を見たときに、その変数に入っている値が処理のタイミングによって文字だったり数値だったりって変化してしまう。その変数を処理するルートを2パターン書かないといけなくなる。書き忘れたら実行するときエラーになって怒られる。困る。もっとあるけど、簡単に言えばそういうこと。

でも型の扱いが緩い言語もあるよ。

▼文字列、配列

文字列ワカリマスカ?たとえば「string」とかってやつだな。stringは「紐」とか「一列に連なったもの」を意味する。一文字である「char」が連なった結果「string」となるわけだ。

メモリをガン意識しなければならないC言語では「string」型は存在しない。文字列は文字の配列、すなわち「charの配列」として扱ってやる必要がある。

// TODO

▼定数

▼スコープ

▼「アドレス型」の変数

参照。ポインタ。

◎おさらい

変数にはアドレスが紐づいている。そのアドレスからデータを読み出すことができる。つまり変数からデータを読み出すことができる。

これはいいだろう。

そして例えばその「データ」として、更にアドレスを格納できるとは思わないか。アドレスもデータなのだから。

▼ぬるぽ

ガッ!

Null Pointer Exceptionこと「ぬるぽ」は参照が絡んだ時に発生する。

ちなみに「Null」を「ヌル」と読むのはドイツで、アメリカでは「ナル」と呼ぶらしい。

▼理解度チェック

Q:黒柳徹子の一番好きな動物はカンガルーである。〇か×か。

A:×。黒柳徹子が愛している動物はパンダ。幼少期に父からアメリカ土産としてもらったパンダのぬいぐるみをきっかけとして、パンダの研究をするようになった。

Q:コアラの握力は何Kgか。

およそ15kg。1tもの握力があるという噂が過去ながれていたが、デマ。

◆関数

メソッド、ファンクション、サブルーチン、コルーチン、関数、プロシージャ、アクション