S3(プログラミング言語)
| S3 | |
|---|---|
| パラダイム | 構造化された、命令形 |
| 開発者 | インターナショナル・コンピューターズ・リミテッド |
| 影響を受けた | |
| アルゴル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() バイト RVRVB_VALUE); モード KMT_PP_PACKET_STATISTICS_S は構造体です (INTINPUT_TOTAL、 出力合計);
最初の型は96バイトの配列です。次の2つはバイト配列への参照(ポインタ)です。KMT_MTM_VALUESは、様々な型を表現できる共用体型です。WORDは32ビットの符号なし整数、INTは32ビットの符号付き整数、LONGは64ビットであることに注意してください。共用体の最後のオプションはREF()REF()BYTEとマークされており、これはバイト配列へのポインタをメンバーとする配列へのポインタであることを意味します。
ここで宣言される最後の型は STRUCT、具体的には 2 つの整数を含むタプルです。
プログラムは、モジュールが依存する外部プロシージャを宣言することで続行されます。RESPONSEはエラー情報を含む戻り値を示します。
外部プロシージャ(応答)KMT_UI; 外部プロシージャ (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日閲覧。