| パラダイム | 構造化された、命令的な |
|---|---|
| 開発者 | インターナショナル・コンピューターズ・リミテッド |
| 影響を受けた | |
| アルゴル68 | |
S3は構造化された命令型の 高水準 コンピュータ プログラミング言語である。[1] 英国のInternational Computers Limited (ICL)社が2900シリーズメインフレーム用に開発した。ALGOL 68の影響を受けた構文を持つシステムプログラミング言語であるが、データ型と演算子は2900シリーズで提供されているものに合わせたものである。オペレーティングシステムVMEの実装言語であった。
注釈付き例
パブリックドメインで入手可能な S3 プログラムの珍しい例としては、サウスウェスト大学地域コンピュータセンターで開発され、コロンビア大学のKermit 実装アーカイブにアーカイブされているKermitの実装があります。[2]以下の例は、メインモジュール (kmt_main_module) のハイライトを抜粋したものです。
プログラムはモジュールの識別と、著者への謝辞として引用するコメントから始まります。
モジュール KMT_MAIN_MODULE; @ バージョン 1.01 @ @------------------------------------------------ ------------------------@ @ @ @ @ @ ----- SWURCCVMEKERMIT ----- @ @ @ @ @ @ -------------------------------------------------- --------------- @ @ @ @ @ @ バージョン 1.00 (1986 年 2 月) @ @ @ @ 執筆者: リチャード・アンドリュース、デイビッド・ロード、@ @ サウスウェスト大学地域コンピュータセンター、@ @ Claverton Down、バース BA2 7AY、イギリス @ @ @ @ @ @ -------------------------------------------------- --------------- @ @ @ @ @ @ バージョン 1.01 (1986 年 10 月) @ @ @ @ 修正者: Dave Allum および David Lord、SWURCC。@ @ -------------------------------------------------- --------------- @
次にいくつかの「モード宣言」が続きます。モードは、型を表す Algol 68 用語です。
モードKMT_BUFFERは(96)バイトです。
モード KMT_STRING は REF()BYTE です。
モード KMT_WORD は REF()BYTE です。
モード KMT_MTM_VALUES は ANY です
(LONG WORD LW_VALUE、
LONG INT LI_VALUE、
参照ワードRW_VALUE、
REF INT RI_VALUE、
REF LONG WORD RLW_VALUE、
REF LONG INT RLI_VALUE、
REF()BYTE RVB_VALUE、
REF() REF() BYTE RVRVB_VALUE);
モード KMT_PP_PACKET_STATISTICS_S は構造体です
(INT入力合計、
出力合計);
最初の型は 96 バイトの配列です。次の 2 つはバイト配列への参照 (ポインター) です。KMT_MTM_VALUES は、さまざまな異なる型を表示できるユニオン型です。WORD は 32 ビットの符号なし整数、INT は 32 ビットの符号付き整数、LONG は 64 ビットであることに注意してください。ユニオンの最後のオプションは REF()REF()BYTE とマークされています。これは、メンバーがバイト配列へのポインターである配列へのポインターであることを意味します。
ここで宣言される最後の型は STRUCT であり、具体的には 2 つの整数を含むタプルです。
プログラムは、モジュールが依存する外部プロシージャを宣言することによって続行されます。RESPONSE は、エラー情報を含む戻り値を示します。
EXT PROC (応答) KMT_UI;
EXT PROC (REF INT、INT、RESPONSE) KMT_PH;
外部プロシージャ (REF INT、REF INT、応答) KMT_PP_GET_PACKET、
PROC (INT、INT、BOOL、RESPONSE) KMT_PP_SEND_PACKET、
PROC (REF()BYTE、RESPONSE) KMT_PP_BUILD_STRING_PACKET_DATA;
また、いくつかの外部変数もあります:
EXT REF () バイト KMT_VERSION; 外部参照ブールASG_ROUTE; EXT REF()KMT_MTM_VALUES KMT_MTM_AREA; EXT REF() バイト MTM_TEXT; EXT REF INT MTM_TEXT_LEN; EXT REF ()REF ()BYTE MTM_RECALL_DATA;
プログラムの残りの部分は、いくつかのプロシージャ定義で構成されています。実際にプログラムのエントリ ポイントを定義するプロシージャ定義の 1 つを次に示します。
グローバル静的 (<ステータス 5;PSPACE 10001;テンプレート>) PROC KERMIT_THE_FROG IS
((<LIT "COMMAND">) REF()BYTE オプション、
(<LIT "" >) REF()BYTE VME_FILE、
(<LIT "" >) REF()BYTE REM_FILE、
(<KEY RESPONSE;DEF N'RESULT>) 応答結果):
始める
()BYTE JSV_NAME := "ASG"; @ ASG_ROUTE の値を取得する bool @
CTM_JS_READ(JSV_NAME、NIL、NIL、ASG_ROUTE、RC_IGNORED);
RC_IGNORED NE 0 の場合、ASG_ROUTE := FALSE FI;
@ パラメータ参照を検証します(パラメータ値は後で検証されます): @
@ OPTION は REF () BYTE モードである必要があります。ZLR または NIL は使用できません。@
@ VME_FILE は REF () BYTE モードである必要があります。ZLR であってもかまいませんが、NIL であってはなりません @
@ REM_FILE は REF () BYTE モードである必要があります。ZLR であってもかまいませんが、NIL であってはなりません @
UNLESS (VERIFY オプションと VALIDR オプション)
AND (VME_FILE を検証し、(VME_FILE が有効であるか、または (VME_FILE が NIL であるか) 否か))
AND (REM_FILE を検証し、(REM_FILE が有効であるか、または REM_FILE が NIL であるか))
THEN @ 無効なパラメータ参照 @
結果:= 10002 @ ARCH_INACCESSIBLE_PARAMETER @
ELSF @ リソースブロックの作成 @
CTM_JS_BEGIN(結果);
結果 <= 0
次に@リソースブロックが作成されます@
LONG LONG WORD KERMIT_RESULT;
ANY((3)LONG WORD AS_LW、(6) WORD AS_W) パラメータ;
PARAMS.AS_LW := (BDESC OPTION、BDESC VME_FILE、BDESC REM_FILE);
@ プログラムエラーハンドラを設定する @
KMT_EH_INFORM_PE_CONTINGENCY(結果)の場合;
結果 > 0
THEN @ エラーハンドラの設定に失敗しました @
スキップ
ELSF CTM_JS_CALL(NIL、PDESC KERMIT_SUPPORT、PARAMS.AS_W、KERMIT_RESULT、
結果); @ ファイアウォールを作成 @
結果 <= 0
その後、@ 正常に終了するか、CTM_STOP 経由で終了しました @
結果 := IF (S'S'KERMIT_RESULT) <= 0
THEN 0 @ 警告を無視 @
ELSE 52000 @ エラー 共通結果コードを返す @
FI
FI;
CTM_JS_END(RC_IGNORED) @ リソースブロックの終了 @
FI
終わり
ここで注目すべき機能は次のとおりです。
- プロシージャの宣言には、プログラムを SCL から呼び出したり、デフォルトのパラメータ値を求める対話型シェルから使用したりできるようにするコマンド ライン構文を定義する注釈が付けられます。
- CTM で始まるプロシージャ呼び出しは、 VME オペレーティング システムによって提供されるAPIである「コンパイラ ターゲット マシン」への呼び出しです。
- 「JSV」は「ジョブ スペース変数」を意味し、VME の環境変数の用語であり、CTM_JS_READ の呼び出しにより変数の値が読み取られます。
- UNLESS は「そうでない場合」を意味し、ELSF は「そうでない場合」を意味します。
- LONG LONG WORDは、2900アーキテクチャでサポートされているネイティブ型である128ビット整数を宣言します。
- 処理の大部分は、同じモジュールにある別のプロシージャ KERMIT_SUPPORT に委任されます。これは、Unix システムの exec() 呼び出しと同様に、オペレーティング システムの CTM_JS_CALL を介して間接的に呼び出されます。これにより、致命的なエラーが発生した場合に、エラー処理が適切に行われ、リソースが整理されます。PDESC キーワードは「プロシージャ記述子」を構築します。基本的に、KERMIT_SUPPORT は、別の関数に引数として渡すことができるファーストクラス関数として扱われ、CTM_JS_CALL は、指定された引数を適切なエラー処理で呼び出す高階関数になります。
参考文献
- ^ Hünke, Horst (1981).ソフトウェアエンジニアリング環境(図解版). North-Holland Pub. Co. p. 83. ISBN 978-0-444-86133-7。
- ^ 「Kermit ソフトウェア ソースコード アーカイブ」。コロンビア大学の Kermit プロジェクト。2011 年 8 月 22 日。2013年3 月 1 日閲覧。
