比較プログラム言語論 平成16年6月16日 森田 彦
レポート(6/9)総括 < テーマ > 6/2のレポート抜粋に掲載されているレポート(意見)のいずれかについて、あなたのコメントを記述して下さい。その際、(その意見に)同意なのか、反論なのか、を述べた上で、なぜそう思うのかを、できる限り明確に記述して下さい。 <論点> 厳密文法派、自由度・融通派とも求めていることは同じ、という感想への共感 討論の前提確認① 厳密文法派、自由度融通派いずれも、どの程度の厳密さあるいは自由度を想定しているのか? 討論の前提確認② 何のためにプログラミング言語を学ぶのか? 厳密文法と、記述の自由度双方の良いところを取り入れた言語はないか? エラーを体験する方が理解が深まる?
厳密派、自由度派は根っこは同じ!? <6/2の感想> 文法厳密派、自由度・融通派ともに言っている意見は一理あるのに、その理由となっていることが同じようなことなのが面白いと思いました。 同意する。文法厳密派の意見で「最初にきちんとした書き方を覚えさせる」とあるが、(それと)自由・融通派の「エラーを出すより、動作させる楽しさを知ることが大切だ」ということは底辺が同じ。きちんとした書き方を覚えれば基本が理解できることで楽しさが分かってきているということだと思う。このように二つの派閥はもとの底辺が一緒であると言うことだ。 「なるほど」と思い、賛成しました。両方とも言っていることは違うが、間違えたことをきちんと把握し、理解するという点では、同じことだと思います。動作の楽しさを覚える(ことが大切)という点でも同じだと思います。
文法の厳密さ、自由度の度合いは? -討論の前提条件①- 自由、融通派の人はどの程度自由、融通なものを望んでいるのでしょうか? 単にエラーが出ず、動かすことができるものなのか、ベーシックのような宣言をしなくてもいいようなものなのでしょうか?同じく厳密派の人もどの程度厳密なものを望んでいるのでしょうか?意見されているものはJAVAを基準とした発言なのでしょうか? 討論を進めるには、この点についての共通理解が必要。
各派のとらえ方 文法が厳密な言語 記述の自由度が高い言語 厳密文法派 きちんとした書き方が身に付く。 初心者が基礎をきちんと学べる。 文法が厳密な言語 記述の自由度が高い言語 厳密文法派 きちんとした書き方が身に付く。 初心者が基礎をきちんと学べる。 将来的に伸びる。 変なクセが身に付いてしまう。 基礎が身に付かない。 将来的に行き詰まってしまう。 初心者に苦手意識を植え付ける。 楽しさを味わいにくい。 自由な発想が制限される。 初心者にハードルが低い。 動作する楽しさを味わえる。 自由な発想を促す。 自由度融通派
双方、自派の長所と他派の短所のみを見ていないか? (前略)ただどちらにしても思うのは、自由文法言語を継続して使わせることは小さな子供にクレヨンを手渡して「これでピカソが描けるよ」と、逆に厳密文法派は油絵の具を手渡しながら「これがモネの一部だ、君はこれからモネを描く」と言っているような感じがすることです。要するにどちらも放言です。前者はともかく慣れることを主眼に置き過ぎて後のことを考えられないし、後者は後のことを考えすぎて不安を軽く見ています。両方のいいところを取った都合のいいプログラミング言語はやはりないのでしょうか?
何のためにプログラミング言語を学ぶのか?-討論の前提条件②- <厳密文法派> 一度付いた我流のプログラミングスタイルはなかなか直らない。(だから)上達したいと思うなら(変な)癖をつける前に、対処していった方が良いと思います。楽しみたいとか、ただプログラミングをやってみたいというだけの感覚なら、自由度・融通派を支持し学んでいけば良いと思います。 <自由度・融通派> まず、簡単なプログラミング言語に触れることで、基本を身に付けていけばいいと思います。そして、ある程度プログラミングがどういうものか、こうすればうまくいく、など理解してから、少しずつハードルを上げていけばいいのではないかと思います。
学習曲線(概念図) 最適な言語 BASICを想定 Delphiを想定
最適な言語の提案!? 重要なことは、初学者でも楽しみながらプログラムを組め、同時にきちんとした書き方を身につけさせるということです。こうなると、ここで議論している大半の人の、常識の範疇を超えたところに答えを探す必要があるでしょう。私が見つけたのはSmalltalk、Squeakです。おそらく今後は、オブジェクト指向言語にシフトしていくでしょう。それを考えると、オブジェクト指向の考え方、組み方を徹底づけるには良いのではないかと思います。 <コメント> オブジェクト指向の考え方を実地的に学ぶにはよい言語。しかし、(現状では)用途は限定されている。 また、プログラムの中身を理解しようとすると、かなりの知識を要する。
参考:言語の制約の度合い BASIC C 制約大 Java どの言語が良いかは用途によって決まる。 オールマイティな言語はない。 print “Hello!” 行が基本 制約大 main( ) { printf(“Hello!\n"); } C 関数が基本 public class Hello { public static void main(String args[ ]) { System.out.println(“Hello!”); } Java クラスが基本 どの言語が良いかは用途によって決まる。 オールマイティな言語はない。
参考:変なクセについて (前略)反論中でも、『変な癖』としてしか出ておらず、具体的な指摘にやや欠けている感があります。 制約の少ない言語の典型としてBASICを想定する。 BASIC言語プログラミングによる(好ましくない)クセとは?
スパゲッティ・プログラム 思いつくままに、GOTO文を使ってプログラムを拡張。→ 迷路のようなプログラムに。 10: INPUT A 20: IF A>0 THEN 50 30: PRINT “正ではない” 40: GOTO 60 50: PRINT “正の数” 60: END 10: INPUT A 20: IF A>0 THEN 50 25: IF A=0 THEN 45 30: PRINT “負の数” 40: GOTO 60 45: PRINT “0である” 46: GOTO 60 50: PRINT “正の数” 60: END 思いつくままに、GOTO文を使ってプログラムを拡張。→ 迷路のようなプログラムに。
エラーを体験することで理解が深まる!? (確かに)エラーの原因を特定できれば、より深い理解に到達する。 そしてその知識をプログラミングに生かすことができる。 しかし、それには、その言語処理系が行っている処理内容を理解することが求められる。場合によっては、ハードウェアの知識も必要になる。 一般に、初心者には、そのような解読は困難。
C言語の落とし穴 if文中の比較 Javaでは文法エラーになる。 次のプログラムはC++ではコンパイルエラーにはなりません。 int a=0; if(a=0) { Edit1->Text=“値は0です。”; else { Edit1->Text=“値は0以外です。”; } 実行すると・・・ 「値は0以外です」が表示される。 C++では、条件式に整数を用いた場合、 0以外の整数→true 0 →false として扱うから。 なぜか?・・・ C言語の“落とし穴”の一つ Javaでは文法エラーになる。
Java言語の実行エラーの例 1~5までの和を求める。 for (int i=1; i<=5; i++) { sum=sum+i; } int sum=0; for (int i=1; i<=5; i++) { sum=sum+i; } <症状> int sum=0; for (int i=1; i<=5; i=i++) { sum=sum+i; } 無限ループに陥り、実行が終了しない。
Delphiの場合 var for文は回数の決まった繰り返し専用 i,sum:Integer; begin for i:=1 to 5 do sum:=sum+i; end; for文は回数の決まった繰り返し専用 無限ループに陥る可能性はない。 書き方が決まっていて融通が利かないが、致命的なエラーは防げる。
理解が先?楽しさが先? <疑問> 皆の場合はどちらでしたか? 楽しさと理解度の相関で楽しいと感ずる人ほど、理解度は高いと書いてありましたが、楽しいから理解できるのか、理解できるから楽しいのか、どっちだろうと思いました。 皆の場合はどちらでしたか?
アドバイス ープログラム上達の極意は一を聞いて十を知る- アドバイス ープログラム上達の極意は一を聞いて十を知る- 実は私は初心者向けのちょっとしたプログラムは楽しくない、つまらないと思ったたちです。十数行のプログラムからなんとなく結果が見えてしまい、プログラムの何が楽しいのかと思う人間でした。なので初心者時代に、文法が自由だろうが厳密だろうが、結局書いているプログラムはつまらないので大差ないという考えがありました・・・(略) <アドバイス> 初学者用の入門的なプログラムが簡単なのは当然。 しかし、その例題プログラムの結果そのもので面白さを判断していては上達はない。 その結果が示すことがどこまで一般化(普遍化)できるか、想像力を働かせることが大切。
要望 あまり関係のない話ですが、どうも議論がループしているように見えるので、一度ゼミ形式で対話型の議論をしてみたいのですが、それは無理でしょうか? この要望について、意見があれば小レポートに記述して下さい。
第9回目レポートテーマ テーマ1 6/9のレポート抜粋には、幾つかの論争があります。その内どれか一つ(以上)採り上げ、どちらの意見を支持するのか、そしてそう支持する理由をできる限り明確に記述して下さい。 テーマ2 6/9のレポート抜粋の中で、あなたが最も印象に残ったのは、どの意見ですか?その意見と、どういう点が印象に残ったのかを具体的に記述して下さい。 テーマ3 理解度と楽しさの相関について、あなたは「楽しいから理解度が上がる」と思いますか?それとも「理解できたから楽しくなる」と考えますか?回答と共にそう思う理由を、昨年のプログラミング演習での体験に基づいて答えて下さい。
第9回目レポート 上の3つのテーマについていつもと同じ要領でレポート提出して下さい。 なお、上の記述を行った上で、(いつも通り)講義の感想や質問等を付加しても結構です。 提出先:hiko@edu.sgu.ac.jp 件名:「学籍番号(半角)+半角空白+氏名」を記入して下さい。 例) s02xxx 学院太郎