比較プログラム言語論 平成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
© Copyright 2024 ExpyDoc