'Programming Languages That Blew My Mind'というブログ記事で、8歳からプログラマーとして活動しているDavid Tellerさんが、人生で出会った革新的なプログラミング言語について紹介している。
BASIC
A language designed to make programming simple.
- Mind blown: Programming my own games!
- Mind blown: Arrays (or DIM, as they were called)!
- Mind blown: GOTO!
- Mind blown: GOSUB!
Original, line-based, Basic is dead, but its legacy lives on in VB.Net, VBA, but also in more subtle manners in today’s dynamic languages (Python, JavaScript, etc.)
- 初めて自分でゲームをプログラミングできた感動
- 配列やGOTO、GOSUBなどの基本概念との出会い
- 現代の動的言語(Python、JavaScriptなど)にその遺産が生きている
という点がBASICの良さとして挙げられている。
私もプログラミングの入り口は、BASICでのゲームプログラミングだったので、その感動はよく分かる。ただ初めて出会った唯一知っている言語だったので、プログラミング言語としての感動があったかと言われると、そこはよく分からない。行番号やGOTO、GOSUBなどのBASICとして特徴的な機能も、プログラムにはそういったものがあって当たり前だと思っていたし、それこそ関数とかいう概念が頭の中にないので、GOTOがあるのになんで元の場所に戻るGOSUBという命令が別にあるんだろう、とか思っていた。
(Turbo) Pascal
- Mind blown: A programming tutorial!
- Mind blown: An IDE!
- Mind blown: The compiler can actually help you find your errors!
- Mind blown: A debugger that is actually useful!
- Mind blown: Structured programming!
- Mind blown: Units (aka “modules”)!
- Mind blown: Object-Oriented Programming (although it wasn’t very useful in the libraries)!
- Mind blown: A UI toolkit!
- Mind blown: Dynamic memory allocation!
- Mind blown: A community of developers (also, SWAGS)!
- Mind blown: Memory overlays!
まともなIDEがあるプログラミング言語に初めて触ったのがTurbo Pascalなのも全く同じだ。BorlandのTurboシリーズは強力なIDEと高速なコンパイル時間が魅力で、BASICのラインエディタや実行時の簡略なエラーメッセージと比べて、格段の進化を感じた。
Pascal自体も近代的な構造化プログラミングを適切に教えてくれる良い言語だったが、Delphiで触れたオブジェクト指向的な部分はまだよく理解できなかった。あとブロックでいちいちbegin
とend
を書くのが面倒、とかいう理由もあり、その後触れたTurbo Cの方を愛用していた。
x86 ASM
- Mind blown: Memory addressing!
- Mind blown: The stack is an illusion!
- Mind blown: Interacting with the graphics adapter directly!
- Mind blown: Interrupts!
- Mind blown: Registers!
- メモリアドレッシング、スタック、レジスタの概念
- グラフィックアダプターとの直接的なやり取り
- 割り込み処理の理解
x86アセンブラは私もPC-9801時代に扱っていた。が、私はその前にBASICの次の言語として、PC-6001でZ80アセンブラを扱っていた。理由はBASICが遅かったから。マイコン時代のゲームプログラマがアセンブラ、機械語に手を出す理由のほとんどはパフォーマンスだろう。
PC-6001時代はハンドアセンブルで、アセンブラを機械語へ手作業で変換していた。16進数への変換やジャンプ先アドレスの計算をミスると、すぐにリセットがかかりプログラムが吹き飛ぶというスリリングな環境だ。今から考えるとよくそんな面倒なことをしていたなという感じだが、そのおかげで各命令の実行が何クロックかかり、どういう命令を使えば最短で処理ができるか、みたいなところを詳細に見ることができた。
アセンブラは、それ自身もレジスタの取り回しやx86のセグメントの扱いなどが難しいが、そこからアクセスする機種固有の仕組みにも難しいところがあった。主にグラフィックス周りで、PC-6001だとVRAMの制御、MSXだとVDPによるスプライト処理、PC-9801のGDCやEGCなどのグラフィックスコントローラ制御など。この辺のハードウェア固有の仕組みを直に触れるのも、アセンブラの楽しいところであった。
Java
- Mind blown: A standard library that felt like it contained everything I needed!
- Mind blown: A documentation that was meant to be understood by its users!
- Mind blown: The JVML!
- Mind blown: A UX toolkit that was very simple to use (even if the results were disappointing)!
- Mind blown: Synchronization as a language primitive (even if wasn’t necessarily a great idea)!
- Mind blown: finally!
- Mind blown: Just in Time compilation!
- Mind blown backwards: Understanding how finally was implemented in the JVM.
私がオブジェクト指向をちゃんと学んだのはJavaからだった。当時は適切なインターフェースや継承の設計、カプセル化を行うことが分かりやすいコードを書く上で重要だった。関数型プログラミングへの潮流が高まっている最近のベストプラクティスとはだいぶ異なるが、分かりやすいクラス設計とは、みたいなことを色々考えるのは楽しかった。
JVMが実現するWrite Once, Run AnywhereもJavaの面白い特徴だ。一度書いたコードがそのままいろんな環境で動くのはとても画期的だった。ただ、ガラケーのような貧弱な環境までJavaでカバーしようとしてたのは、今考えると頑張りすぎのような気もする。バイトコードレベルでの最適化、コンパクト化を考えながらJavaのコードを書くのは、それはそれで面白かったが。
Prolog
- Mind blown: Teaching the program how to think!
Prologはハノイの塔がやたら短くかける言語、というのが最初の印象だった。それを実現しているのは、命題の宣言的記述、単一化、バックトラックなどの他の言語にない特徴であり、その異質さがPrologの楽しさでもある。
Prologを語るうえではカット演算子(!)は外せない。カット演算子はPrologのバックトラックを制御するためのもので、バックトラックで戻る選択肢を削除する。これはパフォーマンス改善のために導入されているものだが、うまく使わないとプログラムの挙動も変わってしまうという困りものだ。また、宣言的に書かれたプログラムに手続き的な観点が入ってしまい、理解がとても難しい。カット演算子は、理想と現実の狭間に生まれた演算子で、Prologの面白くも悩ましいポイントを表している。
著者は上記以外の言語として、HyperCard、(O)Caml、Coq、Erlang、The π-calculus、Opalang、Rustを挙げている。これらの言語は私はあまりなじみがない。私個人として追加するとしたら、Viscuit、ActionScript、TypeScriptかなあ。
Viscuit
レンズという仕組みで、現在の絵の状況を、どのような絵の状況に変化させるかを宣言するビジュアルプログラミング言語がViscuitだ。絵を2つ並べるだけでそれがコードになるという点がとてもユニークである。
Viscuitはある意味ビジュアルなPrologとも言えよう。視覚的なパターンマッチングを繰り返すことでアニメーションを実現するのがViscuitで、論理式の単一化で推論を実現するのがPrologだ。Viscuitは画面全体にルールを同時適用する並行処理、Prologはバックトラックを含む逐次処理という点は異なるが、どちらも宣言的なルール群がコードになっている点が共通点である。
ActionScript
私が触ったActionScriptはver.3.0で、ECMAScriptの流れを組む素直な言語だ。クラスの記述などJavaに似ているところも多く、言語として特筆すべき点はあまりない。
ActionScriptの特徴と言えば、言語が死んだことだ。正確にはその言語のターゲット環境であるFlash Playerが死んだ。他の言語でも外部環境の変化に応じてゆるやかに衰退していくことはよくあるが、ActionScriptは2020年のFlash Player配布終了に向けて急速に衰退した。
ActionScriptを今から使おうという人はいないと思う。ただその経験者の心の中に、Flashを使ったゲームやアニメーション制作のノウハウが残るのみである。
TypeScript
TypeScriptはオプショナルな型付けと型推論によりバグの早期発見と強力なコード補完を可能にした言語だ。トランスパイラとして機能し、書かれたコードをJavaScriptに変換する。JavaScriptが持つ弱点をそのまま引き継いでいるところはあるが、その辺に注意して使えば、柔軟性と堅牢性のバランスが取れたよい言語だ。
あるプログラミング言語により使いやすい糖衣構文などを加えて、トランスパイラで変換するというアプローチはCoffeeScriptで知った。当時はJavaScriptをターゲットとしたAltJSが多数開発されたが、TypeScriptが圧倒的な支持を得て主流となった。
追記
いくつか興味深いプログラミング言語を忘れていた。
Elm
ElmはWebUIのための純粋関数型言語である。WebUIというドメインに特化してシンプルに作られていたため、Haskellなどの他の関数型言語と比較して理解が容易だったように思える。
ElmはElmアーキテクチャと呼ばれるWebUI設計手法を取り入れていたのだが、それがver.0.16からver.0.17でガラッと変わったのも面白いポイントだった。0.16までで使われていた関数型リアクティブプログラミングは0.17で採用されなくなり、subscriptionに基づく手法に置き換わった。より直感的で使いやすい方法が見つかったので次からそれに乗り換えます、というのは通常の言語ではなかなかお目にかかれない。Elmのような、開発者個人の理念に基づいて設計が行われている言語ならではの特性である。
Befunge
Befungeはいわゆるesolangに含まれる、実用性を目指していないジョーク言語だが、その最大の特徴はコードが2次元のグリッド上に配置されることだ。プログラムカウンタも単に増加するのではなく、2次元上を上下左右に動く。グリッドの各キャラクタが命令を表していて、プログラムカウンタの方向を変える命令もある。
Befungeで実用コードを書く人はいないが、オーディオプログラミング言語というドメインにおいては、ORCAなどの実用的な2次元コード言語も存在する。
2次元コードのプログラムは、その実行時にプログラムカウンタが動き回る様子を見て取れるのが面白い。また2次元コードはビジュアル的にディスプレイ上で編集する場合に、狭い面積に多くの情報を詰め込みやすい。カルネージハートなどのプログラミングゲームにおいて採用されることがあるのは、そのような理由があるかもしれない。
Core War
前述のカルネージハートや地球防衛軍II FAR SIDE MOON、HR2など、ゲーム内プログラミング言語はそのドメインがあまりにも特殊なため、言語自体もクセが強いものが多い。それらの中でもプログラミングというフィーチャーがむき出しになっているゲームと言えば、Core Warが挙げられるだろう。
Core Warでは、自分と敵の2種類のプログラムカウンタがメモリ上の機械語を実行しながら移動する。相手のプログラムカウンタに無効な命令を踏ませて全滅させれば勝ちだ。Core Warでは複数のプロセスを走らせることもできるが、プロセスが多くなればなるほど各プロセスの実行速度は低下する。これらの特性を考えながら、自らを守るために複製を作り、相手を探し出し倒すコードはどのようなものか、ということを考える必要がある。
他にもD言語やC#、Haxeなど愛用した言語は多々あるが、そのベースは他の言語に似ている、などの理由で今回は選ばなかった。あなたにとって「革新的!」「ヤバい!」と感じた、心のプログラミング言語は何ですか?