• 検索結果がありません。

スタック模型型FORTRAN処理系の設計 利用統計を見る

N/A
N/A
Protected

Academic year: 2021

シェア "スタック模型型FORTRAN処理系の設計 利用統計を見る"

Copied!
6
0
0

読み込み中.... (全文を見る)

全文

(1)

スタック構造型FORTRANとその処理系の設計

有泉均

横内滋里

(昭和54年8月27日受理)

Design of Resident Fortran based on Extended

Stack Manipulation and its Implementation

HitoshiARIIZUMI ShigeriYOKOUCHI       Abstract  AFortran system discripted by the standard Fortran(JIS 70001evel), is designed as a resident interpreter based on extended stack manipulation. Educational programs for begin− ners as input data to this system are processed continuously. In addition to ordinary processing of I/Ostatement and arithmetic expression, recusive procedures of function and subroutine subprogram are performed directly through the routine built in interpreter by stack manipulation.

1・はじめに

 最近のコンパイラ言語の傾向として,PASCALに 代表されるように構造化やデータ構造2)などの概念が 導入されてきている。本論文は再帰的手法3)の概念を とり入れた数値計算向き言語FORTRANを基本に, プログラミング教育上の観点からその処理系の設計, 開発について記述したものである。

 本FORTRAN処理系はJIS 7000レベルを一ヒま

わる標準ACOS FORTRAN4)で記述された,常駐

型のインタプリタ5)であり,主として教育用プログラ ムの処理を対象としている。これらのプログラムはデ ータとして入力され,翻訳部で構文解析やデータ領域 の割当てを受けた後,解釈実行部においてスタック処

理を併用して常駐型FORTRAN処理系にあらかじ

め組み込まれたルーチンにより入出力文や算術式およ び再帰的呼出しなどの処理が行われる。このようにし て本処理系は,処理系が翻訳・実行をくり返すことに よって,多量で小規模なジョブを効率良く連続処理し ようというものである。運用面においても,処理系の 制御文などの取扱いが容易であり,システム記述言語

であるFORTRANの変更だけで種々の機能の追加

が簡単に行える。またきめ細かいエラー表示も可能と なり個々のジョブに関する統計管理機能を有してい る。 2・処理系と言語設計の目標  本処理系は以下に示す処理系の機能を備えているこ とを目標としている。  1) 原始プログラムの連続処理を行う常駐型のシス テムであること。  2)打ち切り時間,打ち切りページの指定ができる こと。  3) オプションとして自動的に原始プログラムのフ ローチャートを作図すること。  4) マークカードとパンチカード入力の混在が可能 であること。  5) ジョブの処理状況が自動的に把握できる統計管 理機能をもっていること。  6)文法エラー,実行エラーの指摘が明解であるこ と。  7) システム記述が平易で処理系の制御文が少ない こと。  8) システム導入が短期間で完成すること。  9)仕様の変更,追加が簡単であること。  なお,言語の設計目標として,JIS 3000レベルの

(2)

機能を充足し,さらに再帰形式や各種数値計算ライブ ラリの使用が可能なことである。

 3.システム記述言語ACOS FORTRANにお

   ける文字処理機能

1)CHARACTER型宣言文の採用

 1から256までの文字を含む文字型変数を定義でき る。 2)文字型代入文  1から256までの文字型データを任意に転送できる。 3)文字の編集

通常のREAD文, WRITE文における機番のか

わりに,記憶域ファイルとして文字型変数を置くこと

により,FORMAT文の指定に応じてすべての文字

の編集が可能である。 4.常駐型FORT’RAN処理系の構成と機能の概略  ジョブ管理機能を有する本処理系は,言語の処理に 関してインタプリタとして翻訳および解釈実行ルーチ ンを持っている。以下に各ルーチンの機能の概略を説 明する。 1)主ルーチン  全体的な流れの制御をするルーチンである。すなわ ち入力ルーチンを呼びこみ,各文に従って分析ルーチ ンを呼び出す。ジョブ内制御文によって単一プログラ ムの翻訳終了ごとに,解釈実行ルーチンを呼ぶ。また 各種ルーチンを呼びこむための前処理として,注釈行 の読み捨てを行い,文の空白をつめる。継続行の判定 や文番号のまとめ,副プログラムの結合等も行う。 2)入力ルーチン  原始プログラムを入力する。マークカード入力の場 合は,ワンマーク方式を解析してパンチカード形式に 編集する。JIS FORTRANでは文を区別する見出し 語は任意に他の目的に用いてもよいことになっている が,本処理系では予約語としてとり扱い,これにより 文の識別を行う。予約語を表一1に示す。これはマー

       表一1予約語表

クカードの省略記号が主体となっている。 3) 分析ルーチン  主ルーチソの要求に応じて単語分析により名前,文 番号,定数,区切り記号などを認識し,構文分析によ り文法の規約に従っているかを解析する。この場合, 名前,文番号,定数(整数型,実数型),予約語など のオペランドおよび+,一,×等の作用素としての記 号が細胞となる。各文に対してこれらの文属性表と文 終了記号‘@’をつけた記号列からなる目的コードが 生成される(書式仕様は特別扱いとする。7.参照)。 4) 解釈実行ルーチソ  登録済みの文属性表,目的コードにもとついて各文 の実行を行う。

READ(

WRITE(

FORMAT(

IF(

GO TO

DO

CONTINUE

DIMENSION

STOP

END

RETURN

FUNCTION

SUBROUTINE

COMMON

INTEGER

REAL

DATA

     5・名前,定数と文番号の処理  インタプリティブに実行するために必要な各種の表 は翻訳時に作成される。以下にそれらについて説明す る。 1)名表の作成  名前のつづりを整数型と実数型に分けて文字型の配 列に登録する。名前が原始プログラム上に現れるとそ のつづりがすでに名表に登録されているか否かを調べ て,登録されていない時には新たにそのつづりを登録 する。 2) 文番号表の作成  文中にある文番号と文番号欄にあるものを文番号表 に登録する。この時,内部文番号として実行文に順次 割当てた番号も登録し,プログラム単位終了後結合が 行われる。 3) 変数表の作成  各名前,定数に対して所属する内部文番号,その値 のデータ領域の記憶場所と属性コードを指定する。つ まり原始プログラム上の名前,定数に対してデータ領 域が確保される。属性コードとしては次の6種類があ る。  (1)単純変数 (2)配列要素 (3)配列名  (4)文関数 (5)関数実引数 (6)定数  これらは整数型か実数型かによってそれぞれを区別 する。 4) 手続き結合表の作成  文関数,外部関数およびサブルーチンの結合に用い て,各関数名の名表ポインタと内部文番号を登録す る。 5) 文属性表の作成  目的コードに対応して作られ,各文のポイソタ群が

(3)

登録される。ポインタとして次の6種類がある。  (1)内部文番号 (2)文の種類 (3)文番号 (4)文中の文番号 (5)変数表 (6)その他(手 続き結合表,局所変数のデータ領域) 6.算術式のスタック構造  算術式(代入文)の処理は原始プログラムに対応し た記号列に対して直接,解釈実行を行う。算術式を計 算するためにはどの演算子から順に計算すればよいの かという演算子の優先順位を考慮しなけれぽならな い。本処理系においては‘=’,‘(’,‘)’,‘@’,比較演算 子,論理演算子,組込み関数等も演算子として考えて いる。優先順位関数f,gを表一2に示す。  演算を実行するアルゴリズムについては通常の処理 系5)とほぼ同様であるが,スタックの操作はすべて解 釈実行時に行われる。本処理系の特徴として,組み込 み関数や論理演算は算術演算などとともに,ACOS

FORTRANの機能をそのまま実行ルーチンとして備

えている。したがって,実行時エラー表示もACOS

FORTRANで作成したものがそのまま使われるよう

に工夫されている。 7・入出力文のスタック構造 ’瓦言←1 s1←(  .←2 原始プログラ ムかち生成し た記号列 α夫←工 ん←ゐ十1 演算ルーチン を呼ぶ 9(Si−1):1

図一1算術式の処理

表一2優先順位関数

Si←x j←」十1t αk←(αk, αh+1,s元) k←k十1 k←k・一一 2 」←」−1  入出力文の処理は処理系の用意した入出力ルーチン を呼び出すことによって実現する。すなわちユーザ記

述の入出力並びとFORMAT文は実引数として対応

する処理ルーチンと結合する。

 入力処理は次の標準ACOS FORTRANのREAD

文を本処理系に組み込み,そのパラメタをユーザ記述 文から与えることにより実行する。入力実行時のエラ ー指示はACOSシステムに依存している。 READ(5, FOM, ERR=××)((IDBUF(1),   1=MX(L), MX(L十2)−1),(RDBUF(1),   1=MX(L十1), MX(L十3)−1), L=1, K,2)       (A)

x

19ω f(∋

 ** ×,/ 十,一  #  ( ),@ 比較演算子 AND, OR 組込み関数 *) 10 8 6 4 10 1 9 2 3 10 9 7 5 11 12 11 1 4 2 11 *)単項減算

 ここでFOMは=・・一一ザ記述のFORMAT文の内

容を文字代入文として与えられた文字型書式である。

IDBUFは整数型変数のスタック, RDBUFは実数

型変数のスタックである。MX, Kはユーザ記述の入 力並びをスタックに対応させるためのポインタで,す べての入力文が表現できる。この手続きは書式,スタ ック,ポインタを引数として入力ルーチンを呼び出す ことにより,入力データがスタックに入る。入力ルー チンの終了後,スタックの内容をポインタによって入 力並びへ復帰する。  例えぽ次のようなREAD文を考える。 READ(5,100)1, A, X, J, K, L, Y, M, Z       (B)  入力並びに対して整数型,実数型の対を組として, 次のような前処理をする。  MX, Kの初期値をそれぞれ1,2とする。入力並

びを左から調べていく。整数型の並びならぽMX

(4)

入力並び  1,A,X/J,K, L, Y/M,Z スタック  1 2   1DBUF

RDBUF

ポインタ

MX

K 5  6 1 J K  L

M

1 3 4  5 A X Y  Z 1 1 2 3 5 4 6 5 図一2スタックの説明図

(K十1)に1を加える。実数型の並びならばMX

(K+2)に1を加える。この実数型の並びから整数型 の並びへ移る時を区切りとして,Kに2を加える。

(B)で説明するとXとJ,YとMのところで区切

られて(1,(A,X))の組,((J, K, L), Y)の組, (M,Z)の組の計K/2個の組が生じる。 MXの奇数

番地にIDBUF,偶数番地にRDBUFの区切りを示す

ポインタがそれぞれはいることにより,(A)と(B) とで一対一対応がついて入力処理が行われる。また並 びが配列名またはDO型の場合は展開した後で同様 な処理をする。

WRITE文の手続きはREAD文の手続きと同様

であるが,前処理で出力並びの変数に格納されてある 値をスタックへ保存する。そして次の形で出力処理が なされる。 WRITE(6, FOM, ERR=××)((IDBUF(1),   1ニMX(L), MX(L十2)−1),(RDBUF(1),   1=MX(L十1), MX(L十3)−1), L=1, K,   2) 8.再帰的手続きと副プログラム  通常,手続きはその機能によって関数,サブルーチ ンの二つに分けられ,またプログラム構造では内部手 続き,外部手続きの二つに分けられる。サブル・・一・一チン は外部手続きとして定義され,関数には内部手続きと して定義する文関数と,外部手続きとして定義する外 部関数とがある。  また,以上に加えて本処理系では,外部手続きの内 部における再帰的呼び出しとして再帰関数と再帰サブ ルーチンを可能にしている。 1) 文関数と再帰関数の引用  文関数の引用は算術式中の1次子として次の形で現 れることにより文関数定義文と結合する。     f(e1, e2,…en)  ここでfは関数名であり,el,…, enは実引数と呼 ぼれ算術式とする。  文関数定義文においては,文関数名fは変数とし て扱われて変数表に文関数コードが登録される。また 文関数定義文の名表ポインタと内部文番号を文関数引 用文に渡すために,文関数結合表に登録しておく。

名前が名表に登録済みであり,算術式の1次子でf

が配列名でないことを満たし,文関数結合表に対応 する文関数定義文の内部文番号および名表のポイン タとが登録されていなけれぽ,再帰関数の引用にな る。 2)副プログラム(外部手続き)の引用と再帰的手続  き  再帰形式を含む副プログラムの引用を制御する外部

関数および外部関数の引用,SUBROUTINE文およ

びCALL文, RETURN文について述べる。副プロ

グラムに受け渡されるデータのうち,COMMON文

を用いたものについては,データの割当て方によって 自動的に受け渡しがなされる。ここでは引数によるデ ータの受け渡しをとり扱う。 2−1) 再帰関数を含む外部関数とその引用  (1)形式  外部関数はそれを引用するプログラム単位の外部で 定義する。ただし,再帰関数は同時に引用するプnグ

ラム単位の内部で定義する。予約語FUNCTIONを

先頭に置いて次のような形で与えられる。fは関数 名であり,al,…, anは仮引数と呼ばれる変数名とす る。     FUNCTION f(al, a2,…, an)  外部関数の引用は算術式中の1次子として次の形で 現れることにより外部関数と結合する。     f(el, e2,…, en)  ここでノは関数名であり,el,…, enは実引数と呼 ばれ算術式とする。  (2)翻訳

 文の種類は外部関数定義文ではFUNCTION文,

外部関数引用文では代入文である。  (a) 関数定義文の翻訳  関数定義文とみなされると,関数名と変数表ポイン タを外部手続き結合表に登録する。

(5)

 (b) 関数引用の翻訳   i) 名前が再帰形式を除いて,名表に未登録で  ある(関数引用文の関数引用変数の名前は,変数表  作成時にその名前を登録してある名表から除く)。   ii) 文関数定義文ではない(再帰形式の場合は  文関数の項参照)。  関数引用とみなされると,関数変数名と変数表ポイ ンタを外部手続き結合表に登録する。原始プログラム の入力終了ごとに,関数定義文および関数引用文の外 部手続き結合表を用いて,文関数と同様に引用関数の 変数表に定義文関数変数のデータ領域内番地を登録す る。さらに関数引用として文の属性表に実引数の変数 表ポインタおよび関数定義文の内部文番号を登録して 関数引用文を生成する。  再帰関数引用の場合には副プログラムの翻訳終了 後,仮引数および局所変数の上限と下限の局所変数ポ インタを文の属性表に登録しておく。  (3) 解釈実行手順  再帰関数を含む関数副プログラムの実行は,関数引 用文によって引きおこされる。以下に関数の実行手順 を示す。  a) 関数引用文  b) 関数引用文の内部文番号を,戻り内部文番号ス   タックに保存する。  c) 実引数を変数スタックに転送する。

 d)FUNCTION文に分岐する。

 e)再帰形式の場合,仮引数と局所変数を局所変数   スタックに保存する。

 f)FUNCTION文の仮引数に変数スタックから

  値を転送する。  g) 副プログラムの処理を行う。  h) RETURN文で戻り内部文番号に復帰する。  i) 再帰形式の場合,仮引数と局所変数を復帰す   る。  j) 関数値を引用関数変数へ転送する。  k) 関数引用を含む算術式を処理する。 2−2)再帰的手続きを含むサブルーチンとその引用  (1)形式  外部サブルー一チンはそれを引用するプログラム単位 の外部で定義する。ただし同時に引用するプログラム 単位の内部で定義する場合は再帰サブルーチンとな る。次のような形で与えられる。    SUBROUTINE S(al, a2,…, an) または

   SUBROUTINE S

 ここでal,…, anは仮引数と呼ぽれ変数名および配 列名とする。  サブルーチンはCALL文により引用される。 CA LL文は次のような形で与えられる。     CALL S(al, a2,…, an) または

    CALL S

 ここでal,…, anは実引数と呼ぼれ変数名および配 列名とする。  (2)翻駅  (a)サブルーチン定義文の翻訳  サブルーチン定義文とみなされると,サブルーチン 名と変数表ポインタを外部手続き結合表に登録する。  (b)サブルーチン引用文の翻訳  CALL文とみなされると,そのサブルー一チン名と 変数表ポインタを外部手続き結合表に登録する。  原始プρグラムの入力終了ごとに,SUBROUTINE 文およびCALL文の外部手続き結合表を用いて内部’ 文番号を結合する。  再帰サブルーチンの場合は副プログラム翻訳終了 後,仮引数および局所変数の上限と下限の局所変数ポ インタを文の属性表に登録しておく。  (3) 解釈実行手順  再帰サブルーチンを含むサブルーチン副プログラム の処理はCALL文により引きおこされる。以下にサ ブルーチンの実行手順を示す。

 a) CALL文

b) CALL文の内部文番号を戻り内部文番号スタ  ックに保存する。  c)実引数を変数スタックに転送する。

d)SUBROUTINE文に分岐する。同時にSUB

 ROUTINE文の内部文番号を,サブルーチン内部

 文番号スタックに保存する。  e) 再帰形式の場合,仮引数および局所変数を局所 変数スタックに保存しておく。

 f)SUBROUTINE文の仮引数に,変数スタック

 から値を転送する。 g)副プログラムの処理を行う。

h)RETURN文でSUBROUTINE文の内部文

番号を復帰させる。

 i)再帰形式でない場合,SUBROUTINE文の仮

引数の値を変数スタックへ転送する。そしてCALL  文の戻り内部文番号を復帰させ,実引数定数と算術 式を除いて変数スタックの値をCALL文の実引数 へ転送する。

(6)

  CALL文の次の文へ制御を移す。  」)再帰形式の場合,仮引数,局所変数および

 CALL文の戻り内部文番号を復帰させて・CALL

 文の次の文へ制御を移す。

2−3)RETURN文

 (1)形式

    RETURN

 (2)翻訳

 関数あるいはサブルーチンにより,RETURN

文は異なるコードをもつ。 (3)解釈実行手順

 a)RETURN文

 b)戻り内部文番号スタックより,戻り内部文番号  をとりあげる。

 c)サブルーチンのRETURN文では仮引数の値

 を変数スタックへ転送し,CALL文の戻り内部文  番号に戻り,変数スタックからCALL文の実引数  へ値を転送する。

d)関数のRETURN文では,関数値を戻り内部

 文番号の引用関数変数のデ・・一’タ領域に入れる(関数  値だけ戻る)。

e)再帰形式の場合,SUBROUTINE文では仮引

 数,局所変数を局所変数スタックに保存し・RET

 URN文の後に復帰させる。 FUNCTION文でも

 仮引数,局所変数を局所変数スタックに保存し,

 RETURN文の後に復帰させる。

9.再帰的手続きの実行例 図一3に実行例を示す。この原始プログラムはマー クカードで記述されてあり,連続処理されたものであ る。ここでは,Gが再帰関数である。 10. おわり{こ  多重プログラミングの処理を目的とした汎用の処理 装置の中で,バックグラウソドの位置づけと限定され た記憶容量の中で,教育ジョブのように機能のレベル は低いが大量のジョブを処理できる数値計算向き言語

として常駐型FORTRAN処理系を開発することを

試み,初期の目標をほぼ達成することができた。  万能的な情報処理や数値計算処理などの多くの機能 についてどこまで機能を高めるかは,処理効率との相 反する条件の中で考えなけれぽならないが,再帰形式 など数値処理にとって重要なものは効率は落ちるが積 C     SQUARε ROO†    bO り0 1●1,10    x富1    P■0・5★《1・0◇X》    C86{D,X,    URITε《6’100》XoC 1!813艦;1;H川岡8εR’’”5・1”s°R▼’”ε15・7》    ㍍IP  FUNC†10N 6《V,X,  A●V●X,V  lF《A・6了・O・0001) 60 了0 20  6●V  RE了URN 20 8包0・5合《V◆X/V,  6■6《80X》  RETURN

 ENb

NVM8ER●  り・O  SO費†・  0●りOOOOOOε◆0¶ NUMBERロ 2.O SOR†・ 0.¶‘14215E◆Ol NUMBER■  3・O  SOR†宰  0・1752050E◆01 NUMBER● 4・0 3QR了s O・2000000ε◆01 紺UM8ER宕  5・O  SOR†■  O・2236069ε◆01 NUH8εR●  6・O  SOR了字  0・246949‘ε◆01 NUM8ε費■  7・O  SgR▼■  0●2645766ε◆oつ NUMBER■  8.O  SORT■  0,28284ト68E◆Ol NUH8ε良●  9・O  SgR70  0・3000000E◇01 NUMBER■ †0・O  SOR▼ロ  0.3162277E◆0つ     図一3 実 行 例 極的に取り入れる必要があると考える。  また,本処理系は主記憶容量の制限のためデータ領 域やスタックの深さが十分ではなく,翻訳重視のイン タプリタシステムであるが,今後データ構造や構造化 などをコンパイラとして記号処理言語で作成すること

も問題となる。しかし機械に依存しないFORTRAN

などの高級言語での記述が,ユーザレベルでもシステ ムを記述できるという理想的な姿として本処理系は大 きな意味をもつと考えられる。 文 献

1)N.Wirth:The Programming Language

  PASCAL, Acta Imformatica 135−63(1971) 2)N.Wirth:Algorithms十Data Structures=   Programs, Prentice−Hall 3)D.W.バロン/岸田孝一(訳):プログラミン   グにおける帰納的技法,サイエンス社(昭和   48年)

4) 日本電気:ACOS FORTRAN言語説明書

  (昭和51年11月)

5) 島内剛一,寛捷彦,辻尚史:FORTRANの

  実際一文法からコンパイラまで一,サイエン   ス社(昭和48年) 6) D.E.クヌース/広瀬健(訳):基本算法1・基   礎概念,サイエンス社(昭和53年)

参照

関連したドキュメント

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

解析の教科書にある Lagrange の未定乗数法の証明では,

 当図書室は、専門図書館として数学、応用数学、計算機科学、理論物理学の分野の文

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計

①就労継続支援B型事業においては、定員32名のところ、4月初日現在32名の利用登録があり、今

いてもらう権利﹂に関するものである︒また︑多数意見は本件の争点を歪曲した︒というのは︑第一に︑多数意見は

就職・離職の状況については、企業への一般就労の就職者数減、離職者増(表 1参照)及び、就労継続支援 A 型事業所の利用に至る利用者が増えました。 (2015 年度 35

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計