一つの言語を習得しても,やはり他の言語を学ぶのは難しい

http://d.hatena.ne.jp/Isoparametric/20070706/1183708963
ついでに.

「ひとつの言語が使えるようになれば、他の言語は簡単にマスターできるから言語なんてずっと勉強するものじゃないよ」
http://d.hatena.ne.jp/bleis-tift/20070705/1183636561

と飲み会で言われたというお話。
僕も昔はそう思ってましたけど「簡単じゃないよ」と最近は思っています。

当然だが,これは「簡単じゃない」でいいと思う.*1
言語によって設計思想も異なるし,言語によって持つ機能がそれぞれ異なる.オブジェクト指向/非オブジェクト指向,動的型/静的型,手続き型/関数型,etc.その違いがアルゴリズム設計やコーディングイディオム,さらにはデバッグ手法にまで影響を与える.

例えばCとJavaなんて比較的似ている従兄弟みたいな言語だけど*2,それでもCからJavaに移った人間の嵌りやすい部分には,次のようなものがある.*3

  • 基本的なオブジェクト指向(クラスとインスタンス,継承やポリモフィズム
  • ポインタと参照の違い.
  • 同一性と同値性
  • 配列もStringもオブジェクト.
  • インターフェース
  • Garbage Collection,(特に到達可能性の概念と,Lazyに処理されるのが理解できない.)
  • GCがあることを前提とした,クラスやアルゴリズムの設計.
  • 動的最適化(C言語にはない)とパフォーマンス特性.
  • マルチスレッドベースの並列処理とメモリモデル.(C言語レベルでは並列処理がない)
  • 例外機構.
  • 豊富な標準API

JavaからRubyだと更に嵌ったし,さらにギャップの大きいLISPに至っては今でもまともに使えない有様だ.


言語を知らない人ほど「井の中の蛙」になりやすく,「他の言語は簡単にマスターできる」なんて暴言を吐くのではないだろうか.

*1:比較的近い兄弟のように似ている言語間なら,わりと簡単かもしれない.たとえばJavaC#とか,C言語C++とか,PerlRubyとか.その場合でさえも,あくまで「比較的楽だ」というだけで「使いこなす」というには程遠いものなのだが.

*2:LISPに比べたら,まるで双子のように似ているんじゃないかな.これについてはLISPerからの反論歓迎.

*3:OOP回りを除けばC++ => Javaでも似たようなものだと思う.