S3 es un lenguaje de programación de alto nivel , estructurado e imperativo . [ 1 ] Fue desarrollado por la empresa británica International Computers Limited (ICL) para sus mainframes de la serie 2900. Es un lenguaje de programación de sistemas con una sintaxis influenciada por ALGOL 68 , pero con tipos de datos y operadores alineados con los ofrecidos por la serie 2900. Fue el lenguaje de implementación del sistema operativo VME .
Ejemplo anotado
Un ejemplo poco común de un programa S3 disponible en el dominio público es la implementación de Kermit desarrollada en el Centro Regional de Computación de las Universidades del Sudoeste y archivada en el archivo de implementaciones de Kermit de la Universidad de Columbia . [ 2 ] Los ejemplos que se muestran a continuación son aspectos destacados del módulo principal (kmt_main_module).
El programa comienza con la identificación de un módulo y unos comentarios que citamos a modo de agradecimiento a los autores:
MÓDULO KMT_MAIN_MODULE; @ Versión 1.01 @ @------------------------------------------------------------------------------@ @ @ @ @ @ ----- SWURCCVMEKERMIT ----- @ @ @ @ @ @ ---------------------------------------------------------------- @ @ @ @ @ @ Versión 1.00 (febrero de 1986) @ @ @ @ Escrito por: Richard Andrews y David Lord, @ @ Centro Regional de Informática de las Universidades del Suroeste, @ @ Claverton Down, Bath BA2 7AY, Reino Unido @ @ @ @ @ @ ---------------------------------------------------------------- @ @ @ @ @ @ Versión 1.01 (octubre de 1986) @ @ @ @ Correcciones realizadas por: Dave Allum y David Lord, SWURCC. @ @ ---------------------------------------------------------------- @
A continuación se presentan varias "declaraciones de modo". Modo es el término que utiliza Algol 68 para referirse a un tipo.
MODO KMT_BUFFER ES (96)BYTES; MODO KMT_STRING ES REF()BYTE; MODO KMT_WORD ES REF()BYTE; MODO KMT_MTM_VALUES ES CUALQUIERA (VALOR LW_PALABRA LARGA, VALOR_LI_INT LARGO, REF PALABRA RW_VALUE, REF INT RI_VALUE, REF PALABRA LARGA VALOR RLW, REF LARGO INT RLI_VALUE, REF()BYTE VALOR_RVB, REF()REF()BYTE RVRVB_VALUE); MODO KMT_PP_PACKET_STATISTICS_S ES ESTRUCTURA (INT ENTRADA_TOTAL, SALIDA_TOTAL);
El primer tipo es una matriz de 96 bytes; los dos siguientes son referencias (punteros) a matrices de bytes. KMT_MTM_VALUES es un tipo de unión que permite la aparición de diversos tipos. Cabe destacar que WORD es un entero sin signo de 32 bits , INT es un entero con signo de 32 bits; LONG lo convierte en un entero de 64 bits. La última opción de la unión está marcada como REF()REF()BYTE, lo que significa que es un puntero a una matriz cuyos miembros son punteros a matrices de bytes.
El tipo final declarado aquí es una ESTRUCTURA, específicamente una tupla que contiene dos números enteros.
El programa continúa declarando procedimientos externos de los que depende el módulo. RESPONSE indica un valor de retorno que contiene información de error:
PROCEDIMIENTO EXT (RESPUESTA) KMT_UI; PROCEDIMIENTO EXT (REF INT,INT,RESPUESTA) KMT_PH; PROCEDIMIENTO EXT (REF INT,REF INT,RESPUESTA) KMT_PP_GET_PACKET, PROC (INT,INT,BOOL,RESPONSE) KMT_PP_SEND_PACKET, PROC (REF()BYTE,RESPONSE) KMT_PP_BUILD_STRING_PACKET_DATA;
y también algunas variables externas:
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;
El resto del programa consta de varias definiciones de procedimientos. Una de ellas, que define el punto de entrada al programa, se reproduce a continuación:
GLOBAL STATIC (<STATUS 5;PSPACE 10001; TEMPLATE>) PROC KERMIT_THE_FROG IS ((<LIT "COMANDO">) OPCIÓN DE BYTE REF(), (<LIT "" >) REF()BYTE VME_FILE, (<LIT "" >) REF()BYTE REM_FILE, (<RESPUESTA CLAVE;DEF N'RESULTADO>) RESULTADO DE LA RESPUESTA): COMENZAR ()BYTE JSV_NAME := "ASG"; @ obtener valor para ASG_ROUTE bool @ CTM_JS_READ(JSV_NAME,NIL,NIL,ASG_ROUTE,RC_IGNORED); SI RC_IGNORED NE 0 ENTONCES ASG_ROUTE := FALSE FI; @ verificar referencias de parámetros (valores de parámetros validados posteriormente): @ @ La OPCIÓN debe ser de modo REF () BYTE, no puede ser ZLR ni NIL @ @ VME_FILE debe ser de modo REF () BYTE, puede ser ZLR, no debe ser NIL @ @ REM_FILE debe ser de modo REF () BYTE, puede ser ZLR, no debe ser NIL @ A MENOS QUE (VERIFIQUE LA OPCIÓN Y VALIDR LA OPCIÓN) Y (VERIFICAR VME_FILE Y (VALIDAR VME_FILE O NO (VME_FILE ES NULO))) Y (VERIFICAR REM_FILE Y (VALIDAR REM_FILE O NO(REM_FILE ES NULO))) ENTONCES @ referencia de parámetro no válida @ RESULTADO := 10002 @ ARCH_INACCESSIBLE_PARAMETER @ ELSF @ crear bloque de recursos @ CTM_JS_BEGIN(RESULTADO); RESULTADO <= 0 ENTONCES @ bloque de recursos creado @ PALABRA LARGA, LARGA, KERMIT_RESULTADO; CUALQUIER((3)PALABRA LARGA COMO_LW,(6) PALABRA COMO_W) PARÁMETROS; PARAMS.AS_LW := (BDESC OPTION,BDESC VME_FILE,BDESC REM_FILE); @ configurar el manejador de errores del programa @ SI KMT_EH_INFORM_PE_CONTINGENCY(RESULTADO); RESULTADO > 0 ENTONCES @ no se pudo establecer el controlador de errores @ SALTAR ELSF CTM_JS_CALL(NIL,PDESC KERMIT_SUPPORT,PARAMS.AS_W,KERMIT_RESULT, RESULTADO); @ crear cortafuegos @ RESULTADO <= 0 ENTONCES @ salió normalmente o a través de CTM_STOP @ RESULTADO := SI (S'S'KERMIT_RESULTADO) <= 0 ENTONCES 0 @ ignorar advertencias @ ELSE 52000 @ error return common resultcode @ FI FI; CTM_JS_END(RC_IGNORED) @ fin del bloque de recursos @ FI FIN
Entre las características a destacar se incluyen:
- La declaración del procedimiento está decorada con anotaciones que definen una sintaxis de línea de comandos que permite llamar al programa desde SCL o usarlo desde un intérprete de comandos interactivo con solicitud de valores de parámetros predeterminados.
- Las llamadas a procedimientos con el prefijo CTM son llamadas a la "Compiler Target Machine", una API ofrecida por el sistema operativo VME.
- "JSV" significa "variable de espacio de trabajo", término que utiliza VME para referirse a una variable de entorno , y la llamada a CTM_JS_READ lee el valor de dicha variable.
- A MENOS significa "si no"; ELSF significa "si no".
- LONG LONG WORD declara un entero de 128 bits , que es un tipo nativo compatible con la arquitectura 2900.
- La mayor parte del procesamiento se delega a otro procedimiento, KERMIT_SUPPORT, que se encuentra en el mismo módulo. Este se llama indirectamente a través de la función CTM_JS_CALL del sistema operativo, de forma similar a una llamada exec() en sistemas Unix; esto garantiza un manejo adecuado de los errores y la liberación de los recursos en caso de un error fatal. La palabra clave PDESC construye un "descriptor de procedimiento": esencialmente, trata a KERMIT_SUPPORT como una función de primera clase que se puede pasar como argumento a otra función, convirtiendo a CTM_JS_CALL en una función de orden superior que llama al argumento proporcionado con el manejo de errores apropiado.
Referencias
- dialecto ALGOL 68
- Lenguajes de programación ICL