S3 (язык программирования)
Парадигма | Структурированный , императивный |
---|---|
Разработчик | Интернэшнл Компьютерс Лимитед |
Под влиянием | |
АЛГОЛ 68 |
S3 — структурированный , императивный высокого уровня язык программирования . [1] Он был разработан британской компанией International Computers Limited (ICL) для своих мэйнфреймов серии 2900 . Это язык системного программирования , синтаксис которого основан на АЛГОЛе 68, но типы данных и операторы соответствуют тем, которые предлагаются в серии 2900. Это был язык реализации операционной системы VME .
Аннотированный пример
[ редактировать ]Редким примером программы S3, доступной в открытом доступе, является реализация Kermit, разработанная в Региональном компьютерном центре Юго-Западного университета и заархивированная в Колумбийского университета . архиве реализаций Kermit [2] В приведенных ниже примерах показаны основные моменты основного модуля (kmt_main_module).
Программа начинается с идентификации модуля и комментариев, которые мы цитируем в знак признательности авторам:
MODULE KMT_MAIN_MODULE; @ Version 1.01 @ @------------------------------------------------------------------------------@ @ @ @ @ @ ----- S W U R C C V M E K E R M I T ----- @ @ @ @ @ @ ---------------------------------------------------------------- @ @ @ @ @ @ Version 1.00 (February 1986) @ @ @ @ Written by : Richard Andrews and David Lord, @ @ South West Universities Regional Computer Centre, @ @ Claverton Down, Bath BA2 7AY, U.K. @ @ @ @ @ @ ---------------------------------------------------------------- @ @ @ @ @ @ Version 1.01 (October 1986) @ @ @ @ Fixes by : Dave Allum and David Lord, SWURCC. @ @ ---------------------------------------------------------------- @
Далее следует ряд «объявлений режима». Режим — это термин Алгола 68 для обозначения типа.
MODE KMT_BUFFER IS (96)BYTE; MODE KMT_STRING IS REF()BYTE; MODE KMT_WORD IS REF()BYTE; 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()BYTE RVB_VALUE, REF()REF()BYTE RVRVB_VALUE); MODE KMT_PP_PACKET_STATISTICS_S IS STRUCT (INT INPUT_TOTAL, OUTPUT_TOTAL);
Первый тип — это массив из 96 байт; следующие два — это ссылки (указатели) на массивы байтов. KMT_MTM_VALUES — это тип объединения, позволяющий использовать множество различных типов. Обратите внимание, что WORD — 32-битное целое число без знака, INT — 32-битное целое число со знаком; LONG делает его 64-битным. Последний параметр в объединении помечен REF()REF()BYTE, что означает, что он является указателем на массив, члены которого являются указателями на массивы байтов.
Последний объявленный здесь тип — это STRUCT, а именно кортеж, содержащий два целых числа.
Программа продолжается объявлением внешних процедур, от которых зависит модуль. RESPONSE указывает возвращаемое значение, содержащее информацию об ошибке:
EXT PROC (RESPONSE) KMT_UI; EXT PROC (REF INT,INT,RESPONSE) KMT_PH; EXT PROC (REF INT,REF INT,RESPONSE) 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 () BYTE KMT_VERSION; EXT REF BOOL ASG_ROUTE; EXT REF()KMT_MTM_VALUES KMT_MTM_AREA; EXT REF()BYTE MTM_TEXT; EXT REF INT MTM_TEXT_LEN; EXT REF ()REF ()BYTE MTM_RECALL_DATA;
Остальная часть программы состоит из ряда определений процедур. Один из них, который фактически определяет точку входа в программу, воспроизведен здесь:
GLOBAL STATIC (<STATUS 5;PSPACE 10001; TEMPLATE>) PROC KERMIT_THE_FROG IS ((<LIT "COMMAND">) REF()BYTE OPTION, (<LIT "" >) REF()BYTE VME_FILE, (<LIT "" >) REF()BYTE REM_FILE, (<KEY RESPONSE;DEF N'RESULT>) RESPONSE RESULT): BEGIN ()BYTE JSV_NAME := "ASG"; @ obtain value for ASG_ROUTE bool @ CTM_JS_READ(JSV_NAME,NIL,NIL,ASG_ROUTE,RC_IGNORED); IF RC_IGNORED NE 0 THEN ASG_ROUTE := FALSE FI; @ verify parameter references (parameter values validated later): @ @ OPTION must be of mode REF () BYTE, may not be ZLR or NIL @ @ VME_FILE must be of mode REF () BYTE, may be ZLR, must not be NIL @ @ REM_FILE must be of mode REF () BYTE, may be ZLR, must not be NIL @ UNLESS (VERIFY OPTION AND VALIDR OPTION) AND (VERIFY VME_FILE AND (VALIDR VME_FILE OR NOT(VME_FILE IS NIL))) AND (VERIFY REM_FILE AND (VALIDR REM_FILE OR NOT(REM_FILE IS NIL))) THEN @ invalid parameter reference @ RESULT := 10002 @ ARCH_INACCESSIBLE_PARAMETER @ ELSF @ create resource block @ CTM_JS_BEGIN(RESULT); RESULT <= 0 THEN @ resource block created @ LONG LONG WORD KERMIT_RESULT; ANY((3)LONG WORD AS_LW,(6) WORD AS_W) PARAMS; PARAMS.AS_LW := (BDESC OPTION,BDESC VME_FILE,BDESC REM_FILE); @ set up program error handler @ IF KMT_EH_INFORM_PE_CONTINGENCY(RESULT); RESULT > 0 THEN @ failed to set error handler @ SKIP ELSF CTM_JS_CALL(NIL,PDESC KERMIT_SUPPORT,PARAMS.AS_W,KERMIT_RESULT, RESULT); @ create firewall @ RESULT <= 0 THEN @ either exited normally or via CTM_STOP @ RESULT := IF (S'S'KERMIT_RESULT) <= 0 THEN 0 @ ignore warnings @ ELSE 52000 @ error return common resultcode @ FI FI; CTM_JS_END(RC_IGNORED) @ end resource block @ FI END
Здесь следует отметить следующие особенности:
- Объявление процедуры дополнено аннотациями, которые определяют синтаксис командной строки, позволяющий вызывать программу из SCL или использовать из интерактивной оболочки с запросом значений параметров по умолчанию.
- Вызовы процедур с префиксом CTM — это вызовы «Целевой машины компилятора», API, предлагаемого операционной системой VME.
- «JSV» означает «переменная пространства задания», термин VME для переменной среды, а вызов CTM_JS_READ считывает значение этой переменной.
- UNLESS означает «если нет»; ELSF означает «иначе, если».
- LONG LONG WORD объявляет 128-битное целое число, которое является собственным типом, поддерживаемым архитектурой 2900.
- Основная часть обработки делегируется другой процедуре KERMIT_SUPPORT, которую можно найти в том же модуле. Он вызывается косвенно через операционную систему CTM_JS_CALL, аналогично вызову exec() в системах Unix; это обеспечивает чистую обработку сбоев и очистку любых ресурсов в случае фатальной ошибки. Ключевое слово PDESC создает «дескриптор процедуры»: по сути, оно рассматривает KERMIT_SUPPORT как функцию первого класса, которую можно передать в качестве аргумента другой функции, что делает CTM_JS_CALL функцией более высокого порядка, которая вызывает предоставленный ей аргумент с соответствующей обработкой ошибок.
Ссылки
[ редактировать ]- ^ Хюнке, Хорст (1981). Среды программной инженерии (иллюстрированное ред.). Северо-Голландский паб. Компания р. 83. ИСБН 978-0-444-86133-7 .
- ^ «Архив исходного кода программного обеспечения Kermit» . Проект Кермита Колумбийского университета. 22 августа 2011 года . Проверено 1 марта 2013 г.