Unityでインディゲーム道!

プログラム、Unity初心者がインディゲーム制作を目指して日々思うことなどを書き綴ります。

プログラミングにおける可読化と抽象化。C#は英文に近いけど・・・編

C#はかなり英文に近く、そういう意味では読みやすそうに見えます。しかし、あくまでプログラム文を読むということは、自然言語文を読むということとはまた別の問題なんだ、ということについて、歴史を踏まえて考えてみました!

抽象化とは機械の感覚を人間に近づける、

ということだと思います。

  

『抽象化』を考える。

アセンブリにまで手を出し始めて訳わかんなくなってきたけど、とりあえずUnityもちょこちょこ触っています! 

この記事にも書いた『抽象化 』について軽くまとめておきたいなと。そして、それに関連したC#における落とし穴をまた見つけたんでそれについても。今までに学んだコンピュータ自体に関するまとめにもなってます。 

 

コンピュータはプログラミング言語を読まない。

プログラミングにおける抽象化です。

 

プログラミング言語の歴史とは

可読化と抽象化の歴史なのではないかと最近思っています。

 

コンピュータは機械語しか読めません。

機械語01しかなく最初期のコンピュータサイエンティスト達は、その1と0の羅列と格闘していたようです。しかも、それを機械式のスイッチを動かすことで物理的にプログラミングしていたと。考えただけで頭が痛くなりますね。  

しかし、そんなものやってらんなくなりますよね、当然。というわけで、プログラムつまりソフトとハードを切り離すことに至ったようです。しかし、それはまた別のお話。

 

 

プログラムは依然、0と1の集合体です。せめて桁数を短くしたい!というわけで16進数で表すようにしました。でもやっぱり数字は読みにくい、じゃあせめて何か英語を当てて多少読みやすくしよう! 

これがアセンブリです。ニーモニックという略語を割り当てることでつまり機械語である数字の羅列を人間も読めるようにした、ということになります。つまり機械語可読化した、ということです。(ここまでにどのくらい時間がかかったんだろう・・・。)

 

 

読めるようになったもののアセンブリ自体は原始語といえるもので、現代人の言語とはやはりかけ離れるんで、さらに自然言語に近づけたいわけです。命令自体も単純なことしか出来ませんからね。というわけで高級言語が作られるに至ります。(人間の自然言語に近い、という意味で高級。機械に近いと低級言語。“良い”“悪い”ではない。) 

 

よくリーダブルなコードを書くように!と言われます。(ダレに?)

結局これはダレのためでもない人間自身のためなんですよね。プログラミング言語自体、機械語を間接的に読み書きするための手段であり、読みにくいコード書いたら意味ないじゃんっていう。

 

 

言葉の持つチカラ

現代人は言語を使って、より抽象的な概念を考えたり、作り出すことが出来ます。

より柔軟なコミュニケーションが出来ます。

 

『アレやっておいたから』と家族、友人に言えば、きちんと伝わるのが人間です。これは極端な例ですが、例えば『掃除をする』で考えてみましょうか。

掃除をする、とは状況によりますが、より明確に言うならば、  

掃除をする、とは
・いるものといらないものに分ける。(それらを判断する基準?)
・部屋にある物をあるべき所に戻す(あるべき所とはどこだろう?)
・掃除機でホコリを吸い込む(掃除機はどう使えばいいか?)
・ゴミをまとめて、ごみ収集に出す。(いつ、どこに持って行く?)
これらを抽象化した言葉

掃除する、という言葉を選んだのに特に意味はないんですが、たった一つの言葉にいろいろな概念や作業が含まれていますね。で人間は状況に応じて、実際どうすべきかを判断するわけです。これって良く考えればすごいですよね。機械には出来ませんからね。

今のところは。

なんでこんな風に機械に命令できたらいいよねーって話になったと思うんです。なんで抽象化とは、機械に譲歩しないで済むための手段なのだと思います。

 

 

高級言語の登場!

というわけで生まれたのがFortranという初のプログラミング言語

詳しくはわかりませんが、不完全ながらも英文には少し近づいた表記になっているようです。

 

そして決定的な言語である、C言語の登場です!多くのコンピュータ言語が影響を受けたようで、場合によってはいまだになくてはならない存在のようです。これは、かなりもう英文っぽい一種の暗号のような表記です。

 

大きな注意点としては、コンピュータはこれら高級言語を直接は理解できず、コンパイラが間に入っているということ!つまりプログラミング言語自体をコンピュータは読まない、ということです。

 

思うんですけど、プログラミング言語の意味不明というか解せない所って全部、人間が機械に対して譲歩している部分だと思うんですよね。で今というかここ20年くらいコンピュータってなくてはならない存在だし、いろんなことやってくれて、それで現代社会が成立しているわけで、何でもできるってやっぱ思い込んでると思います。

 

 

しかし、やはり出来ないことの方が多いから、人間が折れるしかないわけです。そのコンピュータが、何ができて何が出来ないかを知らないとプログラミングって行為自体が理解できないよなーと思います。

 

 

さて、抽象化することで人間の感覚に近づけよう、という流れの中で我らがC#が出来ます!!

 

これはもうほぼ英文に近いです。

ただし、オブジェクト志向というものを理解する必要がありますが。

 

オブジェクト志向という概念については、もう役割分担でいいんじゃねーの?とか思ってきました。各機能ごとに担当を決める、っという解釈です。

 

一枚の紙に全ての命令を書くと読むのが大変だ!

じゃあ項目ごとに書く紙を分けよう!(“クラス”を作る)

別々に書いた紙をどう結合させる?各紙ごとの担当者が必要だ!

(オブジェクトを作り、オブジェクトに管理させる。)

オブジェクトはいわば架空の人物であったり、物なんですよね。

じゃあなんでそんな架空の存在を作り出すかと言えば、人間が楽だから。 

 

これも全て全部、人間のためのもの。

最終的な0と1の羅列である命令文を読み込み、処理するだけ。

なんかもう既にかなり機械に振り回されているんだな、とか思いますね。

 

 

C#はとてもいい言語だけど 

C#ですが、英文にかなり近いとはいえ、人間が譲歩すべき部分は本質的にあまり改善されていないので、あくまで面倒な部分が隠されているに過ぎません。

 

コードにある、コンピュータがどう動いているか?という性質、あるいはそのコードを書いた人のロジック、思考プロセスを読まないといけないんですよね。

 

ここら辺をきちんと説明してくれる人が少ないので困ってしまうわけですし、

初心者向けであるはずのC#で挫折してします人を生み出すんではないでしょうか?

自分も挫折しかけたというか一昨年の冬に入門を中断しましたからね・・・。

 

 

なんでC#を初めとした高級言語は人間のために、0と1の集合体を抽象化したものにすぎず、コンピュータ自体が実際どう動いているかイメージすることの重要についての考察でした。 

 

でもやっぱりC#じゃなきゃプログラミングなんてできなかったと思いますけどね。

もう少し教えてくれる人がいれば楽だあったかなー、という話でした!!