PASCAL・Modula-2

 BASIC、Quick Basicで、開発をしていたときは、オブジェクト指向とか、そういうものでなくても、これぐらいのカプセル化ができればと思っていました。データ構造を系統的に考えることに、こだわりもあった。

VisualBasicの最初のころは、イベントドリブンの動きばかり捉われて自分が一番気になるデータ構造の考えは何だかおざなりになったなと実感しました。

 当時の感覚にいちばん近かったのは、Modula-2のデータ構造でした。

 アジソンウェスレイ・トッパン

 情報科学シリーズ-5

 C++:オブジェクト指向プログラミング

 第4章 クラスを用いてのデータカプセル化と情報隠蔽

(P79) 4.4.2 Modua-2で実現された stack抽象型

リスト 4.9

Modula-2におけるstackADTのDEFINITION MODULE

DEFINITION MODULE stack;

EXPORT QUALIFIED

(* type *) stack,

(* proc *) push, pop, define;

TYPE stack;

PROCEDURE define

( VAR s : stack );

PROCEDURE push;

( s : stack;

c : CHAR );

PROCEDURE pop

( s : stack ) : CHAR;

END stack.

 

リスト4.10

Modula-2におけるstackADTのIMPLEMENTATION MODULE

IMPLEMENTATION MODULE stack;

FROM Storage IMPORT ALLOCATE;

VAR

top : INTEGR;

TYPE stack = POINTER TO ARRAY[0..99] OF CHAR;

PROCEDURE define

( VAR s : stack );

BEGIN

NEW( s );

top := 0;

END define;

PROCEDURE push

( s : stack;

c : CHAR );

BEGIN

IF top <= 100

THEN

s^[top]:= c;

INC( top );

END;

END push;

PROCEDURE pop

( s : stack ) : CHAR;

BEGIN

IF top > 0

THEN

DEC( top );

RETURN s^[ top ];

END;

END pop;

END stack.

リスト4.11 

stackADTを用いるModula-2テストプログラム

MODULE stacktst;

FROM stack IMPORT

(* type *) stack,

(* proc *) push, pop, define;

FROM Strings IMPORT

(* proc *) Length;

FROM termio IMPORT

(* proc *) writestring, readstring, writeln;

TYPE nametype = ARRAY[0..19] OF CHAR;

PROCEDURE reversename

( name          : nametype;

VAR backwards : nametype );

VAR

s : stack;

i : INTEGER;

BEGIN

define( s );

FOR i := 0 TO Length( name) - 1 DO

push( s, name[ i ]) ;

END;

FOR i := 0 TO Length( name ) - 1 DO

backwards[ i ] := pop( s );

END;

backwards[ Length( name ) ] := 0C;

END reversename;

VAR

yourname, namebackwards : nametype;

BEGIN (* Main program *)

writestring( ''Enter your name: '');

readstring( yorname );

reversename( yourname, namebackwards );

writeln;

writeln;

writesting( '' Yuor name backwards is '');

writestring( namebackwards );

END stacktst.

 

(P80)

 Modula-2のstackは、100個の文字列からなる配列のポインタとして実現される。プロシージャdefineで、100個の文字にメモリ領域を割り当て、整数インデックスtopの初期値を 0 にする。

 このプログラムは、C++で実装したstack抽象型のpop、pushを

Modula-2でコーディングしたもので、原著にはその比較が記述されています。Modula-2のカプセル化の例として提示しました。


 憶い出した。Modula-2でSimula67もどきのコーディングをすることを考えていた。現在では、gnu cim があるけど、気持ちが乗らない。intel CPUに実装されているgnu cimを実行しても別の言語だと感じる。

当時のUNIVAC、IBMなどの大型コンピュータで動作することを確認する。このことに意味があると思う。

 でも、同じく昔からあるFORTRAN、COBOLは、当時のコンピュータで実行したいと思わない。それに、Simula言語をコンピュータにどのようにビルトインしたのかについても興味が尽きない。動作が不安定でもあったようだ。過去の大型コンピューターは、身近な存在でないためPCで実行するModula-2を考えた。(Modula-2も身近ではなかったけど。)