スタートページ> (主張・講演Web教材歴史プログラムの歴史

プログラミング言語の記述例

プログラミング言語の「イメージを理解」するために、そのサンプルを掲げる。言語の特徴を強調するために、あえて最初にJIS化された頃の版を用いる。
 なお、言語のなかには、私がそれを取り扱う環境をもたないものが多く、昔取った杵柄と記憶により記述しているので、誤りがあるかもしれない。実務への応用は避けてほしい。


参考URL


機械語(架空マシン)

3007番地に格納された値(2)と3008番地に格納された値(3)の和(5)を3009番地に入れる。

   番地  命令
   3000  1010 3007
   3002  2412 3008
   3004  1110 3009
   3006  8010
   3007  2
   3008  3
   3009  1

アセンブラ(CASLⅡを想定)

与えた値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

FORTRAN(FORTRAN IV 1962年を想定)

例1

与えた値xとyを加算して、その結果をzに入れる。

   Z = X + Y

例2

次のデータがカードから入力される。
   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

例3

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

ALGOL(ALGOL-60)

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;

COBOL(COBOL-62 を想定)

例1

与えた値xとyを加算して、その結果をzに入れる。

   ADD Y TO X GIVING Z.
  または
   COMPUTE Z = X + Y.

例2

データファイル INFILE から、得意先コード(4桁数字)が 9876 のレコードだけを抽出して、新しいファイル OUTFILE を作成する。

   ********************見出し部(プログラム名や作成者など)**********
    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のプログラムは、(文法の知識は必要だが)可読性に優れている。反面、記述量が非常に大きくなる欠点がある。

SQL(SQL-86 を想定)

COBOLの「例2」と同じ処理をする。ただし、INFILEおよびOUTFILEはRDBであり、INTABLE、OUTTABLEとする。

   SELECT YYYYMM, SHOHIN, SURYO, KINGAKU
    FROM INTABLE
    INTO OUTTABLE
    WHERE TOKUISAKI = "9876"

COBOLでの DATA DIVISUON に相当する部分が、データベース管理システムで定義されていることもあるが、プログラムの記述量が極めて短くなる。また、「何をするのか」はこのほうがわかりやすい。