計算機科学者(コンピュータサイエンティスト)たるもの,古い言語に執着して新しい言語を学ばないことは恥ずべきことだ.かと言って,新しい言語を追いかけすぎても計算機の本質を見失うことになる.そこで,2017年の計算機科学者がマスターしておくべき七つの言語を理由付きで紹介しておこう.
(ちなみに全て僕の主観である.反論はこちらでも良いし Twitter でも受け付けたい.)
A. 計算の本質を極めるための言語
計算機科学者は計算の本質を極めねばならない.それには Lisp 系言語は鉄板として,他に意外な言語が役に立つだろう.
A-1. Scheme
計算の本質はラムダであり,その最もシンプルな計算機表現はS式だ.S式をマスターするには,S式そのものである Scheme 言語が一番良いだろう.名著 Structure and Interpretation of Computer Programs を読むにも Scheme の読解力が必要である.
A-2. Common Lisp
Common Lisp のマクロは「プログラムを生成するプログラム」として唯一の実用的な言語だ.また大規模なプログラムも書ける上に,もし好きならオブジェクト指向方法論を自然に取り入れることも可能だ.
僕は「計算機言語の本質は機械語だ」という主張を否定しない.ただ僕は「Lisp は Lisp 機械の機械語だ」と主張したい.だから Lisp プログラマは,機械語プログラマでもある.
Common Lisp の教科書ではないけれど,On Lisp は Lisp のパワーを知る上で最上の本だと思う.
A-3. 冗談言語
チューリング完全な冗談言語を何かひとつマスターしておこう.そうすることで,チューリングマシンの気持ちか,あるいはラムダ式の本質がわかるようになる.前者を試したければ Brainfuck を,後者を試したければ Lazy K を勧めたい.
B. 数学とプログラミングの間を泳ぐ
計算アルゴリズム,つまり逐次実行,条件分岐,繰り返し(または再帰)の組み合わせと,伝統的な数学の間には大きな乖離があるように見える.この両者はラムダ式によって見事に統一されるのだが,それでもなお,ユーザとの入出力,非決定性,状態などの重要な概念と数学の参照透過性という概念の間には大きな溝がある.この両者は最終的にモナドという数学概念を通して統一的に扱えるようになる.そこで,モナドを意識したプログラミング言語をぜひ一つはマスターしておきたい.
B-1. Haskell
モナドを陽に扱う計算機言語のひとつとして,比較的ライブラリが充実している Haskell を勧めたい.
Haskell は v7.10 以降が数学的に美しい(アプリカティブ関手が正しい位置に収まる)のだが,教科書やウェブサイトによっては v7.10 よりも古いコンパイラを対象としたものがあるので注意が必要だ.
C. 実用的なコードを書く
計算機科学者は実用的なコードも書かなくてはならない.Common Lisp や Haskell でも実用的なコードは書けるが,よりポピュラーな言語も覚えておく必要があるだろう.なおシェルスクリプトと AWK は空気なのでカウントしなかった.
C-1. C++11/14
だいたいどんな計算機でも動く上に,大規模なプログラムも書ける.組み込みも C++ のサブセットでいけることが多い.
もし数値計算を行うならば,次に述べる Python を第一選択に考えてみるべきだ.数値計算のライブラリが豊富に揃ってきているし,コードも C++ よりは遥かに読みやすいものになる.
C-2. Python
実用的でクリーンなコードを書こうと思ったら Python (v3) がお勧めである.Python というと素人くさいと思われるかもしれないが,今や極めて堅牢で,実用的で,十分な実行速度がある.
C-3. Java | Swift | ECMAScript
モバイル開発,ウェブ開発のいずれかは出来た方がいいのと,ジェネリックだったりオプショナルだったりという,Common Lisp や Haskell の機能が劣化コピーされていく過程を見るという意味で,新し目の言語を一つは覚えておいた方がいい.
D. どうでもいい言語
最後に「歴史的理由」だけでマスターしておいた方が良い言語を挙げておく.
D-1. C89 (ANSI C)
プログラマなら C89 (ANSI C) は読めて当然という風潮が未だにあるように思う.C89 が支配的だった時代が過去のある時期続いたからだろう.
ただし C89 が支配的だった時代と現代では,求められるお作法がまるで違う.C89 で安全なコードを書くには常に知識をアップデートしていかないといけない.