スタートページ> (主張・講演、 Web教材) 歴史> プログラムの歴史
プログラミング言語の「イメージを理解」するために、そのサンプルを掲げる。言語の特徴を強調するために、あえて最初にJIS化された頃の版を用いる。
なお、言語のなかには、私がそれを取り扱う環境をもたないものが多く、昔取った杵柄と記憶により記述しているので、誤りがあるかもしれない。実務への応用は避けてほしい。
3007番地に格納された値(2)と3008番地に格納された値(3)の和(5)を3009番地に入れる。
番地 命令
3000 1010 3007
3002 2412 3008
3004 1110 3009
3006 8010
3007 2
3008 3
3009 1
与えた値xとyを加算して、その結果をzに入れる。
REIPRG START
LD GR1,X
ADDA GR1,Y
ST GR1,Z
RET
X DC 2
Y DC 3
Z DS 1
END
与えた値xとyを加算して、その結果をzに入れる。
Z = X + Y
次のデータがカードから入力される。
5 (データの個数)
3.14
1.414
-1.732
2.236
-2.642
正のデータだけを選び、その平方根の合計を出力する。
READ(5,100) N データの個数(5はカードを示す)
100 FORMAT(I2) 入出力の形式(カードに数値がある場所の指定
SUM = 0.0 合計値(実数なので、小数点で与える)
DO 10 I = 1,N 行番号10までをI=1,2、・・・、Nまで繰り返す
READ(5,200) X 個々のデータをXを読み込む
200 FORMAT(F10.0)
IF (X.LE.0.0) 10 X<=10なら行番号10へ
(その後、IF ~THEN~ELSEが使えるようになった)
SUM = SUM + SQRT(X) SQRTは組み込み関数
10 CONTINUE 繰返し範囲終了。I<Nなら繰返し続行、I≧Nなら次の文へ
WRITE(6,300)SUM 6はプリンタを示す
300 FORMAT(5H SUM=,F10.4) SUM=XXX.XXXXのように出力
END
N個の大きさの配列 X(1),X(2),・・・,X(N) から正数だけを取り出し平方根の合計SUMを計算する既存のサブルーチンSUB(N, X, SUM) がある。例2と同様なデータカードを入力しSUMを出力する。
DIMENSION X(100) Xが配列でそのサイズが100(最値を想定)とする
READ(5,100) N
100 FORMAT(I2)
DO 10 I = 1,N
READ(5,200) X(I) Iの値により、X(1),X(2),・・・,X(N)となる
200 FORMAT(F10.0)
10 CONTINUE
SUM = 0.0 単にサブルーチンから戻される変数の確保。値には意味はない
CALL SUB(N,X,SUM) サブルーチンSUBを実行
WRITE(6,300)SUM 6はプリンタを示す
300 FORMAT(5H SUM=,F10.4) SUM=XXX.XXXXのように出力
END
FORTRANの「例2」をALGOLで記述する。ALGOLでは、入出力は文法規約ではなく関数として取り扱っているので、実装により記述法は異なる。
BEGIN
INTEGER N, I; REAL X, SUM := 0; :=は代入文を示す
READ(N);
FOR I FROM 1 TO N DO
READ(X);
IF X > 0 then
SUM := SUM + SQRT(X);
FI;
OD;
PRINT('SUM=",SUM);
END;
与えた値xとyを加算して、その結果をzに入れる。
ADD Y TO X GIVING Z.
または
COMPUTE Z = X + Y.
********************見出し部(プログラム名や作成者など)**********
IDENTIFICATION DIVISION.
PROGRAM-ID. SENTAKU.
AUTHOR. KOGURE.
DATE-WRITTEN. 2010.01.11.
********************環境部(使用するファイルなど)****************
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INFILE ASSIGN TO IN01 ORGANIZATION IS SEQUENTIAL.
SELECT OUTFILE ASSIGN TO OUT01 ORGANIZATION IS SEQUENTIAL
RECORD CONTAINTS 20 CHARACTERS BLOCK CONTAINS 10 RECORDS
LABEL RECORD IS STANDARD.
*******************データ部(ファイルデザイン、一時変数など)*******
DATA DIVISION.
FILE SECTION.
FD INFILE.
01 INAREA.
03 YYYYMM PICTURE 9(6). (注1)
03 TOKUISAKI PICTURE 9(4).
03 SHOHIN PICTURE 9(6).
03 SURYO PICTURE S9(4) PACKED-DECIMAL. (注1)
03 KINGAKU PICTURE S9(8) PACKED-DECIMAL.
FD OUTFILE.
01 OUTAREA PICTURE X(20). (注1)
WORKING-STORAGE SECTION.
01 EDITAREA.
03 YYYYMM PICTURE 9(6).
03 SHOHIN PICTURE 9(6).
03 SURYO PICTURE S9(4) PACKED-DECIMAL.
03 KINGAKU PICTURE S9(8) PACKED-DECIMAL.
*******************手続き部(処理手順)*****************************
PROCEDURE DIVISION.
OPEN INPUT INFILE.
OPEN OUTPUT OUTFILE.
YOMU.
READ INFILE AT END GO TO OWARI.
IF TOKUISAKI OF INAREA = '9876' THEN
MOVE YYYYMM OF INAREA TO YYYYMM OF EDITAREA. (注2)
MOVE SHOHIN OF INAREA TO SHOHIN OF EDITAREA. (注2)
MOVE SURYO OF INAREA TO SURYO OF EDITAREA. (注2)
MOVE KINGAKU OF INAREA TO KINGAKU OF EDITAREA. (注2)
MOVE EDITAREA TO OUTAREA.
WRITE OUTAREA.
END-IF.
GO TO YOMU.
OWARI.
CLOSE INFILE.
CLOSE OUTFILE.
EXIT.
COBOLのプログラムは、(文法の知識は必要だが)可読性に優れている。反面、記述量が非常に大きくなる欠点がある。
COBOLの「例2」と同じ処理をする。ただし、INFILEおよびOUTFILEはRDBであり、INTABLE、OUTTABLEとする。
SELECT YYYYMM, SHOHIN, SURYO, KINGAKU
FROM INTABLE
INTO OUTTABLE
WHERE TOKUISAKI = "9876"
COBOLでの DATA DIVISUON に相当する部分が、データベース管理システムで定義されていることもあるが、プログラムの記述量が極めて短くなる。また、「何をするのか」はこのほうがわかりやすい。