皆さんこんにちは、プロクラスの野間です。
最近偶然に
「プロになるとしたら何言語をやっといたら良いか?」
と聞かれた事について思った事、第二回。
■前回のまとめ
何言語でも良い。
まずは何言語でも良いから極めるつもりで やればOK!
■その一方で・・・
「C言語とC++言語の便利なところ」を知っておいた方が良いかもしれません。
※一見2種類の言語のようですが、C++はCの拡張言語っぽいものです。
これには(職種にもよりますが)多く使われているから、ではなく、別の理由があります。
■逃れられないハード(機械)の呪縛
現在プログラム可能な機械は全てある共通点があります。
・CPU(計算するパーツ)
・メモリ(憶えるパーツ)
が存在している点です。
どれだけ速度がは無くなったり、容量が増えたり、大きさが小さくなったり、電力消費が少なくなったり・・・
しても「この仕組み」は変わっていません。
どれだけプログラムを工夫しても、あくまでこれらのパーツをどのように使うかを指示しているだけですので、
「機械に出来る事しか出来ない」事になります。
そして、メモリ(憶えるパーツ)の使い方が昔から問題を生んでいます。
■増えました、でもやっぱり足りません
ものを覚える場所【メモリ】
皆さん試験前日に一夜漬け。やったことありませんか?
私は自分の記憶力の限界を開始5分で感じていましたが、皆さんはどうだったでしょうか。
コンピュータはメモリの許す限りバッチリ物を憶えます。読み返しなんて必要ありません。うらやましい限りですが。
逆にメモリを一杯まで使ったら一切別の事を憶える事が出来ません。
私がコンピュータを知った頃、メモリは64KBしかありませんでした。
マシンによりますが今では、仮に8GBとしたら、8,388,608KB。131,072倍になっています。
昔に比べ、メモリはとんでもない量に増えましたが、だからと言って使いきれないほど無尽蔵にあるわけでもない。
今でもメモリは使い切らないように注意しながら使っている状態なのです。
■場所が足りない!増やせない!・・・時はどうしますか?
メモリの量を部屋の広さだと思ってください。
最初は何も置いていないので部屋は広々としています。
最初は気にせず物を置けますが、それを続けているとやがて、部屋が足の踏み場もないほど散らかってしまいます。
そんな時、皆さんなら部屋を片付けますよね?
要らない物は捨てる。
自分の部屋・自分の物なら問題ないでしょうが、他人の部屋・他人の物だったらどうでしょう?
要る物、要らない物の判断が出来るでしょうか?
コンピュータでも同じ事です。
要らない物を捨てる時、必要な物(使っている物)だったら大変です。
飛行機の自動操縦プログラム、飛んでいる時に必要なデータが消える・・・怖いですよね。
だから昔から片付けは使った人がきちんと片付ける(当然ですよね)ようにしていました。
■自分でやる!でも忘れ物が・・・
プログラムを組んでいるとすごい用途数のメモリを使います。
また、不要になるタイミングもバラバラで、その判断も複雑に絡み合っています。
想像してみてください、2000個の小物が部屋に散らかっている、そのままにしておかないといいけない物と、不要なものがある。
【確実に】不要な物だけを捨てないといけない。
難しいですよね・・・
捨て損ねるとどうなるか?そこに残り続けるんです。
1個、2個ならそれほどの問題にはならないかもしれませんが、それを続けると・・・どうなるか想像できますよね?
■自動でやって!でもタイミングが・・・
この片付けはプロでも大変な神経を使うものです。
ですから、頭の良い人は考えました。
【自動でやればいいんじゃね?】
革命的です!非常に便利に・・・なるはずでした。が
プロにとっては問題を含む結果となりました。
例えば、「不要になったタイミングで片付けてくれない」。お掃除業者に頼むようなものです。頼めば綺麗にしてくれますが、「今!」と言っても無理があります。
例えば、「不要になったものを確実に捨ててくれるとは限らない」。これはどうしようもありません。いつかは捨ててくれますが、「今はまだ使うかな?」なタイミングってあります。
これだけ聞けば「特に問題ないように聞こえますが」
格闘ゲームで微妙なタイミングで一瞬動きが止まる(お掃除が始まる)。クレーム物ですよね・・・
プログラムはどんどん次のメモリを必要としますが、前の物が残っているために次が使用できない。
どう考えてもダメです。
そして致命的なのが【これらの原因が特定できない】点にあります。
自動お掃除プログラムは秘密に包まれていて中身がわかりません。いつお掃除してくれるか、捨てるか?捨てないか?は外からはわからないのです。
客「なぜ一瞬動きが止まるんだ!ゲームにならないじゃないか!」
プログラマ「多分、自動お掃除システムが動くためだと思われます」
客「多分ってなんだ!他人のせいにするな!」
まぁそうですよね。確実にわかっているならまだしも「自分は悪くない!多分あいつのせい」って無責任にもほどがあります。
私個人の好みとしては【調べても原因がわからない物】よりも【大変でも原因がわかる物】の方が良いかなと・・・
■世の流れ?もう勉強できなくなる
しかし世の流れは非情です。
【これは便利だ!】とばかりに新しく生まれてくる言語は自動お掃除システムを積みメモリを隠蔽するものが増えています。
それほどまでにこの【メモリ捨て忘れ(メモリリーク)】は難易度が高い問題のようです。
便利な新しい言語が次々に生まれてくる中で、古い言語は徐々に使われなくなっていきます。
古い物(自分で捨てる)が減り、新しい物(自動)が増える。
徐々に自分で捨てる言語が減っており、自分で捨てる勉強が【出来ない】ようになってきています。
そんな中、C言語(C++言語)は広く使われており、自分で捨てる系言語なので、知っていた方が良いかなと思います。
■悪名高き壁!その名はポインタ
では何故C言語(C++言語)一択ではないのか。
前回の「何言語でも良いから深く」なのもありますが、「はじめて」やるには難しい言語でもあるためです。
「難しい」とは表現が正しくないですね、「面倒くさい」の方が正確かもしれません。
Unityで画像を表示するのはプログラムを組む必要はありません。ドラッグ&ドロップだけで表示できます。
WindowsのC言語(C++言語)で画像を表示しようと思ったら何行必要になる事やら・・・
そんな感じで、何かが出来るようになるまでに「飽きる」「諦める」方が多いのでは?と思います。
楽しくないと、やる気でないですよね・・・
そして、それを乗り越えたとしても、はるかに高い壁が立ちふさがります。
それが「自分で捨てる」問題となる【ポインタ】です。
私の知る限り、非常に多くの方が、このポインタで挫折しておられるようです。
それはもう、悪名と呼ばれるほど有名な挫折場所のようなのですが、
C言語(C++言語)ではポインタが使えないと、まともなものは作れないほど必須です。
まずは、扱いが楽な言語で「プログラムとは何ぞや」がわかってから。
理想的には「へいへ~いプログラムなんて思いのままさ~」位になってからポインタの壁に挑んだ方が良いかなと思う次第です・・・