複数のプログラミング言語を学ぶ理由

プログラマが複数のプログラミング言語に手を出す理由を考えるには、まず、プログラマの視点ではプログラミング言語がその役割によって4種類に分類されることを理解する必要がある。

  1. 「システムの構成要素」系
  2. 「楽したい」系
  3. 「お勉強」系
  4. 「趣味」系
    • 世の中には「言語スキー(プログラミング言語限定)」な人もいる訳で……。
    • 能書きなぞいらぬ! 楽しいからやっているまでのことよ!

全てのプログラミング言語がこの4分類に分けられるとは限らない、という点に留意すること。割と上記の複数に該当する言語は多い。

「システムの構成要素」系の言語を学ぶ理由は単純だ――その言語が使えないと、モノを作れないからだ。それ故に、この系の言語の学習者の中には、義務的に仕方なく学習する人も意外と多い。というか、熱意の無い職業プログラマはこの系の言語しか学ぼうとしないし、時には学びもせずに古い言語にしがみつくことすらある。

なお、職業プログラマ的には「この系の言語≒飯のタネ」だったりする側面もある。まあベテランになるにつれて言語・フレームワーク以外の売り文句が出てくるものだけど(職場にいないかな、「○○の分野については××さんに聞いてみろ」みたいな人)。

「楽したい」系の言語を学ぶ理由は、その名の通り楽をしたいからだ。すなわち、偶有的(非本質的)な雑事に煩わされるのを避けて、本来労力をつぎ込むべき課題に集中して取り組むためである。

面倒な手作業は、一度自動化しておけば、後でつまらないミスが原因で苦労することがなくなるし、同時に「面倒だからやりたくない」という心理的障壁がなくなってストレスが軽減されるものだ。

ついでに言えば、「自動化が面倒だ」という心理的障壁を薄くするために、スクリプト言語や簡易言語が選択されることが多い。既存のコマンドの羅列・組み合わせで済むならシェルスクリプトやバッチファイル、比較的単純なテキスト処理ならsedawkなどのテキストフィルタ、もう少し高度な内容ならテキスト処理にも長けているPerlPythonRuby、COMを叩くならWSHJScriptVBScript)やPowerShell――という具合だ。あまり手をかけずにサクッと作ってしまうのがコツだ。

職業プログラマとして、熱意の無い連中より一歩抜け出すための第一歩として、この系の言語を学ぶことは有効だ。プログラマの三大美徳が見え隠れしだすのが、この辺りだろうか。

「お勉強」系の言語は、割とプログラミングという行為そのものが好きな連中が手を出す分野だと言える。好きだから/興味あるからこそ、手を出すのが苦ではないのだ。

プログラミングが好きだからこそ、もっと上達したい。そのために、新たな知見を得るために、今まで触ってきた言語とは異なる特徴を持つ言語で遊ぶのである。

私自身は悪い意味で怠惰なので、純粋な「お勉強」系で強く影響を受けたのはScheme再帰)とProlog(ルールベース)ぐらいと数少なく、しかもどれもこれも入り口付近を少しだけかじった程度だが……お仕事を口実として、オブジェクト指向プログラミングをRuby(「オブジェクト指向」っぽいニュアンス)とC++(静的束縛)とObjective-C(動的束縛)から学んだし、第一級関数とクロージャJavaScriptLuaから学んだ上でObjective-C(ブロック構文)とC++11(ラムダ式)に輸入して用いている。それと、Prologを学んだことでMakefileについての理解が深まった*1

重要なのは、プログラミング言語(特に高水準言語)は「コンピュータを抽象化した計算モデルを提供するインタフェース」だということだ。提供されるモデルが異なるからこそ、ある問題を解くときに最適なアプローチが言語によって異なる。モデルによって得手不得手が異なるのは当然のことだから、各モデルの得手不得手に応じて書き方を変えるのは当然のことだし、ある問題を解くのが得意な言語と苦手な言語があるなら得意な言語を使うべきだろう。

言語の違いを「単なるシンタックスの違い」と捉えるのは大間違いだ。そんなこと言う奴は犬に食われてしまえ。

――とまあ、プログラミングという行為そのものが好きな連中は「お勉強」系の言語に手を出すし、私のように悪い意味で怠惰な人でも「業務上必要になったから」という建前を隠れ蓑に嬉々として新たな言語をしゃぶり尽くそうとするものである。

とはいえ、「趣味」系にまで昇華する人は、プログラミングが好きなプログラマの中でもごく一部だけだ。いや、趣味は人それぞれだから――プログラミングという行為の中において興味を抱くポイントは人によって異なるので、プログラミング言語ではない別のものを趣味とする人も多いものだ。

*1:makeは依存関係(事前準備として何が必要か?)を中核としたルール記述言語の処理系だと考えればよい。