比較プログラム言語論

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