比較プログラム言語論

Download Report

Transcript 比較プログラム言語論

オブジェクト指向基礎学習Ⅰ
~オブジェクト指向へ至る背景~
平成22年6月25日
森田 彦
学習内容
プログラミング言語教養編
I.
II.
III.
プログラミング言語発展の歴史(概観)
最も早く普及した言語「FORTRAN」発展の経緯
構造化プログラミングの提唱
課題予告


本日の学習内容(どういうことを学習したか)を簡
単に要約して下さい。
その上で、自分が最も印象に残った点を、その
理由とともに挙げて下さい。
Ⅰ.プログラミング言語発展の歴史(概観)
<内容>


言語発展の歴史を概観する。
代表的な言語をその性質により分類してみる。
<注目点>
どういう風に使い分けしているのか?
なぜ、一つに統一できなかったのか?
プログラミング言語発展の歴史
時間
言語以前
低水準言語
機械語
アセンブリ言語
FORTRAN
COBOL
ALGOL
高水準言語
Delphi
手続き型言語
C++Builder
JBuilder
PL/1
ビジュアル開発環境
ALGOL68
PASCAL
BASIC
C言語
Ada
Lisp
超高水準言語
参考:河村一樹、斐品正照
オブジェクト指向
言語
Object PASCAL
C++
Java
Prolog
Smalltalk
Ⅱ.最も早く普及した言語「FORTRAN」発展の
経緯
<内容>



FORTRANの起源および発展の概観
分岐処理の記述の発展
繰り返し処理の記述の発展
<学習する理由>
古い言語の発展の経緯を知ることで、オブジェクト指向プログ
ラミングが生まれた背景を理解できるようになるから。
FORTRANの起源





1954年、IBM社バッカス(Backus)らにより開発開始:ソ
フトウェア開発のコストが急増→使いやすい高水準プロ
グラミング言語の必要性
1957年 IBM社の汎用大型コンピュータIBM704のプロ
グラム処理言語として実装
当初はIBM Mathematical FORmula TRANslating
System と命名 →FORTRAN
その性能や設計内容が高く評価される。
科学技術計算に適している。
発表後、FORTRANは進化し続けている。
その進化の方向性に注目!
FORTRANの発展①
原型 ー 型宣言のない世界
<プログラム例>
1234567890
プログラムは7~72列の間に記述する。
----------------------------------------<実行結果>
A=3.5
12345678901
B=1.5
-------------------------J=(A+B)/2
3. 5 1. 5 2
WRITE(6,100) A,B,J
100 FORMAT(2F4.1,I3)
I,J,K,・・・,Nで始まる変数:整数型
STOP
それ以外
:実数型
END
きわめて簡単な文法規則! 数式を書く様にプログラムを
書ける!
FORTRANの発展②
副プログラムの導入

1958年FORTRANⅡ発表→副プログラム(サブ
ルーチン)の導入
1234567890
----------------------------------------------
A=3.5
B=1.5
CALL HEIKIN(A,B,C)
WRITE(6,100) A,B,C
100 FORMAT(2F4.1,F5.2)
STOP
END
SUBROUTINE HEIKIN(A,B,C)
C=(A+B)/2
RETURN
END
<実行結果>
1234567890123
-------------------------3. 5 1. 5
2. 5
プログラムの見通しが良くなる。
FORTRANの発展③
型宣言の導入

1962年、FORTRANⅣ発表→型宣言を導入
1234567890
--------------------------------------------
REAL A,B
INTEGER J
A=3.5
B=1.5
J=(A+B)/2
WRITE(6,100) A,B,J
100 FORMAT(2F4.1,I3)
STOP
END
ALGOL60プロジェクトの影響
1234567890
------------------------------------------
A=3.5
これもOK
B=1.5
J=(A+B)/2
WRITE(6,100) A,B,J
100 FORMAT(2F4.1,I3)
STOP
END
<暗黙の型宣言>
I,J,K,・・・,Nで始まる変数:整数型
それ以外
:実数型
FORTRANの発展④
文字列型の導入

1978年、FORTRAN77発表→文字列型の導入
1234567890
--------------------------------------------
REAL A,B
INTEGER J
CHARACTER MOJI*7
MOJI=‘Result:’
A=3.5
B=1.5
J=(A+B)/2
WRITE(6,100) MOJI,A,B,J
100 FORMAT(A,2F4.1,I3)
STOP
END
<実行結果>
1234567890123456789
-------------------------------Result : 3. 5 1. 5
2
分岐処理の記述の発展①
分岐処理の表現(初期)
テストの得点を入力し、50点以上な
ら「合格」、50点未満なら「不合格」と
表示するプログラム
始め
Tenの入力
Ten≧50
No
Yes
‘合格’と表示
終り
‘不合格’と表示
IF と GO TO の世界
INTEGER TEN
READ(5,*) TEN
IF(TEN.GE.50) GO TO 10
WRITE(6,*) ‘不合格’
GO TO 20
10 WRITE(6,*) ‘合格’
20 STOP
END
プログラムの見通しが良くない!
分岐処理の記述の発展②
分岐処理の表現(改良)
テストの得点を入力し、50点以上な
ら「合格」、50点未満なら「不合格」と
表示するプログラム
始め
Tenの入力
Ten≧50
No
Yes
‘合格’と表示
終り
‘不合格’と表示
IF THEN~ ELSE~ END IF 文
の導入
INTEGER TEN
READ(5,*) TEN
IF(TEN.GE.50) THEN
WRITE(6,*) ‘合格’
ELSE
WRITE(6,*) ‘不合格’
END IF
STOP
END
無駄な文番号を排除→ GO TO文を排除
多分岐処理の記述 発展(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を発表→進化し続けている。
Ⅲ.構造化プログラミングの提唱






提唱の背景-GOTO文の魔力
ダイクストラの主張
構造化のメリット
言語仕様への影響
プログラムのモジュール化へ
ソフトウェア危機
GOTO文の魔力
2.処理Bの前にCが必要に
→処理Cを挿入
1.処理A,Bの実行
処理A
処理A
処理C
処理B
GOTO文を用いると・・・
処理B
当時の編集
環境では手
間がかかる。
3.完成
処理A
処理C
処理B
処理A
処理B
作成時の順番を維持できる→(当
時としては)開発効率が上がる。
しかし、読みにくい。→ミスを誘発する。
処理C
処理の順番通りに記述した方が読みや
すい。
スパゲッティ・プログラム(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
ダイクストラの主張
構造化定理: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言
語)、メソッド(Java)など。
プログラムはモジュールの組み合わせで表現できる。
プログラムの基本構造は、モジュールを(処理の順に)
つなげて表現できる。個々の処理の詳細はモジュール
内部で記述。
構造化プログラミングの最終的な主張。
プログラムのモジュール化 例
問題 学生のテスト成績を読み込み成績順に表示する。
<プログラムの構造>
データの読み込み
データのソート
データの表示
<メインルーチン>
Integer Tokuten(200)
CALL ReadData(Tokuten)
CALL SORT(Tokuten)
CALL Display(Tokuten)
<ポイント>
プログラムの基本構造はメインルーチンで記述
処理の詳細はモジュール(サブルーチン)で記述
プログラムの基本構造が分かりやすくなる。
→見通しが良くなる。
モジュール化に基づく構造化プログラミングの
工程
1. 要求される処理を幾つかの処理(モジュール)に分割
2. モジュールの命名
3. モジュールを適切な順に配置
4. 各モジュールの処理内容の記述
全体
トップダウン的思考が必要!
部分
参考) モジュール化に基づく構造化プログラ
ミングの例
カレンダープログラム:日付を入力すると、それが何曜日かを表示。
メインプログラム
void jButton1ActionPerformed(ActionEvent evt) {
int Year=Integer.parseInt(jTextFieldY.getText());
int Month=Integer.parseInt(jTextFieldM.getText());
int Day=Integer.parseInt(jTextFieldD.getText());
String Youbi;
Youbi=YoubiCalc(Year,Month,Day); //曜日を求める
jLabelAns.setText(Youbi+“です。”); //結果表示
}
年月日を与えると曜日を計算してくれるモジュール(メソッ
ド)を定義
YoubiCalc(Year,Month,Day)メソッド
String YoubiCalc(int Year, int Month, int Day) {
String WDay;
int N= DayCount(Year,Month,Day) % 7;
switch (N) {
case 0:
曜日はある基準日(例え
WDay="日曜日";
ば2000年12月31日:日曜
break;
case 1:
日)からの日数で決まる。
WDay="月曜日";
break;
・・・
}
return WDay;
}
年月日を与えると基準日からの日数を計算するモジュー
ル(メソッド)を定義
DayCount(Year,Month,Day)メソッド
int DayCount(int Year,int Month,int Day) {
int DaySum=0;
for (int i=2001;i<Year;i++) {//1年前の12/31までの日数
if( Uruu(i) ) {
DaySum=DaySum+366;
閏年を判定する必要が
} else{
ある。
DaySum=DaySum+365;
}
}
for (int i=1;i<Month;i++) { //一月前の月末までの日数
・・・
}
DaySum=DaySum+Day; //当該月の日数を加える
return DaySum;
}
当該年が閏年かどうかを判定するモジュール(メソッド)を
定義
以上を振り返ると・・・
メインプログラム
YoubiCalc(Year,Month,Day)メソッドの定義
DayCount(Year,Month,Day)メソッドの定義
Uruu(Year)メソッド の定義
プログラムの完成!
読みやすさ / 書きやすさの視点から構造化プ
ログラミングを見ると・・・




「IF+GO TO」文の世界→思いつくままに記述できる。→書き
やすい(特別な訓練なしでも書ける)。
しかし、後から見ると読みにくい。→開発効率に限界
一方、構造化プログラミングの世界では・・・
基本構造さらにはモジュールの組み合わせで(処理順に)記
述する。→記述する際にプログラムの全体構造を把握して
おく必要がある。→慣れるまで訓練(教育)が必要。
出来上がったプログラムは読みやすい。→開発効率は上が
る。
構造化プログラミングの普及→教育の必要性増大
書きやすさから読みやすさへ
ソフトウェア危機





構造化プログラミング→ソフトウェアの生産性向上
しかし、既存のソフトウェアの再利用性については十分
な向上が得られなかった。
ソフトウェアの需要増に、ソフトウェアの生産が追いつか
ない→ソフトウェア危機
特に、GUI環境の普及に伴って、その傾向が顕著に!
「使う方は天国、作る方は地獄」
より効率の良い、プログラム開発形態は?→オブジェク
ト志向プログラミングが注目される。
プログラムの拡張の容易さ、あるいは再利用性の向上(差分プ
ログラムの徹底)がキーポイント!
オブジェクト指向言語でどのように改善されるか?
次週のポイント!
課題


本日の学習内容を簡単に要約して下さい。
その上で、自分が最も印象に残った点を、その
理由とともに挙げて下さい。
プログラムのモジュール化 例
問題 学生のテスト成績を読み込み成績順に表示する。
<プログラムの構造>
データの読み込み
データのソート
データの表示
<メインルーチン>
Integer Tokuten(200)
CALL ReadData(Tokuten)
CALL SORT(Tokuten)
CALL Display(Tokuten)
<ポイント>
プログラムの基本構造はメインルーチンで記述
処理の詳細はモジュール(サブルーチン)で記述
プログラムの基本構造が分かりやすくなる。
→見通しが良くなる。
モジュールの再利用(問題点)
問題 学生のテスト成績を読み込み成績順に表示する。
テストの得点だけではなく、学生の氏名も読み込むように拡
張すると・・・。
 修正に手間がかかる。
Integer Tokuten(200)
 既存部分はいじらず、新たに必要になっ
た部分のみを加えるような修正はできない
か→差分プログラムの徹底
Character Shimei(200)
CALL ReadData(Tokuten,Shimei)
CALL SORT(Tokuten,Shimei)
CALL Display(Tokuten,Shimei)
サブルーチンの書き直しが
必要
サブルーチン内部の理解
が必要
FORTRAN用パンチカード
1
2

穴の開いている位置で、英数字などの記号を表現。
 カード1枚が1行に対応。
プログラム(アルゴリズム)の基本構造
連接
処理A
処理B
処理C
処理A,B,Cを
順に処理
分岐
条件
繰り返し
No
条件
Yes
処理A
処理B
条件が成立すれば処
理A、そうでなければ
処理Bを実行
No
Yes
処理A
条件が成立している間は、
処理Aを繰り返し実行
プログラミング言語以前
最初のコンピュータ(電子計算機)ENIAC





真空管で動作する電子計算機
1946年 ペンシルベニア大学のモークリーとエッカート
が開発
米国陸軍の弾道計算に利用
巨大(18000本の真空管)で消費電力も膨大(175kW)
計算の手順(プログラム)
配線の組み替えとスイッチの組み替えで実施→プログ
ラミング言語なし。
プログラミング言語の登場
ノイマン型コンピュータの登場
1949年英国のEDSAC完成
 配線の組み替えとスイッチの切り替え→プログラ
ムとして作成し、記憶装置に記憶させる
プログラム→機械語で記述
 機械語
コンピュータが直接理解できる言語→2進数で表
現

機械語
2進数を1バイトずつ2桁の16進数で表現
 例:188+17の答を求める
9D BC 11
9D:加算命令 BC:188 11:17
 プログラミングは大変

アセンブリ言語


1950年代前半に登場
例:188+17の答を求める
ADD BC 11
ADD→9Dに翻訳する必要がある→アセンブラというソフト
が処理(現在のコンパイラと同じ)

初期のアセンブラ
メモリ内のアドレスの指定をプログラマが担当
MOVE A [+120]: Aレジスタの現在値を120バイト後方の
アドレスへコピーする(代入する)

変数名の発明
MOVE A data1 → アドレス計算からプログラマを解放 →
翻訳処理ソフトが担当
FORTRAN



1957年 IBM社の汎用大型コンピュータのプロ
グラム処理言語として実装
FORmula TRANslation Systemの略
その後大いに発展
FORTRANⅡ(’58)副プログラム→FORTRANⅣ(’62)型宣言
→FORTRAN66(’66)→FORTRAN77(’77)文字列
→FORTRAN90(’91)組み込み関数追加

科学技術計算に適している
COBOL
COmmon Business Oriented Language
1959年開発
 事務処理に適している
データ処理(ファイルアクセス)に優れている英文
を書くようにプログラミングできる。
 最も広汎に使われたプログラミング言語
 ’80年代までは→COBOLができなければSEに
なれない!

PL/1
Programming Language 1



プログラミング言語の用途が分化
科学技術計算 FORTRAN
事務処理計算 COBOL
両者を包含した言語は可能か?→IBMと
SHARE(IBMのユーザ団体)が開発→1964年
に開発
汎用的な利用が可能 言語処理系が巨大化
ALGOL
ALGOrithmic Language
1958年開発(ALGOL58)
 科学技術計算向けの言語
 厳密な構文規約を採用
プログラミング言語の構造として優れている
 1960年 ALGOL60制定
他のプログラミング言語(CやPASCALなど)に大きな影
響を与える。
 1968年 ALGOL68発表→言語規模の巨大化

BASIC
Beginner’s All-purpose Symbolic Instruction
10: A=10
Code
 1964年
20:米国ダートマス大学で開発
B=20


初心者のための教育用言語
30: C=A+B
言語仕様が簡単
40: print C
コンパイラではなくインタプリタを使用
当初は汎用コンピュータ→パソコンに移植→大
いに普及
PASCAL





1971年 Wirth(ヴィルト)により発表
ALGOL60の後継言語
特徴
構造化プログラミングの実現、適切なデータ構造
系統的なプログラミング教育に最適
→ 既存の言語とは異なる視点で開発
言語仕様の範囲を広げ過ぎない→言語処理系の効率
化→ALGOL68の反省
C言語などに影響
C言語
main() {
1973年 米国AT&Tのベル研究所のRitchie(リッチー)がUNIX開発
用に設計
int a,b,c;
 1967年 Richards(リチャーズ)がBCPLを開発→Thompson(トンプ
a=10;
ソン)がUNIX記述用に更新・開発→B言語
その次の言語→C言語
 特徴
b=20;
システム記述言語でもある(それまではアセンブリ言語が主流)→シス
テム記述から一般の処理まで広汎にカバー
→自由度の高い汎用的
c=a+b;
な言語

printf(“%d\n”,c);
90年代→Cが分からないシステムエンジニアはいらない。
}
Ada



1980年米国の国防総省の軍規格となる
軍で使用している各種コンピュータシステムの管
理が煩雑→言語仕様が数百種類にも及ぶ→統
一的に管理できないか?
軍独自の仕様に基づいた新しいプログラミング
言語を → 公募によりフランスのIchbiah(イシ
ビア)らが開発した言語を採択
Lisp
LISt Processor
1950年代末~’60年代 米国マサチューセッツ
工科大学のMcCarthy(マッカーシー)がリスト処
理用の言語として開発
 関数型言語
関数の組み合わせによってプログラミングを行う
f(x)、g(x1,x2,・・・)

Prolog
PRogramming in LOGic
1972年 フランス、マルセイユ大学の
Colmerauer(コルメラウァー)らによって開発
 論理型言語
1階述語論理による論理記述とその推論機構が
基本
例:「人間は死ぬ」、「ソクラテスは人間である」
→ 「ソクラテスは死ぬ」

オブジェクト指向言語
1968年 米国のDahl(ダール)とNygaard(ニ
ガード)によってSimula67開発→Algol60を拡張
したシミュレーション言語
 1972年 ゼロックス社のAlan Key(アラン・ケイ)
らがSmalltalk-72を開発→次世代コンピュータ
Dynabook用のプログラミング言語
 1980年 Smalltalk-80を発表
クラス階層と継承を実装→最も純粋なオブジェク
ト指向言語

既存言語のオブジェクト指向化
C言語→C++言語
1980年からAT&T社のStroustrup(ストロース
トープ)が開発→1991年にはVersion3に
 PASCAL→Object PASCAL
 ビジュアル環境化
C++ → C++Builder、Viasual C++など
Object PASCAL → Delphi

Java言語
1995年 米国サンマイクロシステムズ社が発表
 開発の考え
C++のオブジェクト指向機能を純化
C++の一部機能(難解な部分)を排除
 特徴
Javaの実行環境があれば、どのOSや機種でも動作する。
→携帯端末や家電製品も想定 →急速に注目・普及
2000年代→ Java言語の分かるシステムエンジニアが必
要!
