こんにちは。ヤマヤタケシです。
気づけば、36歳独身、親が積極的に嫁候補を探しています。
最近、プログラミングを始めた人がいたのでシリーズその2です。
今回は、自分の使ってきた言語を紹介します。
がーっと書くと、N88日本語Basic, C, C++,Objective-C,Lua,Perl,Ruby,Java,JavaScript
です。
なんでそんなにたくさんあるんだね?
とか、1個で良くない?とか言われたのでその当たりも書いてみます。
それぞれ特徴がありますし、存在理由もあります。
触れた順番に書いていきましょう。
っと、その前に理解して欲しいことがひとつあります。
どのプログラミング言語であれCPUが実行できるのはCPUが用意した命令だけなので、16進数で表現されるマシン語に変換されます。普通の人間は数字の羅列を見ても何が行われているかわかりません。
わからないのでプログラミング言語が必要となります。
さて、続きです。
■なにはともあれ、N88日本語Basicから始まりました。
最初に触れた言語です。PC-9801DXの付属品です。ベーシックマガジンのリストを写経することでプログラミングの第一歩を踏み出しました。
Basicはインタプリタです。実行時にBasicからマシン語に変換しながら実行します。
変換する処理分遅くなります。
なぜこの言語なのかというと、PC-9801DXに付属していたからです。
昔のパソコンはBasicをつけとくから、あとは自分でプログラムをするんだよというスタンスでした。
■アセンブリ言語というかマシン語というか機械語というか
Basicは遅い!
玄人はマシン語とBasicを組み合わせるんだ!
というのが当時の通説でした。
マシン語は数字なので、数字に文字列を与えたのがアセンブリ言語です。
8086アセンブラ入門より引用しますと、こんな感じです。
55=PUSH BP
8BEC=MOV BP,SP
9C = PUSHF
–引用おわり。
あ、左がわの数字は16進数です。9=9, A=10, B=11, C=12, D=13, E=14, F=15です。
ゲームはグラフィックを扱います。グラフィックのデータは大きいので速度のボトルネックになります。
なので、グラフィックの一番重い処理だけをアセンブラに置き換えて最適化ができます。
ベーシックマガジンのリストにも、最後の行に16進数がズラッと並んでいて、それがマシン語のメモリ表現になっていました。
また、PC-9801にはモニタモードってのがあって、アセンブラが使えました。ちょっと努力したのですが挫折しました。画面に点を出すところまではできました。
「PC-98 モニタモード」で検索すると、ガチでアセンブラをやり続けてた人の記事がありました。→
8086アセンブリ言語の昔話
■C言語
Basicとアセンブラの時代が終わります。
C言語は、Basicよりも高機能でしかも、実行速度が速い!のでBasicを過去の物にしてしまいました。
言語として、C言語にはBasicにはなかった機能があります。ローカル変数と関数と構造体です。
Basicの変数は全てグローバルなので、サブルーチンから同じサブルーチンを呼ぶと、数値を上書きしちゃって大変です。
その点、C言語は関数と、関数内でのみ有効なローカル変数があることで、再帰呼び出しができるようになりました。
また、変数の影響範囲を制限できるので、共通処理を関数にすることで、再利用できます。
C言語は、実際のところアセンブラよりは遅かったのですが、アセンブラは命令の粒度が細かすぎるので書くのが大変です。書いたら書いたで人間のやることなのでバグがあります。プログラムが上達するってのは、なるべく書かなくなるってことです。書かずに動かす。だからスゴイ。
そんなC言語を高校生の時に使い始めました。
当時まだPC-9801DXは現役です。
C言語を触るとガクゼンとしました。命令がほとんどないのです。
BasicではLINEで線が引けました。GETで覚えた絵をPUTすることができました。
しかし、C言語にはprintfとか文字列を吐き出す命令しかないのです。
こんなんじゃゲームが作れないよー!
当時のBasicはOSと言語とライブラリが一体となったものです。コンピュータが小さかったときです。
今だと、WindowsとC++言語とOpenGLと、OpenALとみたいな感じです。
C言語は純粋なプログラミング言語です。
ライブラリを組み合わせないとなにもできません。
いや、やろうと思えばアセンブラのようにハードに直接命令を与える関数を実装すればできます。
当時、しょうがないので絵を出すところからプログラミングしました。
メモリのどっかに書き込むと画面に点がでるというやつです。
ゲームを作りたいのになぜか、Basicでできたことを再実装しないといけないという、なんだかガッカリな感じでした。
でも、速いし、プロが使っているらしいし、ということで頑張りました。
今なら、イケテルライブラリがインターネットからダウンロードできるのでそんな苦労はしないでしょう。
当時は、Basicに戻りたい気持ちでいっぱいでした。
■C++
どうにかこうにか、PC9801でMS-DOSでC言語をつかってゲームを作れるようになったあたりで大学生になりました。
しかし、Windows95がでて、MS-DOS+C言語の時代が終わりました。WindowsはC++で作るらしいです。
なんなの?俺の学習速度じゃ、時代に追いつけないんだけど?
アセンブラを勉強始めたら、アセンブラの時代が終わるし、C言語がなんとか使えるようになったらC++の時代が始まるし、Win32APIは意味不明だし。
しかし、ゲームを作って大儲けをしたいという野望があるのでVisualStudioを購入して、C++をはじめました。
C言語の知識はそのまま使えました。しかし、C++らしい書き方は別にあるのです。
C言語にクラスを追加したものがC++です。
このクラスがふわっとしていてなかなか理解に苦しみました。
C++のクラスは、C言語でいうところの構造体と関数ポインタを合成して拡張したものです。
このクラスがくせものでした。
書き方の正解がわかりませんでした。
プログラムを機能ごとに分離独立させることで、再利用性がたかまるというのがウリ文句でした。
しかし、分離したところで、結合しないと動きません。どの辺を分解して、どの辺りで繋げばいいのかい?
というのが、なんともかんとも。
クラスは、うまく使うと本当に再利用ができます。コード量が減ります。
しかし、うまく使わないと混乱の元になりますし、コード量が増えます。
今現在も機能追加しまくっている最高に熱い言語です。
最速最大最強の言語です。
■Perl
C言語はコンパイルしますが、Perlはインタプリタです。
文字列処理がC言語とは比べ物にならないくらいに強力です。
ゲームのデータのテキストファイルをバイナリファイルにコンバートするときなんかに使っていました。
■Lua
C言語に組み込んで使う言語です。C言語にはない強力な機能が満載です。
ゲーム開発においては、Basic時代を取り戻したような気持ちになりました。
C言語で書いた命令をLuaから呼び出すという感じです。
言語の中に言語があるというのはデバッグが難しいです。
そのバグは、C側が原因なの?Lua側なの?ってなります。
C側のデバッグが終わっていれば、良いのですが、だいたい同時開発しますよね。
■疲れたのでここまで!
Perlあたりで限界を迎えました。
自分の人生を振り返るくらいには年をとったのか?俺?みたいな気持ちでいっぱいです。
小学校の頃からなので、30年近くプログラミング言語に触れています。
今は、ゲームを作るという仕事について、フルタイムで取り組むことで、言語の発達に追いつけるようになりました。
自分が大人になるのと同じように、プログラミング言語も成長してきました。
今でも体重が成長していますが、肉体は折り返し地点を過ぎて老化が始まっていることでしょう。
プログラミング言語はまだまだ成長しています。
上に伸びる成長だけじゃなく、木の枝のように横にも広がっています。
全部はムリですが、必要に応じて学習するという覚悟をもってもう30年頑張りたいものです。
そんじゃまた。
すげぇ!尊敬します!