Articulo de referencia

Systems Programming Language

Systems Programming Language , often shortened to SPL but sometimes known as SPL/3000 , was a procedurally-oriented programming language written by Hewlett-Packard for the HP 30...

Systems Programming Language, often shortened to SPL but sometimes known as SPL/3000, was a procedurally-orientedprogramming language written by Hewlett-Packard for the HP 3000minicomputer line and first introduced in 1972. SPL was used to write the HP 3000's primary operating system, Multi-Programming Executive (MPE). Similar languages on other platforms were generically referred to as system programming languages, confusing matters.

Originally known as Alpha Systems Programming Language, named for the development project that produced the 3000-series, SPL was designed to take advantage of the Alpha's stack-based processor design. It is patterned on ESPOL, a similar ALGOL-derived language used by the Burroughs B5000mainframe systems, which also influenced a number of 1960s languages like PL360 and JOVIAL.

Through the mid-1970s, the success of the HP systems produced a number of SPL offshoots. Examples include ZSPL for the Zilog Z80 processor, and Micro-SPL for the Xerox Alto. The latter inspired Action! for Atari 8-bit computers, which was fairly successful. The latter more closely followed Pascal syntax, losing some of SPL's idiosyncrasies.

SPL was widely used during the lifetime of the original 16-bit version of the HP 3000 platform. In the 1980s, the HP 3000 and MPE were reimplemented in an emulator running on the PA-RISC-based HP 9000 platforms. HP promoted Pascal as the favored system language on PA-RISC and did not provide an SPL compiler. This caused code maintenance concerns, and 3rd party SPL compilers were introduced to fill this need.

History

Hewlett-Packard presentó sus primeras minicomputadoras , la serie HP 2100 , en 1967. Originalmente, estas máquinas habían sido diseñadas por un equipo externo que trabajaba para Union Carbide y estaban destinadas principalmente a aplicaciones de control industrial integrado, no al mercado general de procesamiento de datos. HP vio en esto una integración natural con su negocio de instrumentación existente y, en un principio, se las ofreció a esos usuarios. A pesar de ello, HP descubrió que la relación precio/rendimiento de la máquina les estaba brindando un éxito cada vez mayor en el mercado empresarial. [ 1 ] [ 2 ]

Durante este período, el concepto de tiempo compartido se popularizó, especialmente a medida que los costos de la memoria principal disminuían y los sistemas comenzaban a incluir más memoria. En 1968, HP presentó un sistema integrado que utilizaba dos máquinas de la serie 2100 con HP Time-Shared BASIC , el cual proporcionaba un sistema operativo completo , así como el lenguaje de programación BASIC . Estos sistemas de dos máquinas, conocidos colectivamente como HP 2000, fueron un éxito inmediato. [ 3 ] HP BASIC fue muy influyente durante muchos años, y su sintaxis se puede observar en varios BASIC para microcomputadoras , incluyendo Palo Alto TinyBASIC , Integer BASIC , North Star BASIC , Atari BASIC y otros.

Los diseñadores de HP comenzaron a preguntarse: «Si podemos producir un sistema de tiempo compartido tan bueno usando una computadora tan rudimentaria como la 2116, ¿qué podríamos lograr si diseñáramos nuestra propia computadora?». [ 4 ] Con este fin, en 1968 la compañía comenzó a formar un equipo más grande para diseñar una nueva arquitectura de tamaño mediano. Entre los nuevos miembros del equipo se encontraban quienes habían trabajado en sistemas centrales de Burroughs e IBM , y los conceptos resultantes guardaban un gran parecido con el exitoso sistema Burroughs B5000 . El B5000 utilizaba un procesador de máquina de pila que simplificaba la implementación de la multiprogramación , y HP seleccionó esta misma arquitectura para el nuevo concepto. [ 5 ]

Se consideraron dos implementaciones: una máquina de 32 bits a escala de mainframe conocida como Omega y un diseño de 16 bits conocido como Alpha. Casi todos los esfuerzos se centraron en Omega, pero en junio de 1970, Omega fue cancelada. Esto llevó a un rediseño exhaustivo de Alpha para diferenciarla de la serie 2100, y finalmente surgió con planes para un diseño de sistema operativo aún más agresivo. Omega estaba diseñada para ejecutarse en modo por lotes y utilizar una computadora más pequeña, la "interfaz", para procesar las interacciones con el usuario. Este era el mismo concepto operativo que la serie 2000. Sin embargo, otra serie 2000 no sería suficiente para Alpha, y se decidió tener un único sistema operativo para operaciones por lotes, interactivas e incluso en tiempo real . [ 5 ]

Para que esto funcionara, se necesitaba un diseño de bus de computadora avanzado con acceso directo a memoria (DMA) extenso y un sistema operativo (SO) avanzado para proporcionar respuestas rápidas a las acciones del usuario. El B5000 también fue único, para su época, en el sentido de que su sistema operativo y utilidades principales estaban programados en un lenguaje de alto nivel , ESPOL . ESPOL era un derivado del lenguaje ALGOL adaptado para funcionar en el B5000, un concepto que fue muy influyente en la década de 1960 y dio lugar a nuevos lenguajes como JOVIAL , PL/360 y BCPL . El equipo de HP decidió que también usarían un lenguaje derivado de ALGOL para el desarrollo de sus sistemas operativos. El lenguaje similar de HP se conocía inicialmente como Alpha Systems Programming Language. [ 5 ]

El desarrollo de Alpha duró varios años antes de su aparición en 1972 como la HP 3000. La máquina estuvo en el mercado solo unos meses antes de que quedara claro que simplemente no funcionaba correctamente, y HP se vio obligada a retirar todas las unidades 3000 ya vendidas. Se reintrodujo a finales de 1973 con la mayoría de sus problemas solucionados. Una importante actualización de todo el sistema, la máquina CX y el MPE-C para ejecutarlo, renovaron su imagen y la 3000 se convirtió en otro gran éxito durante la segunda mitad de la década de 1970. [ 5 ]

Este éxito hizo que SPL se extendiera casi tanto como BASIC de la serie 2000, y al igual que ese lenguaje, SPL dio lugar a varias versiones para otras plataformas. Entre ellas destaca Micro-SPL, una versión escrita para la estación de trabajo Xerox Alto . Esta máquina había utilizado originalmente BCPL como su lenguaje principal, pero la insatisfacción con su rendimiento llevó a Henry Baker a diseñar un lenguaje no recursivo que implementó con Clinton Parker en 1979. [ 6 ] Posteriormente, Clinton modificó Micro-SPL para producir Action! para ordenadores Atari de 8 bits en 1983. [ 7 ]

HP reimplementó el sistema HP 3000 en el chipset PA-RISC, ejecutando una nueva versión del sistema operativo conocida como MPE/iX. MPE/iX tenía dos modos: en "modo nativo", ejecutaba aplicaciones que habían sido recompiladas para PA-RISC utilizando compiladores Pascal más recientes, mientras que en "modo compatible", podía ejecutar todo el software existente mediante emulación. HP no proporcionó un compilador en modo nativo para MPE/iX, por lo que no fue un proceso sencillo migrar el software existente a la nueva plataforma. Para cubrir esta necesidad, Allegro Consultants desarrolló un lenguaje compatible con SPL llamado "SPLash!" que podía compilarse a código original de HP 3000 para ejecutarse dentro del emulador, o a modo nativo. Esto ofreció una vía de portabilidad para el software SPL existente. [ 8 ]

Idioma

Sintaxis básica

SPL generalmente sigue las convenciones de sintaxis de ALGOL 60 y resultará familiar para cualquiera con experiencia en ALGOL o sus descendientes, como Pascal y Modula-2 . Al igual que en esos lenguajes, las instrucciones de programa pueden abarcar varias líneas físicas y terminar con un punto y coma. Los comentarios se indican con la COMMENTpalabra clave `comment` o encerrando el texto del comentario entre `<<` y `>>`. [ 9 ]

Las instrucciones se agrupan en bloques usando BEGIN y END, aunque, como en Pascal, el END de un programa debe ir seguido de un punto. El programa en su conjunto está rodeado por BEGIN y END, de forma similar a Pascal, pero sin la palabra clave PROGRAM o una instrucción similar al principio. [ 10 ] La razón de esto es que SPL permite que cualquier bloque de código se use como un programa independiente o se compile en otro programa para que actúe como una biblioteca. La creación de código como programa o subprograma no formaba parte del lenguaje en sí, sino que se gestionaba colocando la $CONTROL SUBPROGRAMdirectiva del compilador al principio del archivo. [ 11 ]

El lenguaje proporcionó la INTRINSICpalabra clave para facilitar la declaración de procedimientos externos, evitando así que el programador tuviera que declarar los tipos y el orden de los parámetros del procedimiento. Todas las declaraciones de servicios del sistema accesibles para el usuario (como el sistema de archivos, la gestión de procesos, las comunicaciones, etc.) estaban disponibles a través de este mecanismo, y los usuarios también podían añadir sus propias declaraciones de procedimientos a la INTRINSIClista del sistema. Esto es similar al mecanismo #include del lenguaje C, pero más refinado y de alcance más limitado.

A diferencia de Pascal, donde PROCEDUREy FUNCTIONeran conceptos separados, SPL utiliza un enfoque más parecido a C,PROCEDURE donde a cualquier se le puede anteponer un tipo para convertirlo en una función. De acuerdo con la sintaxis de otros lenguajes tipo ALGOL, los tipos de los parámetros se listaban después del nombre, no como parte de él. Por ejemplo: [ 12 ]

PROCEDIMIENTO DE ENTEROS HECHO(N); VALOR N; ENTERO N; 

Declara una función FACT que toma un valor N que es un entero. Esto VALUEindica que esta variable es "paso por valor" y, por lo tanto, los cambios que se realicen en ella dentro del procedimiento no serán visibles para quien la llama. [ 13 ] El procedimiento establece su valor de retorno mediante una instrucción de asignación a su nombre:

HECHO := expresión; 

Aunque no era bien visto, ALGOL y Pascal permitían etiquetar el código usando un nombre inicial que terminaba con dos puntos, el cual podía usarse para el destino de bucles y GO TOsentencias. Una pequeña diferencia es que SPL requería que los nombres de las etiquetas se declararan en la sección de variables usando la LABELpalabra clave. [ 14 ]

SPL amplió este concepto con la ENTRYinstrucción que permitía definir estas etiquetas como "puntos de entrada" accesibles desde la línea de comandos. Las etiquetas nombradas en la(s) instrucción(es) de entrada se exponían al sistema operativo y podían llamarse desde el comando RUN. Por ejemplo, se podía escribir un programa con funciones de cadena para convertir a mayúsculas o minúsculas, y luego proporcionar puntos de entrada para ambas. Esto podía llamarse desde la línea de comandos como RUN $STRINGS,TOUPPER. [ 15 ]

Tipos de datos

Donde SPL difiere más notablemente de ALGOL es que sus tipos de datos son muy específicos de la máquina, basados ​​en el formato de palabra big-endian de 16 bits de la serie 3000. [ 10 ]

El INTEGERtipo es un tipo con signo de 16 bits, con 15 bits de valor y el bit menos significativo como signo. DOUBLEes un entero de 32 bits, no un tipo de punto flotante. REALes un valor de punto flotante de 32 bits con 22 bits para la mantisa y 9 para el exponente, mientras que LONGes un valor de punto flotante de 64 bits con 54 bits de mantisa y 9 bits de exponente. [ 16 ]

BYTEse utiliza para el procesamiento de caracteres, que consiste en una palabra de máquina de 16 bits que contiene un único carácter de 8 bits en los bits menos significativos. Los arreglos de tipo BYTE empaquetan dos caracteres de 8 bits por palabra de máquina de 16 bits. LOGICALes un tipo entero sin signo de 16 bits que, cuando se utiliza en una expresión condicional, devuelve verdadero si el bit menos significativo es 1 y falso en caso contrario. Se puede realizar aritmética de enteros sin signo en datos LOGICAL y se ignora cualquier desbordamiento. No hay un equivalente de un PACKEDmodificador como el que se encuentra en Pascal, por lo que LOGICALes algo derrochador de memoria [ 17 ] cuando se utiliza solo para almacenar un único dígito binario, aunque SPL ofrece manipulación de cadenas de bits como alternativa.

Al igual que en C, los datos son de tipo débil , las ubicaciones de memoria y el almacenamiento de variables son conceptos interrelacionados, y se puede acceder a los valores directamente a través de sus ubicaciones. Por ejemplo, el código:

NÚMERO ENTERO A, B, C LÓGICO D=A+2 

define tres variables enteras de 16 bits, A, B y C, y luego un valor lógico, también de 16 bits. El =, como en Pascal, significa "es equivalente a", no "obtiene el valor de", que se usa :=en lenguajes tipo Algol. Así que la segunda línea dice "declara una variable D que esté en la misma ubicación de memoria que A+2", que en este caso es también la ubicación de la variable C. Esto permite que el mismo valor se lea como un entero a través de C o un valor lógico a través de D. [ 18 ]

Esta sintaxis puede parecer extraña para los lectores modernos, donde la memoria generalmente se considera una caja negra , pero tiene varios usos importantes en la programación de sistemas, donde ubicaciones de memoria específicas almacenan valores del hardware subyacente. En particular, permite definir una variable que apunta al inicio de una tabla de valores y, a continuación, declarar variables adicionales que apuntan a valores individuales dentro de la tabla. Si la ubicación de la tabla cambia, solo es necesario modificar un único valor, la dirección inicial, y todas las variables individuales se actualizarán automáticamente en sus desplazamientos relativos correspondientes. [ 18 ]

Los punteros se declaraban agregando el POINTERmodificador a cualquier declaración de variable, y la ubicación de memoria de una variable desreferenciada con @. Así, INTEGER POINTER P:=@Adeclara un puntero cuyo valor contiene la dirección de la variable A, no el valor de A. [ 19 ]@ se puede usar en cualquiera de los lados de la asignación; @P:=Acoloca el valor de A en P, lo que probablemente resulta en un puntero colgante , @P:=@Ahace que P apunte a A, mientras que P:=Acoloca el valor de A en la ubicación a la que apunta actualmente P. [ 20 ]

De manera similar, SPL incluye soporte para matrices tipo C en el que la variable de índice es un desplazamiento de número de palabras desde la ubicación de memoria establecida para la variable inicial. A diferencia de C, SPL solo proporcionaba matrices unidimensionales y usaba paréntesis en lugar de corchetes. [ 21 ] Las variables también podían declararse GLOBAL, en cuyo caso no se reservaba memoria local para ellas y se asumía que el almacenamiento se declaraba en otra biblioteca. [ 22 ] Esto refleja la externpalabra clave en C.

Los literales se pueden especificar con varios sufijos, y aquellos sin sufijo se asumen como INTEGER. Por ejemplo, 1234se interpretaría como un INTEGER, mientras 1234Dque era un DOUBLE. Edenotaba un REALy Lun LONG. [ 23 ] Las constantes de cadena se delimitaban con comillas dobles, y las comillas dobles dentro de una línea se escapaban con una segunda comilla doble. [ 24 ]

Las declaraciones de variables podían usar constantes para definir un valor inicial, como en INTEGER A:=10. Nótese el uso de assign-to en lugar de is-a. Además, SPL tenía una EQUATEpalabra clave que permitía definir una cadena de texto como una variable y luego reemplazaba cualquier instancia de esa variable en el código con la cadena literal durante la compilación. [ 25 ] Esto es similar a la constpalabra clave en C.

Segmentación de la memoria

El clásico HP 3000 organizaba la memoria física en 1, 2, 4, 8 o 16 bancos de 64K (65536) palabras de 16 bits (128K bytes). El código (compartido, no modificable) y los datos estaban separados y se almacenaban en segmentos de longitud variable de hasta 32K palabras cada uno. Dentro de un proceso, las direcciones de datos, como los punteros, eran desplazamientos de 16 bits desde un registro base (conocido como DB), o desplazamientos relativos desde un registro de puntero (Q o S) que resultaban en una dirección válida dentro del área de datos del proceso (llamada pila). Si bien estaba orientado principalmente a palabras de 16 bits, el sistema admitía el direccionamiento de bytes individuales en una matriz utilizando la dirección de palabra donde se almacenaba el byte, desplazada 1 bit a la izquierda y sumando 0 para acceder al byte superior, o 1 para el byte inferior. Por lo tanto, las direcciones de byte eran separadas y distintas de las direcciones de palabra, y la interpretación de una dirección era puramente contextual. Esto resultó bastante problemático y fue la causa de numerosos errores tanto en el código del sistema como en el del usuario. Era necesario tener cuidado al tratar las direcciones de bytes como valores sin signo de 16 bits (es decir, de tipo LOGICAL) al utilizarlas, por ejemplo, en cálculos de longitud, ya que de lo contrario una dirección de byte de 2^16 o superior se trataría como un valor con signo en complemento a dos, lo que daría lugar a cálculos erróneos de longitudes o desplazamientos.

Cada proceso individual tenía acceso a hasta 254 segmentos de código de hasta 32 000 palabras cada uno. Estos segmentos se dividían en dos dominios: los primeros 191 eran segmentos de "sistema", compartidos por todos los procesos, y los 63 restantes eran segmentos de "usuario", compartidos por todos los procesos que ejecutaban el mismo programa. La transferencia de control especificaba un número de rutina dentro del segmento actual, o bien un número de segmento externo y un número de rutina dentro del mismo. Una pequeña tabla al final del segmento proporcionaba la dirección del punto de entrada de la rutina.

El código de un proceso operaba sobre los datos en la pila, un único segmento privado de hasta 32 KB. A diferencia de las pilas en otras arquitecturas, la pila del HP 3000 se utilizaba para variables globales de proceso, preservación de estado, variables locales de procedimiento (que admitían llamadas anidadas y reentrada) y cálculo/evaluación numérica. El sistema operativo proporcionaba acceso a segmentos de datos adicionales basados ​​en memoria (fuera de la pila), pero estos no eran direccionados de forma nativa por el conjunto de instrucciones, por lo que el programa era responsable de mover los datos desde y hacia dichos "segmentos de datos adicionales" según fuera necesario.

SPL incluía diversos sistemas de soporte para permitir la fácil segmentación de programas y, posteriormente, hacer que dicha segmentación resultara prácticamente invisible en el código. El mecanismo principal consistía en utilizar la $CONTROL SEGMENT=asegmentnamedirectiva del compilador , que definía en qué segmento debía ubicarse el código siguiente. El valor predeterminado era MAINLINESEG, pero el programador podía añadir cualquier número de segmentos adicionales con nombre para organizar el código en bloques. [ 26 ]

Otras características

SPL incluía una función de "extracción de bits" que permitía una manipulación de bits simplificada . Cualquier bit, o cadena de bits, en una palabra podía ser accedido usando la .(x:y)sintaxis, donde x e y eran las posiciones de bit inicial y final de 0 a 15. (Es importante destacar que x e y deben ser constantes conocidas en tiempo de compilación). Así, A.(8:15)devolvía el byte inferior de la palabra que almacenaba A. [ 27 ] Este formato podía usarse para dividir y fusionar bits según fuera necesario. Además, se proporcionaban operaciones adicionales para desplazamientos y rotaciones, y podían aplicarse a cualquier variable con el &, por ejemplo A:=A & LSR(3). [ 28 ]

Ejemplo

Este sencillo programa, de la versión de 1984 del manual de referencia, muestra la mayoría de las características del lenguaje SPL. [ 11 ]

The program as a whole is delimited between the BEGIN and END.. It begins with the definition of a series of global variables, A, B and C, defines a single procedure and then calls it twenty times. Note that the procedure does not have a BEGIN and END of its own because it contains only one line of actual code, X:=X*(Y+Z); the INTEGER X,Y,Z is not considered part of the code itself, it is indicating the type of the three parameters being passed in on the line above and is considered part of that line.[11]

 BEGIN INTEGER A:=0, B, C:=1; PROCEDURE N(X,Y,Z); INTEGER X,Y,Z; X:=X*(Y+Z); FOR B:=1 UNTIL 20 DO N(A,B,C); END. 

References

Citations

  1. ^Leibson 2017.
  2. ^"History of the 2116A digital computer". HP.
  3. ^"Hewlett/Packard Computers". The 2000A was the first HP 2000 time share system on the market ca. 1969
  4. ^Green 2004.
  5. ^ abcdEdler 1995.
  6. ^Baker, Henry; Parker, Clinton (September 1979). "Micro-SPL"(PDF).
  7. ^Parker, Clinton (31 December 2015). "ANTIC Interview 111, Clinton Parker, Action!" (podcast). Interviewed by Randy Kindig.
  8. ^"SPLash! The Native Mode SPL Compiler for MPE/iX". Allegro Consultants. 1 January 2004.
  9. ^SPL 1984, pp. 1.2, 1.3.
  10. ^ abSPL 1984, p. 1.1.
  11. ^ abcSPL 1984, pp. 1.5.
  12. ^SPL 1984, pp. 1.11.
  13. ^SPL 1984, pp. 7–4.
  14. ^SPL 1984, pp. 3.15.
  15. ^SPL 1984, pp. 1.13, 1.14.
  16. ^SPL 1984, pp. 2.1–2.3.
  17. ^SPL 1984, pp. 2.4.
  18. ^ abSPL 1984, pp. 3.2.
  19. ^SPL 1984, pp. 2.13.
  20. ^SPL 1984, pp. 4.4.
  21. ^SPL 1984, pp. 2.12.
  22. ^SPL 1984, pp. 3.6.
  23. ^SPL 1984, pp. 2.6.
  24. ^SPL 1984, pp. 2.11.
  25. ^SPL 1984, pp. 3.18.
  26. ^SPL 1984, pp. 1.8.
  27. ^SPL 1984, pp. 4.6.
  28. ^SPL 1984, pp. 4.9.

Bibliography

  • Edler, Christopher (noviembre de 1995). "El castillo más fuerte: auge, caída y resurgimiento de la HP 3000" . The Analytical Engine . 3 (1). ISSN  1071-6351 . Archivado del original el 3 de febrero de 2002.
  • Green, Bob (2004). Evolución del HP3000 . Robelle.
  • Leibson, Steve (2017). "HP: La compañía informática accidentalmente, a propósito" . HP9825.COM .
  • Manual de referencia del lenguaje de programación de sistemas (PDF) . Hewlett-Packard. Febrero de 1984.
Obtenido de " https://en.wikipedia.org/w/index.php?title=Systems_Programming_Language&oldid=1309617990 "