4.PASCAL



総目次に戻る

PASCAL



Keywords:TurboPascal,ANSI,PASCAL,Unit,PROGRAM,インターフェース部,実現部,初期化部,DOS Unit,SYSTEM Unit,.TPU

PASCALはコンピュータのプログラムの教育用に考案されたという点でBASICと似ていますが,複雑な問題を人間の思考に近い形で表現するために,厳密な型,階層構造,集合などを導入した点で,気軽に入っていけることに重点を置いたBASICとは異なっています.また,ユーザが型や値にも名称をつけることができる点においてもFORTRANやPL/Iとも異なる処理系です.

PASCALが作られた当時はパソコンなど存在せず,ハードウェアにまったく関係しない処理のみを対象としていたので当初のPASCALでも不足はなかったのですが,パソコン時代になってハードウェアの種類は増え, OSの能力は小さく, 利用可能なメモリも少ない状況でPASCALのメリットを生かすべく,省略と拡張が加えられ,8ビット時代最後のPASCALとして登場したのがCP/M版
TurboPascalでした.

その後,アセンブラやほかの言語とのリンク,分割コンパイル,割り込み処理対応,内蔵アセンブラ,オブジェクト指向などの拡張を行って,現在のTurboPascalに至っています.

現在,標準PASCALといえばANSI PASCALを指します.
< copyright 1994 中野正次 > 

トップに戻る


TurboPascal
(ターボ・パスカル)

コンパイラでありながら,インタープリタ感覚で使えるPASCALとして大ヒットしたBorland社の製品です.ANSI PASCALと比較すると,一部の機能は省略されていますが(主に実行スピードを上げるため),大幅な規制の緩和と機能の拡張が行われており,86系ハードウェア上でのPASCALの主流となっています.

プログラムは,各処理を
Unitというプログラム単位で作成しメイン・プログラムとしPROGRAMの中で記述します.

トップに戻るORPASCALに戻る


PROGRAM
(プログラム)

PASCALではソース・プログラムはPROGRAMで始まり,END. で終わります.TurboPascalでも同様の記述は可能ですが,PROGRAMとこれに続くプログラム名は省略できます.

TurboPascalにおいて,プログラムという言葉は特別な意味をもっています.PROGRAMというキーワードは省略可能ですが,メイン・ルーチンを含む,唯一のユニットでないコンパイル単位をプログラムと呼びます.プログラムにはインターフェース部はなく,全体が実現部といえます.したがって,実現部を示すキーワードImplementationも使用されません.また,プログラムやユニットからほかのユニット内(の変数関数など)を参照することはできますが,ユニットからプログラム内は参照できません.

トップに戻るORPASCALに戻る


SYSTEM Unit

TurboPascalでコンパイルされたプログラムを実行するときに最低限必要な定数変数関数を含むユニットで,TURBO.TPLの一部です.指定しなくてもプログラムのコンパイル時にリンクされます.

トップに戻るORPASCALに戻る


ANSI(アンシ) PASCAL

American National Standards Instituteの規格によるPASCAL言語です.厳密な型規制に象徴される融通のきかないPASCALとの印象が強いのですが,可変レコードの動的変数やブロック外へのGoto文などと,TurboPascalにはない便利な機能も含まれています.

トップに戻るORPASCALに戻る


Unit
(ユニット)

メイン・プログラムを含まないプログラム・データのコンパイル単位です.通常1ファイルに1ユニットが納められます.ソース・プログラムはUnitで始まり,インターフェース部,実現部,初期化部を持ち,END. で終わります.ソース・ファイルの拡張子には .PAS が用いられますが,コンパイルされると中間イメージになり
.TPUとなります.ユニットはソースと中間イメージの総称です.

よく使われるのがDOS Unitで,暗黙のうちに使われるのがSYSTEM Unitです.例外的にユニットを複数含む .TPLファイルもあります.

トップに戻るORPASCALに戻る


.TPU

ユニットの中間イメージ・ファイルの拡張子です.プログラムのコンパイル時にユニット名(=.TPUのファイル名)を指定することで,プログラムにリンクされます.中間イメージそのものは実行することはできません.

トップに戻るORPASCALに戻る


DOS Unit

ソフトウェア割り込みや低レベルのファイル・アクセスのための手続き,およびこれらのパラメータ記述に必要な変数の型や定数などが含まれています.

トップに戻るORPASCALに戻る










PASCALの予約語



Keywords:IF,ELSE,FOR,DO,WHILE,REPEAT, UNTIL, CASE, Else, Interrupt, ASM,Inline,Assembler

PASCALでは,一般的な処理系にある条件文のIF THEN ELSEとか,FOR DO,WHILE DO,REPEAT UNTILなどの繰り返し文がいくつかあります.また分岐文にはCASE(TurboPascalには
Case Elseもある)も使え,レコード型の参照のために,WITH DOというほかの処理系には最初からない予約語もあります.

MS-DOS固有のプログラムを書くための割り込み処理用にInterrupt,アセンブラを埋め込むためのASM,機械語を埋め込むためのInline,手続きをすべてアセンブラで記述するためのAssembler宣言などが用意されています.
< copyright 1994 中野正次 > 

トップに戻るORPASCALの予約語に戻る


Interrupt
(インターラプト)

TurboPascalで手続きを割り込み処理に対応するために付加するキーワードです.割り込み処理対応の手続きは,手続き内の処理を開始する前にすべてのレジスタをスタック上に退避し,処理の終了後スタックから復帰します.割り込み処理対応の関数というのは存在しません.

トップに戻るORPASCALの予約語に戻る


Assembler
(アセンブラ)

TurboPascalのソース・ファイル内に,手続き(関数)をすべてアセンブラで記述するときに付加するキーワードです.コンパイラはAssembler宣言された手続き(関数)に対しては一切の前処理後処理を行わず,ユーザが記述したアセンブラ表記のみを内蔵アセンブラで機械語に変換します.Assembler手続き(関数)内からPASCALで宣言された変数名などは参照できますが,アセンブラでの処理方法とその効果の関係は全面的にユーザの責任です.

トップに戻るORPASCALの予約語に戻る


Case Else

TurboPascalではCASE文の選択定数は何度現れてもよく,選択子がどの選択定数にも該当しない場合をELSE以下で処理することができます.

また,どの選択定数にも該当しない場合にはELSEがなくてもエラーになりません.

トップに戻るORPASCALの予約語に戻る


WITH DO

レコード型変数の構成要素(欄)を参照するには“レコード名.欄名”と書かなければなりませんが,WITH文を使えば欄名のみで参照できるようになります.WITH文は,特定のレコード変数のいくつかの欄を参照するときに有効で,ソース・コードが簡単になるだけでなく,実行速度も上がります.次の2行は同じ処理をしています.

rec.field 1 :=rec.field2+rec.field3

WITH rec DO field 1 :=field2+field3

トップに戻るORPASCALの予約語に戻る


ASM

TurboPascalの内蔵アセンブラは,実行文が書ける任意の場所にASM文として書くことができます.ASM文はASMで始まりENDで終わります.

ASM文内はアセンブラに準じた文法(MOV AX, Byte Ptr ES : BP[− 10H]など)が適用され,PASCALらしさはどこにもありません.ASM文内からPASCALで宣言された変数名などは参照できますが,アセンブラでの処理方法とその効果の関係は全面的にユーザの責任になります.

トップに戻るORPASCALの予約語に戻る


Inline
(インライン)

▼Inline文

TurboPascalの実行文としてPASCALの文法と無関係に機械語(数字)コードを挿入する機能です.形式としては手続き呼出しと似ていますが,実際にはInline文が書かれた場所に機械語コードがそのまま置かれます.

▼Inline手続き(関数)

TurboPascalのソース・ファイル内に手続き(関数)をすべて機械語(数字)で記述するときに付加するキーワードです.コンパイラは,Inline宣言された手続き(関数)に対しては一切の変換を行わず,ユーザが記述した機械語表記のみをそのまま手続き(関数)を呼び出した場所に埋め込みます.

Inline手続きは,同じInline文を何度も書く手間を省く以外は,Inline文とまったく同じコンパイル結果になります.Inline関数はその戻り値を式の値として解釈する以外はInline手続きと同じです.Inline関数をInline文として記述することはできません

. Inline文(手続き,関数)内からPASCALで宣言された変数名などは参照できますが,機械語での処理方法とその効果の関係,前後のレジスタの保存や意味の解釈などは全面的にユーザの責任になります.

さらに機械語では,ハードウェア(CPU)が解釈不可能なコードを書くこともでき,そのリスクは大きいのですが,86系でありながら追加命令をもっているCPU(V25,V55など)のシステムをPASCALで記述する場合には不可欠な機能といえます.

トップに戻るORPASCAL予約語に戻る










PASCALのプログラム構造



Keywords:PROCEDURE,FUNCTION,再帰呼び出し

PASCALのプログラムはPROGRAMで始まり,END.で終わります.また,サブルーチンは手続きと関数の2種類に分かれています.

これは,ほとんどすべてのPASCALで共通となっていますが,内部の構成は標準のPASCALとTurbo Pascalでは少し違い,Turbo Pascalのほうが制限が緩くなっています.

この中で最も重要なことは,PROGRAMからEND. までの内容と
PROCEDUREからEND ; までの内容が全く同じであるという点です.FUNCTIONについては,関数が呼び出し側へ返す値の型を指定する以外は,これまた全く同じです(要は手続きとは値を返さない関数と考えればよいわけです).

すなわち,PROGRAMは一度しか使われませんが,PROCEDUREやFUNCTIONはその内部に変数や定数,手続きや関数を定義できるのです.これはデータの型で配列やレコードの要素が配列やレコードでもあり得るのと同じように,無制限に多重化できます.

また,手続きや関数の中で,その手続き(関数)自身を呼び出すこと(再帰呼び出し)も可能です
< copyright 1994 中野正次 > 

トップに戻るORPASCALのプログラミング構造に戻る


FUNCTION
(関数)

サブルーチンのうち戻り値のあるものはFUNCTIONを使います.戻り値は型をもち,関数名とともに宣言します.戻り値の型は関数の型とも呼ばれ,構造化型を指定することはできません.

一般に関数内では戻り値を設定するものであり,標準PASCALでは戻り値を設定しない関数はエラーになりますが,TurboPascalではエラーとしていません.この意味で関数は戻り値の型を宣言している点以外は手続きとまったく同じといえます.

トップに戻るORPASCALのプログラミング構造に戻る


再帰呼出し
(RecursiveCallリカーシブ・コール)

手続き(関数)をその手続き(関数)自身の中から呼び出すことです.手続きpが手続きpを呼び出す直接再帰呼出しと,手続きp 1 が手続きp2を呼び出し,手続きp2が手続きp 1 を呼び出す(さらに多くの段階を経る場合も)間接再帰呼出しがあります.

どちらにしても再帰呼出しが中止される何らかの条件が組み込まれていなければ,理論上無限のループになってしまい,実際にはハードウェアの制約から実行時のエラーになってしまいます.

右に示すプログラムは,四則演算とかっこの数字の優先度を解釈する例です.

関数vcalが再帰呼び出しされているのがわかると思います.



  PROGRAM recurcal ;(* Formula calculation test program. 1993 / 11 / 24
     Only Integer,+-*/() Suported *)
  Var a : INTEGER ;
    I,j : WORD ;
      s : STRING ;
      
  FUNCTION vcal(lv:WORD) : INTEGER ;
    LABEL e9 ;
    VAR v1,v2 : INTGER ; xv,tf : BOOLEAN ;
    procedure cal ; (Decimal number eval*)
      BEGIN
         WHILE s[i] IN ['0'..'9'] DO BEGIN
            v1:=v1*10+ORD(s[i]) AND 15 ;Inc(i) ; xv:=TRUE END
       END ;
      BEGIN WRITE(' @',lv) ;
            v1=0 ; xv:=FALSE ;
            WHILE s[i]=' ' DO Inc(i) ;
            cal ; WRITE(' ',vl) ;
            v2:=v1 ; vcal:=v2 ;
            WHILE s[i]<>#0 DO BEGIN
              IF s[i]=' ' THEN BEGIN WHILE s[i]=' ' DO Inc(i) ; tf:=TRUE END
                          ELSE tf:=FALSE ;
              WRITE(' i',i) ;
              vcal:=v2 ;Inc(i) ;
              CASE s[i-1] OF
            ')' : IF lv>1 THEN GoTo e9 ELSE EXIT ;
            '+' : IF lv<4 THEN v2:=v2 + vcal(4) ELSE GoTo e9 ;
            '-' : IF xv THEN IF lv<4 THEN v2:v2 - vcal(4) ELSE GoToe9
                        ELSE v2:=-vcal(6) ;
            '*' : IF lv<6 THEN v2:=v2 * vcal(6) ELSE GoTo e9 ;
            '/' : IF lv<6 THEN v2:=v2 DIV vcal(6) ELSE GoTo e9; 
            '(' : BEGIN IF xv THEN IF tf THEN EXIT ELSE v2:=v2*vcal(1)
                              ELSE v2:=vcal(1) ;
                    IF s[i] IN ['0'..'9'] THEN BEGIN 
                       v1:=0 ; cal ; WRITE(' (',v1) ; v2:=v2*v1 END
                  END ;
              ELSE BEGIN e9: Dec(i) ; EXIT END
              END(*CASE*) ;
              xv:=TRUE ; Inc(j) ; WRITE(' j',j,' lv',lv) ;
            END ; vcal:=v2
          END ;
          
        BEGIN REPEAT
          WRITELN('Input Formula') ;
          READLN(s) ; s:=s+#0 ; i:=1 ; j:=0 ;
          a:=vcal(0) ;
          WRITELN(^m^j'Value=',a,' Next pos=',i,' ASCII=',Ord(s[i]))
        UNTIL s=#0 END .

トップに戻るORPASCALのプログラミング構造に戻る


PROCEDURE
(手続き)

サブルーチンのうち戻り値のないものはPROCEDUREを使います.基本的にはプログラムと同じ構造をもち,手続きの中に変数定数の宣言をはじめ,手続きや関数も含むことができます.

ただし,サブルーチン内で宣言された変数などは,そのサブルーチンの外から参照することはできません.逆にサブルーチン内から外で宣言された変数などは参照できます.

トップに戻るORPASCALのプログラミング構造に戻る










PASCALのデータ



Keywords:Absolute,VAR,CONST,TYPE,型つき定数 データには,基本的に定数と変数があり,定数には使用する場所で値そのものを書くものと,値に名前を付けて書くものがあります.さらに,名前付きの定数には値の表現からコンパイラがその型を決めるものと,ユーザが型を(変数と同じように)指定して決めるものがあります.

型を指定する定数は型つき定数と呼ばれ,ファイル型とポインタ型(後述)を除くすべての型の定数が作れます.また,この種の定数は初期値が設定される以外は基本的に変数と同じ扱いとなるので,別の値を代入し直すことも可能です.

変数の宣言に使われるのは
VAR,定数はCONST,型宣言はTYPEがキーワードになっています.

定数と同じアドレスに別の変数をAbsoluteで割り付けることも可能です.ただし,この場合は定数としての役目は果たさなくなります.

また,PASCALでは論理型(BOOLEAN)や集合型(SET OF)という型が用意されていますが,さらにユーザがその都度新しい型を作り,その型に名前をつけることができます.

また,順序型を新しく定義する場合,その値をユーザがつけた名前で表すことが可能なのです.
< copyright 1994 中野正次 > 

トップに戻るORPASCALのデータに戻る


VAR(Variable)(変数)

VARは変数宣言を示すキーワードです.PASCALでは,変数は使用前に宣言されていなければならず,暗黙宣言や文脈宣言は存在しません.ただし,システムが使用目的を決めた宣言ずみ変数はあります.

変数宣言は変数名に型を割り当てる作業であり,コンパイラはその型から必要なメモリ量を計算します.日本語では“数”という字が使われていますが,英語では“可変”,変わり得るという意味で数値とはかぎられていません(文字型や集合型).

トップに戻るORPASCALのデータに戻る


TYPE(型)

TYPEは型宣言を示すキーワードです.型宣言は,システム定義の型を組み合わせて配列型やレコード型に名前を付けたり,列挙型としてその値すべてに名前を付けます.配列型やレコード型は名前を付けなくても変数宣言時に構造を指定できますが,手続き(関数)の仮パラメータの型として,または型キャスト機能を使用するときは型名を宣言しなければなりません.

TurboPascalでは以下の型が定義済みになっており,このうちすべて大文字で書いてあるものは標準PASCALで定義されているものです(カッコ内の数字はバイト数を示す).

▼単純型:INTEGER整数(2),REAL実数(6),CHAR文字(1),BOOLEAN論理(1),Byteバイト(1),Wordワード(2),Longint長整数(4),Shortint短整数(1),Single単精度実数(4),Double倍精度実数(8),Extended拡張実数(10),Comp拡張整数(8).

▼ポインタ型:Pointer(4).
▼文字列型:STRING(1-256).
▼手続き型:Procedure(4),Function(4).
▼構造化型:ARRAYアレイ配列,SET OFセット・オブ集合,
RECORDレコード,FILEファイル,TEXTテキスト

トップに戻るORPASCALのデータに戻る


CONST(Constant)(定数)

CONSTは定数宣言を示すキーワードです.定数宣言は定数名に値を割り当てる作業であり,コンパイラはその表現から型を決定します.定数宣言できるのは整数,実数,文字,文字列のみです.TurboPascalでは,ユーザが型まで明示する
型つき定数も宣言できます.

トップに戻るORPASCALのデータに戻る


型つき定数

TurboPascalの型つき定数は,変数と同様に定数名に型を割り当ててメモリを得るとともに,その内容を設定します.つまり,実行に先立って値が決まっている変数と見ることができます.当然,その値は実行中に(代入などによって)変化することがあるので注意しなければなりません.

トップに戻るORPASCALのデータに戻る


Absolute
(アブソリュート)

TurboPascalでは,変数宣言に当たってその番地を指定することができます.番地は直接数値で指定する以外に,ほかの変数名(型つき定数も)を指定して同じ番地に割り当てることもできます.ほかの変数名を指定すれば,同一のメモリ内のデータをまったく関連性のない別の型で参照できることになり,プログラムは読みにくくなりますが,複雑な構造のデータを手際良く処理したりと,ハード上特別な形式になっているデータを扱うには不可欠といえます.

型キャストでも別の型に変換して扱うことができますが,Absolute宣言ではバイト数が一致しなくてもかまいません.VRAMや割り込みベクタを数値指定すれば,ほかの変数と同じように扱うことができる反面,少し間違えばシステムを破壊する恐れもあるので注意して使わなければなりません.

VAR vram : ARRAY[0. . 39, 0. . 24] OF WORD
ABSOLUTE $B000 : 0 ;
i, j, k, l : INTEGER ; ll : LONGINT ABSOLUTE i ;

トップに戻るORPASCALデータに戻る