昔はいろいろさわって好みもあったけど、今はあまり特定の言語に執着がなくなってしまった…というのを昔を振り返りながら書いてみる。
はじめてのプログラミング
高校生のとき部活でゲームづくりのために Visual Basic 6.0 を触り始めたのが初めてのプログラミング経験だった。 ボタンなどのウィジェットをウィンドウに置いていくことで GUI が構築できて、初心者でも視覚的にわかりやすいのがよかった。 (当時は RAD とかポトペタとか言われてた気がする) 入力したプログラムの大文字小文字が間違ってても自動で直してくれる機能もあり、なかなかに便利だった。 そのうちスムーズに動くゲームを作りたくなって、VB のプログラムの性能がそれほど良くない点、また Windows の API を直接操作するのが難しい点がネックになり、大学にかけて C 言語 →C++のほうにいった。(VB で DirectX を使う方法もありはしたが…)
たしか当時 C,C++,Delphi, (もうちょっとあとで D 言語) あたりでゲームを作ってる人たちがいて、一瞬 Delphi も触ったけど結局 C 言語 のほうに行った。 C 言語 ポインタ完全制覇、エキスパート C プログラミング: 知られざる C の深層あたりを読んで、基本的な考え方や、いわゆるハッカーノリを知ってプログラミングへの興味が深まった覚えがある。 C++は…最初の頃は better C として使いつつ、少しずつ赤い本やら青い本やらを読みながら、オブジェクト指向やテンプレートメタプログラミングを学んでいった。ゲームを実装する上では第一選択の言語と思いつつ、その「重さ」(コンパイル時間とか、言語仕様とか)が気になっていった。
学生時代
大学時代は C++をメインに使いつつ、それ以外の言語もちょいちょい触っていた。
- Python
- オフサイドルールや lambda 式、battery included なのがよく、当時好きだった
- 特定の IDE にロックインされない点もよかった
- 開発には Visual Studio を使いつつ、それ以外の用途では Vim を使う感じだった
- Tkinter とかでちょっとしたツールを作ったりした…が配布が面倒だった
- Lisp
- 図書館で初めての人のための LISPを読んで、だいぶ感化された
- その後The Little Schemerも読んだ
- 竹内先生の最終講義も聞きに行った
- 研究室の輪読で Scheme を実装したり、TinyScheme の実装 や R5RS を読んだりしてた
- 図書館で初めての人のための LISPを読んで、だいぶ感化された
- Lua
- ゲーム開発用の組み込み言語として気になっていた
- Lua を使うというよりは、Lua の実装を読んでた
- ActionScript3
- 趣味でちょっとしたゲームを作ってみて、割といいなと思った
Gang of Four のデザインパターン本とかも読んだけど、「なんかややこしいな~」という印象だった。 そのうち高階関数があたりまえに使えるようになると当時あったデザインパターンも一部不要になり、「高階関数みたいな、シンプルかつパワフルな機能はすごい」という気づきを得た。
社会人時代
その後社会人になって、さらにいろいろ触るようになった。ゲームそのものというよりはサーバやツール開発が中心だったが…
- C++
- オブジェクト指向の功罪(おもに罪)を感じた
- メモリ破壊バグのつらさ、マルチスレッドプログラミングの難しさを知った
- C10K 問題, libevent, Boost.Asio…
- C#
- ASP.NET(WebForms)や Silverlight で、久々にポトペタに戻った
- LINQ to Objects はめっちゃ便利で、ひたすらこれを使ってた
.Where(x => x > 10)
みたいなやつ、今でもよく使う
- 型推論も便利だった
- けっこうレガシーな機能がそのまま残ってて、たとえば「
List<T>
のほうが便利だよ」みたいなのがわからなかった - WCF とか Entity Framework とか、なんかゴツいシステムはうまく要件にマッチすると便利だけど、ちょっとでもずれた時につらすぎるな~って思った
- Haskell
- Tim Sweeney さんの話とか、これからゲーム開発で Haskell 来るんでは…みたいなので盛り上がってた
- 実際 2025 年の今、ようやく Verse で Haskell の時代が来てそうではある
- すごい H 本とかふつうの本、を読んだ
- 純粋関数、パターンマッチングの強さを知れてよかった
- 一方遅延評価は難しいな~と思った(どう実行されるか理解しづらいし、消費メモリ量を予想しづらい)
- 仕事や趣味の開発で使ってはいないけど、勉強になった
- Tim Sweeney さんの話とか、これからゲーム開発で Haskell 来るんでは…みたいなので盛り上がってた
- Perl
- Go
- C++のつらさから解放されたい & 並列処理で性能が出るということで興味を持った
- 結果、気に入った
- 言語仕様の小ささ
- 静的型付による安心感
- (Python ほどではないが)サーバを実装するための最小限な battery included な感じ
- standard な formatter があることによる宗教戦争の回避
- コンパイルした実行ファイルを渡しやすい(ランタイムライブラリのインストール不要)
- GC、Channel を介した通信、Goroutine による並行処理の書きやすさ
- Erlang
- 飛行機の本を読んだ
- 良さは感じつつも、結局実用する機会はなかった
- Rust
- C++のつらさからの解放という意味では第一候補…だけどいまいちやるタイミングがない
今とこれから
あれこれやってみて、結局どの言語にも好ましいポイント、好ましくないポイントはあって、それは単に言語や処理系だけじゃなくてツールや周辺の環境まで幅広く言えるし、時が経つにつれて自分も環境も移り変わっていくんだなという気持ちになった。
- 今でも好ましいもの
- 明示的
- 正格評価
- シンプルかつパワーがある
- 言語仕様が小さい
- 高階関数が使える
- 実行効率がよい
- 十分高速に動作する
- いろんな環境で動かせる
- 動作に必要なランタイムが薄い
- バグがおきづらく、未然に防がれる
- 静的型付
- 質のよいライブラリが多い or 作りやすい
- パッケージのフォーマットが決まっており、パッケージマネージャで簡単に入れられる
- 明示的
- 当時好ましかったけど今はそうでもないな~というもの
- Python の battery included
- 使うものを選択できてコンパクトに作れたほうが好ましい
- Python のオフサイドルール
- リファクタリング等コード編集で崩れるので、明示的に
{}
でブロックのほうが好ましい
- リファクタリング等コード編集で崩れるので、明示的に
- Lisp の自由度
- 静的型付のほうが問題が事前に気づけて好ましい
- 特定の IDE へのロックインのなさ
- LSP で割と解消された部分も多い
- とはいえ Unity 開発は Rider が主流、みたいなやつも多い
- Go の言語仕様
- 当時はシンプルで好ましかった
- 今は Generics も入って、古い書き方とごっちゃになるのが好ましくないな~という気持ちがある
- とはいえ過去のコードを今風に全部書き直すのは現実的ではないというのはわかる
- Python の battery included
- 一周まわって好ましくなったもの
今は「この言語が好きで、こればっかり書きたい、なんでもこれで書きたい」という気持ちはあまりなくなり、「必要ならなんでも勉強して書くけど(幸い AI で勉強しやすい時代になってるし)、好ましい点が多いほうがいいし、できる範囲で好ましく変えていこう、それは言語だけがどうというよりは、もっと開発全体のバランスを好ましいほうに向けたい」という心持ちでいます。