初心者向けの言語
http://d.hatena.ne.jp/Isoparametric/20070803/1186113231
ちょっと前に入門にCはどうよ、というネタで盛り上がっていた、というかネタの拡散に一役買っていた気もするのだけども、ふと自分が以前書いていたネタを思い出したのでリンクを張っておく。
熟練できないプログラマが溢れかえるような言語は優れていないのです。
(マニアには他人との差別化ができてご満悦でしょうが。)
Javaのように「簡単な言語」では,非熟練プログラマーが使っても致命的なエラーが発生しないので,そういう人達が自分が未熟であると自覚しにくい.Javaにさえもそういう危険はある.そう,Javaは初心者に教えるには「簡単すぎる言語」なのだ.
ただ優秀なのが誰なのかを見分けるのがすごく難しいのだ。かつては学生の出来がいいかどうかは、再帰アルゴリズムを数秒で書き出すことができるかとか、連結リストを操作するポインタを使った関数を、ホワイトボードに書くのと同じくらいの早さで実装できるか見れば良かった。しかしJavaスクールの卒業生たちについては、彼らが躓いているのが十分な教育を受けていないためなのか、それとも優れたプログラミング仕事をするために必要な脳の部分を持ち合わせていないためなのか、わからないのだ。[Javaスクールの危険]
http://d.hatena.ne.jp/JavaBlack/20061203/p1
それにしてもこの「熟練できないプログラマが〜」って、一体誰が言い始めたものなのかな?
昔 Java-House で高木さんが似たようなこと言ってたような・・・あった、これだ。(以下略)
http://d.hatena.ne.jp/odz/20061130/1164904734
まあ,少なくとも専門家の間でコンセンサスを得られている言葉ではないでしょうね.
じゃあどういう言語が初心者に優しいのかなーとか考えるんですが。
まず初心者は、プログラミングの勉強とプログラミング言語の勉強を同時にやることになるわけで、言語仕様があんまり大きかったりややこしかったりするとよくないように思う。
http://d.hatena.ne.jp/niha/20070802#1186070742
大学や専門学校のカリキュラムとして,「初心者に教えるべき言語」は必ずしも「初心者に優しい言語」である必要はないだろう.たしかにC言語が初心者に優しい言語ではないかもしれないが難しすぎるほどではなく,初心者に教えるべき言語の最有力候補なのは間違いあるまい.*2
- 言語仕様がシンプルである.
- 今現在も実用レベルの言語である.
- 抽象化の度合いが低いので,内部実装に関する理解の程度が作ったコードの品質にダイレクトに出る.*3
- 抽象化の程度が低く,ソースコードを追うことでノイマン型コンピュータの仕組みや動作を理解しやすい.*4
なおC言語の配列やポインタ*5などは,極めてシンプルと言って良いと思う.アレが理解できないのは,単に素質がないだけでは.
あとC言語が理解できない人で,まともなJavaのプログラムを書ける人はあまりいないと思う.これは「Javaスクールの危険」で出ているポインタと再帰に必要な能力,
ポインタと再帰には、ある種の推論力、抽象的思考力、そして何よりも問題を同時に複数の抽象レベルで見るという能力が要求される。そしてポインタと再帰を理解できる能力は、優れたプログラマになるための能力と直接的に相関している。
が,Javaで必要とされるOOP技術やGoFの基礎となっているからだ.C言語を容易く理解し自在に使いこなす素質の無い人間には,Javaを使いこなすのはまず不可能だろう.
関連:http://d.hatena.ne.jp/JavaBlack/20070726/p1
*1:ちなみに「マニアには他人との差別化ができてご満悦でしょうが。」の方はC++が筆頭かな.
*2:一昔前だったら,Pascalも候補に上ったんだけどね.残念だけど実用言語とは言いにくいのが難点.生き残ってるのはDelphiだけかな?
*3:抽象化の度合いが高くても内部実装の理解はコードの品質に大きな影響を与えるのだが,その品質を判断するのが初心者にはできない.
*4:そういう意味ではLISPのような関数型言語やRubyのようなスクリプト言語は,初心者には良くないと思う.すべからく抽象度が高すぎて,初心者だと「(ノイマン型)コンピューターの内部では,あんな風に動作してるんだ」と誤解する危険もある.やはり関数電卓を使うようになる前に,四則演算その他は手計算でできるようになっておく必要はあると思うんだ.
*5:「配列もポインタだよ」なんて野暮なツッコミはこの際無しの方向で.