比較プログラム言語論

比較プログラム言語論
平成17年6月29日
森田 彦
レポート(6/23)総括
< テーマ >
本日の講義で、あなたが最も興味を持った点はどのような点で
すか?講義の全体的な感想と共に、できる限り具体的に、200
字~400字程度で記述して下さい。
<項目>
興味のある意見が集まっています。 →
詳細はHP参照
I. FORTRANの発展について
II. LOGOについて
III. Delphi vs BASIC 論争について
IV. 「理解が先か、楽しさが先か」論争について
Ⅰ.FORTRANの発展① 分岐・繰り返し
処理の改良(GO TO文の排除) その1

今回の講義で最も興味をもった点は分岐処理記述の発
展の部分です。発展の課程の中にIF THEN~ ELSE~
END IF文の導入によって無駄な文番号が排除(GO
TO文の排除)されたことはとても画期的だと思いました。
高校の時に分岐処理の問題を解いたことがありますが、
その中でGO TO文が出てきていました。文番号を定義
し、その番号に飛ぶという文が沢山出来てしまうと何が
書いてあるかわからなくなってしまった経験がありま
す。・・・(中略)GO TO文が排除され、そのようなことが
なくなった事によって、とても見通しがよくなったというこ
とから記述の発展に興味をもちました。
Ⅰ.FORTRANの発展① 分岐・繰り返し
処理の改良(GO TO文の排除) その2

(前略)FORTRANは最初に作られた頃から色々な改良
を加えられ、プログラムの見通しが良くなるようにと発展
してきた。それは分岐処理の記述プログラムでIFとGO
TOを同時に使用することにより、プログラム自体が自分
で理解するにも大変であるということに対し、IF THENELSE-END IF文を導入し、無駄な文番号(とGO TO
文)を排除し、ユーザーに対しわかりやすいプログラム
を記述させるための改良が加えられたのである。また、
繰り返し処理文の記述プログラムでは、DO文を導入し、
GO TO文を排除することにより、こちらもプログラムの
見通しが良くなったのである。このようにFORTRANは
改良を加えまだまだ発展する可能性があるのでその将
来性に対して興味があります。
GO TO文の排除がキーワード!
Ⅰ.FORTRANの発展② 発展(進化)し続
けているという点 その1

今回、私が最も興味を持った点は発展し続けるFORTR
ANの重要性、機能性についてです。まず驚いた点は1
957年に使用が開始されたことです。ALGOL60プロ
ジェクト以前という点と(当時の技術の度合いはわかり
ませんが)テレビのない時代、私の父が3歳の時点でこ
のようなプログラミング言語があったことです。興味を
持った点はFORTRANは進化し続け現在もまだ発展し
ているという点です。1957年に使われ始め現在まで続
いているとしたら、よほどポテンシャルが高いか、ニーズ
を見極め臨機応変な進化を遂げてきたとしか思えませ
ん。すごいです。私もFORTRANみたいになりたいです。
Ⅰ.FORTRANの発展② 発展(進化)し続
けているという点 その2

私が今回の講義で最も興味を持ったのはFORTRANは
今も発展、進化し続けているということです。最初は型
宣言のないきわめて簡単な文法規則で数式を書くよう
にプログラムを書けるという状態のプログラム言語から
始まり、時代が進むにつれて、副プログラムや型宣言の
導入、そして文字列型の導入とどんどん進化していって
いて、長い年月をかけてより高度な言語になっていって
いるというのはとてもすごいことだと感じた。こんなにも
長い間技術者などに利用され、進化・発展してきたのは、
やはり最初のFORTRANの原型がとてもすばらしいも
のであったからであると思う。
Ⅰ.FORTRANの発展② 発展(進化)し続
けているという点 その3


(前略) 私はこのようなプログラムの仕組みは一
度作られるとそのままかと思い、使いにくいのが
あれば違う種類としてまた作られると思っていま
した・・・
FORTRANは半世紀前ぐらいに開発されたのに
進化し続けるというところに関心を持ちました。
進化し続けるということはまだ完璧ではないとい
うことだと思います。
更新されなくなったら・・・その言語の普及は終わり!
Ⅰ.FORTRANの発展③ 型宣言導入時の
経緯について-「厳密文法 vs 自由文法」論争のポイント!?

(前略)型宣言を導入した際にそれまで使っていた研究者が、
そんなめんどうくさいものは・・・と言って、従来どおりのやり
方も可能にしたという点は凄いと思った。私自身は、型宣言
があった方が分かりやすくていいと思うが、従来の形に慣れ
ていた人たちは、従来の方がいいと言ったところに、これま
での講義で意見を言い合ってきた「初めてやるのにふさわし
い言語」のポイントが潜んでいると思った。(中略) これは、プ
ログラミングを初めてやった人が柔軟な言語に「慣れてしま
う」と他の言語に移行しがたくしてしまう原因が潜んでいるか
もしれないと思った。(中略)よっぽど興味津々か必要に迫ら
れない限り、厳密なものにはあまり触れず「慣れた」ものしか
やらなくなってしまうのではないだろうか。そういう意味で考
えれば「慣れ」というものが、学習には大きなポイントになる
と思った。
Ⅰ.FORTRANの発展③ 型宣言導入時の
経緯について-「厳密文法 vs 自由文法」論争のポイ
ント!? その2

やはり最初は型宣言をしていなく簡単で便利だったのに、
ALGOL60の影響で型宣言をすると「逆に面倒くさい、なぜ今
頃」と批判が出たということは、前にJava(BASIC)を学習して
からDelphiを学習するか、Delphiを学習してから
Java(BASIC)を学習するかという討論の答えそのものだった
と思います。 やはり、自由度の高いJava(BASIC)から
Delphiでは規則が厳しくなりふさわしくないので、最初は
Delphiから自由度の高いJava(BASIC)へ学習していくのが
よかったんですね。
強制力(必然性)がなければ、「自由→厳密」は難しい。
教育の力が必要!
Ⅰ.FORTRANの発展④ 意見:変数の型
宣言の必要性について


FORTRANは宣言のいらない言語だということにとても
驚きました。宣言がいらないということは、それだけ初心
者にはわかりやすいとも言えると思うので、とても良いと
思います。その後、他の言語の影響なども受けて宣言も
必要になったようですが、現在主流になっている言語も
初心者がもっとわかりやすくなるために宣言が必要のな
いようなものができても良いのではないかという意見を
私は持ちました。
僕は今プログラミングを学んでいるのですが、Javaには、
整数型や、実数型、文字列型などがあり、その型に今
苦戦させられています。あの型が無ければどれほど楽
にプログラムが書けるかと思います。
変数の型はなぜ必要?
変数の型の必要性



データ格納領域の効率化
演算の一義性の確保
変数の型を明確にする→ミスを減らすことができる。
自分で型を定義できると、よりミスの少ない信頼度の高いプロ
グラムを作成することができる。
PASCALには、ユーザが型を定義する機能が加えられた。→
C言語等、後の言語にも引き継がれる。
「型→クラス」概念の拡張→オブジェクト指向言語( C++や
Javaなど)へ発展
型の区別を厳密にする方向でプログラミング言語は発展して
来た。
Ⅰ.FORTRANの発展⑤ 質問
Fortranは・・・(中略)、ユーザが科学技術計算を行う研究者
や技術者に限定されているのはなぜなのだろうか?
研究者の間でしか使われていないらしいけど一般人には使
えないのだろうか。どういった部分で一般人向けではないの
かが気になった。


数値計算には強力。しかし・・・グラフィックス関連の命令をほ
とんどサポートしていない。GUIインタフェースに対応していな
い。等々 → 一般のアプリケーション・ソフトウェアの開発に
は向いていない。

FORTRANにはJAVAのように、while文やswitch文といった
for文やif文に関連した文法は無いのでしょうか?
元々はない。しかしFORTRAN90で追加された。
多分岐処理の記述 原型(計算形GO TO文)
10
20
30
40
INTEGER N
・・・ Nの定義
GO TO (10,20,30),N
CONTINUE
N=1の時の処理
GO TO 40
CONTINUE
N=2の時の処理
GO TO 40
CONTINUE
N=3の時の処理
CONTINUE
STOP
END
所定の文番号に
ジャンプするの
で見通しが良く
ない。
現在は廃止の
方向へ
多分岐処理の記述 発展(CASE文)
select case (N)
case (0)
N=0の場合の処理
case (1:49)
1≦N≦49の場合の処理
case (50:79)
50≦N≦79の場合の処理
case default
上記以外の場合の処理
end select
無駄な文番号がな
くなり見通しが良く
なった。
FORTRAN90で導入
復習 繰り返し処理の記述の発展①
繰り返し処理の表現(初期)
1~Nまでの和を求める。
始め
Nの入力
SUM←0
I←1
I≦N
Yes
SUM←SUM+i
i ← i+1
No
終り
IF と GO TO の世界
INTEGER N,SUM,I
READ(5,*) N
SUM=0
I=1
10 CONTINUE
IF(I.GT.N) GO TO 20
SUM=SUM+I
I=I+1
GO TO 10
20 CONTINUE
STOP
END
プログラムの見通しが良くない
復習 繰り返し処理の記述の発展②
繰り返し処理の表現(改良)
1~Nまでの和を求める。
DO文 の導入
INTEGER N,SUM,I
READ(5,*) N
SUM=0
DO 10 I=1,N
SUM=SUM+I
10 CONTINUE
STOP
END
始め
Nの入力
SUM←0
I←1
I≦N
Yes
SUM←SUM+i
i ← i+1
No
終り
さらに・・・
INTEGER N,SUM,I
READ(5,*) N
SUM=0
DO I=1,N
SUM=SUM+I
END DO
STOP
END
DO文の導入→GO TO文の排除
プログラムの見通しが良くなる
DO WHILE文の導入
例)SUM=1+2+・・・を、SUMが100を超えるまで繰り返す。
INTEGER SUM,I
SUM=0
I=0
DO WHILE(SUM<=100)
I=I+1
SUM=SUM+I
END DO
Java言語のwhile文と同
等!
FORTRAN90で導入
その後FORTRAN95を発表→進化し続けている。
Ⅱ.LOGOについて
(詳細はHP参照)
好意的な意見が多数を占めた。
A) 存在に驚き
B) 主体的(能動的)に取り組める点に注目
C) 発想力や創造力を高める点に注目
D) コンピュータに対する抵抗感をなくす点に注目
E) タートルグラフィックス使用経験者より
F) 疑問
G) LOGOのその後は?
構造化プログラミングとは?





提唱の背景-GOTO文の魔力
ダイクストラの主張
構造化のメリット
言語仕様への影響
プログラムのモジュール化へ
GOTO文の魔力
2.処理Bの前にCが必要に
→処理Cを挿入
1.処理A,Bの実行
処理A
処理A
処理C
処理B
GOTO文を用いると・・・
処理B
当時の編集
環境では手
間がかかる。
3.完成
処理A
処理C
処理B
処理A
処理B
作成時の順番を維持できる→(当
時としては)開発効率が上がる。
しかし、読みにくい。→ミスを誘発する。
処理C
処理の順番通りに記述した方が読みや
すい。
レポートでも指摘
ダイクストラの主張
構造化定理:1つの入り口と1つの出口を持つよう
なアルゴリズムは、「連接」、「分岐」、「繰り返し」
の基本構造を(処理の順に)つなげることで記述
できる。→ダイクストラが証明
 あらゆる処理(アルゴリズム)はGOTO文は必要
ない。
→ 1968年 Dijkstraが主張。→構造化プログラミ
ング(運動)の始まり。

分かりやすいプログラムを書こう!
構造化プログラミングのメリット




処理の順番に記述されるので、プログラムが読
みやすい。
フローチャートによるプログラム設計が可能
バグの少ないプログラムの開発が可能
構造化により、無駄な処理が少なくなる。
プログラム開発の効率が向上する。
言語仕様への影響




プログラミング言語は、連接、分岐、繰り返しを表現する機能がなけ
ればならない。
C:条件 S:処理 と表すと・・・
分岐の表現
if C then S1 else S2
多分岐
case C of (C1:S1;C2:S2;・・・Cn:Sn)
繰り返しの表現
while C do S (for文はカウンタ変数を用いる特殊な用途のために
特別に用意。全ての処理はwhile文で記述可能)
これらの機能が備わって行く過程は、FORTRANの発展過
程に顕著。
プログラムのモジュール化





構造化プログラミング→プログラムを基本構造(連接・分
岐・反復)を(処理の順に)つなげて表現する。
幾つかの基本構造→ひとまとまりの処理→モジュール
モジュール→ サブルーチン(FORTRAN)、関数(C言
語)など。
プログラムはモジュールの組み合わせで表現できる。
プログラムの基本構造は、モジュールを(処理の順に)
つなげて表現できる。個々の処理の詳細はモジュール
内部で記述。
構造化プログラミングの最終的な主張。
プログラムのモジュール化 例
問題 学生のテスト成績を読み込み成績順に表示する。
<プログラムの構造>
データの読み込み
データのソート
データの表示
<メインルーチン>
Integer Tokuten(200)
CALL ReadData(Tokuten)
CALL SORT(Tokuten)
CALL Display(Tokuten)
<ポイント>
プログラムの基本構造はメインルーチンで記述
処理の詳細はモジュール(サブルーチン)で記述
プログラムの基本構造が分かりやすくなる。
→見通しが良くなる。
ソフトウェア危機





構造化プログラミング→ソフトウェアの生産性向上
しかし、既存のソフトウェアの再利用性については十分
な向上が得られなかった。
ソフトウェアの需要増に、ソフトウェアの生産が追いつか
ない→ソフトウェア危機
特に、GUI環境の普及に伴って、その傾向が顕著に!
「使う方は天国、作る方は地獄」
より効率の良い、プログラム開発形態は?→オブジェク
ト志向プログラミングが注目される。
プログラムの拡張の容易さ、あるいは再利用性の向上がキー
ポイント!
オブジェクト指向言語でどのように改善されるか?
第11回目レポート




本日の講義で、あなたが最も興味を持った点はどのよう
な点ですか?講義の全体的な感想と共に、できる限り
具体的に、200字~400字程度で記述して下さい。
なお、上の記述を行った上で、HP上の前回のレポートを
読んでそれに対するコメント(意見や感想)を付加しても
結構です。
提出先:[email protected]
件名:「学籍番号(半角)+半角空白+氏名」を記入し
て下さい。
例) s03xxx 学院太郎
各変数型データ格納に必要な領域
(Java言語の場合)




整数型
実数型
文字型
論理型
int 4バイト
double 8バイト
char 2バイト
boolean 1ビット
型に応じてデータの領域を確保 → メモリを効率
的に使える。
参考例) もし、文字列型と整数型を区
別しなければ・・・? +演算子の場合
10+2の結果は?



整数の場合・・・ 12
文字列の場合・・・ 102
コンパイラがどちらを選ぶかは、型で判断してい
る。
変数の型を区別しないのであれば、加算と(文字
の)連結という演算記号を区別する必要がある。
C言語の落とし穴 if文中の比較
次のプログラムはC++ではコンパイルエラーにはなりません。
int a=0;
if(a=0) {
Edit1->Text=“値は0です。”;
} else {
Edit1->Text=“値は0以外です。”;
}
なぜか?・・・
実行すると・・・
「値は0以外です」が表
示される。
C++では、条件式に整数を用いた場合、
0以外の整数→true
0
→false
として扱うから。
C言語の“落とし穴”の一つ
Javaでは文法エラーになる。
論理型と整数型の区別を厳密にすることでミスを回避
これをうまく利用すると・・・
int a;
・・・ 変数aの値の定義
if( (a+1)%2 ) {
Edit1->Text=“偶数です。”;
else {
Edit1->Text=“奇数です。”;
}
変数aの値が偶数
か奇数かを表示す
るプログラム
論理型変数を用いなくても処理できる。 → C言語では(この
ような記述が)よく用いられた。
効率的な記述だが、読みやすさ(可読性)は落ちる。→この点
を指摘したレポートあり!
ソースの読みやすさ(可読性の高さ)の
重要性の指摘 (レポートより)

「発想の実現性」が重要といった者ですが、もう一ついえば
「ソースの配布」ができる。というのも重要だと思います。
(略)Linuxでプログラミングしているとき(私は)GPLにそって
作っているので、バイナリだけでなくソースだけで配布するこ
ともあります。(略)GPLにそって作っている以上(ソースを入
手した人が)自由に書き換えて改変したものを再配布できま
す。 ようは、他人が見ても「分かりやすいソース」である必要
があります。・・・誰かがやってくれる(バグを修正してくれる)
と自分が思いもつかなかったバグの回避方法がわかったり、
ソースが公開されていると他の人の優良なプログラムから勉
強もできます。 まさしく、再利用性の高さが問題になります。
プログラムを発展させるには、それを共有して協力(共同)する
ことが不可欠→ プログラムの可読性を高めることが必要。
本日の講義のテーマへ
タートルグラフィックス経験者より

自分が今回の講義で最も興味を持った点はタートルグ
ラフィックスについてです。 自分は中学の頃にタートル
グラフィックスかどうかは分かりませんが、これに似たプ
ログラムで遊んでいた記憶があります。画面上に亀が
いて命令して動かすというものでした。当時まだパソコン
をあまり慣れていなかった自分にとっては命令したとお
りに動くというのがとても新鮮に感じていました。なんで、
そういう風に動くのだというのはその当時考えもしませ
んでした。プログラミングを勉強していくことで昔に接触
していたモノが再び現れてさらに興味をましました。
やはり初心者には有効!?
LOGOへの疑問(意見)

今回の講義で一番興味をもった点は、児童教育用言語
LOGOです。「コンピュータを(自分の考えで)動作させる
ので、コンピュータに対する抵抗がなくなる。→やらされ
るものではなく、自分が動作させるものだという(能動
的)意識が自然に身に付く。」というのが非常にいいと思
いました。ただしかしこれをアメリカや英語圏の子供たち
ならいいですが、日本の子供には小さいころからこう
やって英語を使ってやるというのは少し厳しいかもしれ
ません。だからこのLOGOが日本語でうてるようになれ
ばもっといいとおもいます。
他の人のレポートが回答を・・・。
LOGOのその後の発展


結構古い言語なのでLOGOの現状が気になって調べて
みました。FORTRANやその他の言語が進化・発展して
いったように、LOGOも進化・発展して派生言語や応用
方法が誕生していました。特に面白いと思ったのは「ドリ
トル」です。「ドリトル」はLOGOに現代的なプログラミン
グの概念を取り入れてあり、なおかつ「なでしこ」のよう
に日本語でプログラミングができるという言語です。児
童教育用言語としてより素晴らしい言語になっていると
感じました。
先生が紹介した後LOGOについて調べてみたら、LOG
Oは日本でブームがあったがあまり普及せず、ブームが
過ぎた後レゴでLOGOが使われていることも知りました。
参考 ドリトル(初心者用プログラミング
言語)
開発: 兼宗 進 (一橋大学 総合情報処理セン
ター) http://kanemune.cc.hit-u.ac.jp/dolittle/
 兼宗先生の言葉(ドリトル紹介)
学校教育(小中高)を中心に、大学生や社会人の
入門用にも使ってもらえるプログラミング言語で
す。 BASICやLOGOといった、30年以上前に設
計された言語に代り、最新のオブジェクト指向の
考え方でプログラムを学ぶことができるのが特
徴です。

処理の順序通りでなければ見にくい

今回の講義で最も興味を持った点は「分岐処理の記述
の発展」です。・・・(中略)分岐処理の記述では、最初に
紹介された方(GO TO文使用)はIFの条件の後にELSE
(で行うべき処理)処理が先に記述されて、その後にIF
の処理が記述されるというように、記述の順序が逆に
なっていて見にくいと思います。それに比べて、後に紹
介された方はIF THENはIF THENの処理、ELSEは
ELSEの処理というように、JAVAのif~else if~else文
のように条件ごとに処理が分けられているので、非常に
見やすくてわかりやすい・・・
参考 GO TO文単独での使用例

原則はIF文との併用
<あまりよくない例>
A=1.5
A=1.5
例)2数の四則演算
B=2.3
B=2.3
結果の表示
WA=A+B
GO TO 10
WA=A+B
SA=A-B
和だけにすると・・・
SA=A-B
GO TO文で不要
部分を排除
SEKI=A*B
SEKI=A*B
SHO=A/B
SHO=A/B
WRITE(6,*) A,B,WA,SA,SEKI,SHO
WRITE(6,*) A,B,WA,SA,SEKI,SHO
STOP
END
10 WRITE(6,*) A,B,WA
STOP
END
プログラム(アルゴリズム)の基本構造
連接
処理A
処理B
処理C
処理A,B,Cを
順に処理
分岐
条件
繰り返し
No
条件
Yes
処理A
処理B
条件が成立すれば処
理A、そうでなければ
処理Bを実行
No
Yes
処理A
条件が成立している間は、
処理Aを繰り返し実行
モジュールの再利用(問題点)
問題 学生のテスト成績を読み込み成績順に表示する。
テストの得点だけではなく、学生の氏名も読み込むように拡
張すると・・・。
 修正に手間がかかる。
Integer Tokuten(200)
 既存部分はいじらず、新たに必要になっ
た部分のみを加えるような修正はできない
か→差分プログラムの徹底
Character Shimei(200)
CALL ReadData(Tokuten,Shimei)
CALL SORT(Tokuten,Shimei)
CALL Display(Tokuten,Shimei)
サブルーチンの書き直しが
必要
サブルーチン内部の理解
が必要
参考 CASE文には文字列も使える
!
FORTRAN90 CASE文の練習
CHARACTER NAME*4
NAME="森田"
select case (NAME)
case ("伊藤")
print*, "先日はありがとうございました。"
case ('森田')
print*, "お金を返してください!"
case default
print*, "皆さんお元気ですか!"
end select
end