S3 (język programowania)
Paradygmat | Zorganizowany , imperatywny |
---|---|
Deweloper | International Computers Limited |
Pod wpływem | |
ALGOL 68 |
S3 to ustrukturyzowany , imperatywny język programowania komputerowego wysokiego poziomu . Został opracowany przez brytyjską firmę International Computers Limited (ICL) dla komputerów mainframe z serii 2900 . Jest to systemowy język programowania ze składnią inspirowaną językiem ALGOL 68 , ale z typami danych i operatorami dostosowanymi do tych oferowanych przez serię 2900. Był to język implementacji systemu operacyjnego VME .
Przykład z adnotacjami
Rzadkim przykładem programu S3 dostępnego w domenie publicznej jest implementacja Kermita opracowana w Regionalnym Centrum Komputerowym Południowo-Zachodnich Uniwersytetów i zarchiwizowana w archiwum wdrożeń Kermit na Uniwersytecie Columbia . Poniższe przykłady to wybrane najważniejsze elementy modułu głównego (kmt_main_module).
Program rozpoczyna się identyfikacją modułu oraz komentarzami, które cytujemy w ramach podziękowania dla autorów:
MODUŁ KMT_MAIN_MODULE; @ Wersja 1.01 @ @ -------------------------------------------- ------------------@ @ @ @ @ @ ----- SWURCCVMEKERMIT ----- @ @ @ @ @ @ ----------------------------------------------------------- -------------------- @ @ @ @ @ @ Wersja 1.00 (luty 1986) @ @ @ @ Autorzy: Richard Andrews i David Lord, @ @ South West Universities Regionalne centrum komputerowe, @ @ Claverton Down, Bath BA2 7AY, Wielka Brytania @ @ @ @ @ @ --------------- ---------------------------------- @ @ @ @ @ @ Wersja 1.01 (październik 1986) @ @ @ @ Poprawki autorstwa: Dave Allum i David Lord, SWURCC. @ @ ------------------------------------------------ ---------------- @
Następnie wykonaj szereg „deklaracji trybu”. Tryb to termin Algol 68 określający typ.
TRYB KMT_BUFFER TO (96) BYTE; TRYB KMT_STRING TO REF()BAJT; TRYB KMT_WORD TO REF()BAJT; MODE KMT_MTM_VALUES IS ANY (LONG WORD LW_VALUE, LONG INT LI_VALUE, REF WORD RW_VALUE, REF INT RI_VALUE, REF LONG WORD RLW_VALUE, REF LONG INT RLI_VALUE, REF()BAJT RVB_VALUE, REF()REF()BAJT RVRVB_VALUE); TRYB KMT_PP_PACKET_STATISTICS_S TO STRUCT (INT INPUT_TOTAL, OUTPUT_TOTAL);
Pierwszy typ to tablica 96 bajtów; następne dwa to odniesienia (wskaźniki) do tablic bajtów. KMT_MTM_VALUES to typ unii umożliwiający pojawienie się wielu różnych typów. Zauważ, że WORD jest 32-bitową liczbą całkowitą bez znaku, INT jest 32-bitową liczbą całkowitą ze znakiem; LONG oznacza 64 bity. Ostatnia opcja w unii jest oznaczona jako REF()REF()BYTE, co oznacza, że jest wskaźnikiem do tablicy, której elementami są wskaźniki do tablic bajtów.
Ostatnim zadeklarowanym tutaj typem jest STRUCT, konkretnie krotka zawierająca dwie liczby całkowite.
Kontynuacja programu polega na zadeklarowaniu zewnętrznych procedur, od których zależy moduł. RESPONSE wskazuje wartość zwracaną zawierającą informacje o błędzie:
EXT PROC (ODPOWIEDŹ) KMT_UI; ZEW PROC (REF INT,INT,ODPOWIEDŹ) KMT_PH; EXT PROC (REF INT,REF INT,RESPONSE) KMT_PP_GET_PACKET, PROC (INT,INT,BOOL,RESPONSE) KMT_PP_SEND_PACKET, PROC (REF()BAJT,ODPOWIEDŹ) KMT_PP_BUILD_STRING_PACKET_DATA;
a także niektóre zmienne zewnętrzne:
EXT REF () BYTE KMT_VERSION; EXT REF BOOL ASG_ROUTE; EXT REF()KMT_MTM_VALUES KMT_MTM_AREA; EXT REF()BAJT MTM_TEXT; EXT REF INT MTM_TEXT_LEN; EXT REF ()REF ()BYTE MTM_RECALL_DATA;
Pozostała część programu składa się z wielu definicji procedur. Jeden z nich, który właściwie definiuje punkt wejścia do programu, jest przedstawiony tutaj:
STATYSTYKA GLOBALNA ( ) PROC KERMIT_THE_FROG JEST (( ) REF()BAJT OPCJA, ( ) REF()BYTE VME_FILE, ( ) REF()BAJT REM_PLIK, ( ) WYNIK ODPOWIEDZI): BEGIN ()BYTE JSV_NAME := "ASG"; @ uzyskać wartość dla ASG_ROUTE bool @ CTM_JS_READ(JSV_NAME,NIL,NIL,ASG_ROUTE,RC_IGNORED); IF RC_IGNORED NE 0 THEN ASG_ROUTE := FALSE FI; @ sprawdź odniesienia do parametrów (wartości parametrów zweryfikowane później): @ @ OPTION musi być w trybie REF () BYTE, nie może być ZLR ani NIL @ @ VME_FILE musi być w trybie REF () BYTE, może być ZLR, nie może być NIL @ @ REM_FILE musi być w trybie REF () BYTE, może być ZLR, nie może być NIL @ CHYBA (WERYFIKACJA OPCJI I WERYFIKACJA OPCJI) ORAZ (WERYFIKACJA PLIKU_VME ORAZ (WERYFIKACJA PLIKU_VME LUB NIE(PLIK_VME JEST NIL))) ORAZ (WERYFIKACJA PLIKU_REM I (VALIDR REM_FILE OR NOT (REM_FILE IS NIL))) THEN @ nieprawidłowe odwołanie do parametru @ WYNIK := 10002 @ ARCH_INACCESSIBLE_PARAMETER @ ELSF @ utworzenie bloku zasobów @ CTM_JS_BEGIN(RESULT); WYNIK <= 0 WTEDY @ utworzony blok zasobów @ LONG LONG WORD KERMIT_RESULT; DOWOLNE((3)DŁUGIE SŁOWO AS_LW,(6) SŁOWO AS_W) PARAM. PARAMS.AS_LW := (OPCJA BDESC, PLIK_BDESC VME, PLIK_REM BDESC); @ ustawić obsługę błędów programu @ IF KMT_EH_INFORM_PE_CONTINGENCY(RESULT); WYNIK > 0 TO @ nie udało się ustawić obsługi błędów @ SKIP ELSF CTM_JS_CALL(NIL,PDESC KERMIT_SUPPORT,PARAMS.AS_W,KERMIT_RESULT, RESULT); @ utwórz zaporę ogniową @ WYNIK <= 0 TO @ zakończono normalnie lub przez CTM_STOP @ WYNIK := JEŻELI (S'S'KERMIT_RESULT) <= 0 TO 0 @ zignoruj ostrzeżenia @ ELSE 52000 @ błąd zwróć wspólny kod wyniku @ FI FI; CTM_JS_END(RC_IGNORED) @ koniec bloku zasobów @ FI END
Funkcje, na które należy zwrócić uwagę, obejmują:
- Deklaracja procedury jest ozdobiona adnotacjami, które definiują składnię wiersza poleceń pozwalającą na wywołanie programu z SCL lub użycie z interaktywnej powłoki z pytaniem o domyślne wartości parametrów.
- Wywołania procedur z prefiksem CTM to wywołania „Compiler Target Machine”, interfejsu API oferowanego przez system operacyjny VME.
- „JSV” oznacza „zmienną przestrzeni zadań”, termin VME dla zmiennej środowiskowej, a wywołanie CTM_JS_READ odczytuje wartość zmiennej.
- JEŚLI NIE oznacza „jeśli nie”; ELSF oznacza „jeżeli inaczej”.
- LONG LONG WORD deklaruje 128-bitową liczbę całkowitą, która jest typem natywnym obsługiwanym przez architekturę 2900
- Większość przetwarzania jest delegowana do innej procedury, KERMIT_SUPPORT, którą można znaleźć w tym samym module. Jest to wywoływane pośrednio przez system operacyjny CTM_JS_CALL, podobnie jak wywołanie exec() w systemach Unix; zapewnia to czystą obsługę awarii i uporządkowanie wszelkich zasobów w przypadku błędu krytycznego. Słowo kluczowe PDESC konstruuje „deskryptor procedury”: zasadniczo traktuje KERMIT_SUPPORT jako funkcję pierwszej klasy, którą można przekazać jako argument innej funkcji, czyniąc CTM_JS_CALL funkcją wyższego rzędu, która wywołuje dostarczony argument z odpowiednią obsługą błędów.