PL/I
PL/I es un lenguaje procedural imperativo que combina funcionalidades de ALGOL, COBOL y FORTRAN. La sintaxis de lenguaje PL/I fue publicada por primera vez en 1965, con un primer compilador implementado en 1966. El lenguaje recibió estandarización ANSI X3.53 en 1976.
Historia
A comienzos de los 60s, poco después del desarrollo de los primeros compiladores de alto nivel, los programadores del cómputo habían caído en tres campos: programadores de negocios que usaban COBOL, programadores científicos que usaban FORTRAN, y programadores de sistemas que empleaban lenguaje ensamblador. IBM buscó remediar esta situación desarrollando un lenguaje de programación que pudiese ser empleado por todos los programadores: PL/I, que significa “Programming Language I (numera romano 1, como en “un lenguaje para todos”).
PL/I fue empleado como el lenguaje de sistemas de programación para el Proyecto Multics, fue utilizado en el desarrollo de aplicaciones notables como SAS y Sabre (sistema de reserva de pasajes aéreos). IBM usó internamente varios lenguajes derivados de PL/I para el desarrollo de sus sistemas. Sin embargo, debido al tamaño del lenguaje, el desarrollo de los compiladores para PL/I demostró ser dificultoso. PL/I fracasó en atraer muchos programadores de los campos de COBOL o FORTRAN y nunca se volvió ampliamente popular.
Existe disponible un compilador PL/I en el sistema OpenVMS del ICM. El siguiente tutorial fue redactado para abarcar el compilador PL/I Kednos PL/I V3.8 para la VAX con OpenVMS “Rosencrantz” del ICM.
Ingresando a Rosencrantz
ssh rosie@bitzone.sdf.org
Recibirás la siguiente pantalla de bienvenida:
Escape is ^] Welcome to the Interim Computer Museum! You have reached our VAXstation 4000-60, named Rosencrantz. If you have an account, please log in. New accounts can be requested by Interim Computer Museum Bootstrap members. Please visit our website (https://icm.museum/join.html). Username:
Reciba una cordial bienvenida al sistema que hemos llamado Rosencrantz!
____ ____________ _ _____ _ _______ __ __ _
/ __ \/ ____/ ____/ | | / / | | |/ / ___// /_____ _/ /_(_)___ ____
/ / / / __/ / / | | / / /| | | /\__ \/ __/ __ `/ __/ / __ \/ __ \
/ /_/ / /___/ /___ | |/ / ___ |/ |___/ / /_/ /_/ / /_/ / /_/ / / / /
/_____/_____/\____/ __ _|___/_/__|_/_/|_/____/\__/\__,_/\__/_/\____/_/ /_/
/ // / / __ \/ __ \/ __ \ / ___// __ \
/ // /_/ / / / / / / / / /_____/ __ \/ / / /
/__ __/ /_/ / /_/ / /_/ /_____/ /_/ / /_/ /
/_/ \____/\____/\____/ \____/\____/
Mainframe DEC VAXStation 4000-60 del ICM Museum
Utiliza el interprete de comandos DCL sobre OpenVMS 7.3.
=> Para obtener ayuda, ingrese HELP THIS_SYSTEM
=> Para obtener un listado de juegos, ingrese HELP GAMES.
=> Ingrese FORUM para ir al Foro de VAX.
=> Para obtener una referencia de los comandos use ALIASED_COMMANDS
bajo HELP THIS_SYSTEM para mayor informacion.
Tutorial de Compilación de PL/I
Aprenderá a escribir y compilar un programa PL/I básico, que imprime la cadena de caracteres “Hola Tercer Mundo!”.
Compilar, Enlazar, Correr
Crea un fichero de texto llamado HOLA.PLI
lse HOLA.PLI
…e ingresa el siguiente código fuente:
HOLA: PROCEDURE OPTIONS (MAIN);
PUT LIST ('Hola Tercer Mundo!');
END;
Guarde el código fuente anterior en el fichero HOLA.PLI y vuelve al prompt del intérprete DCL de OpenVMS con Ctrl+z. Luego en el prompt del intérprete DCL ingresa:
$ PLI HOLA $ LINK HOLA $ RUN HOLA Hola Tercer Mundo! $
Resumen de sintaxis del Lenguaje PL/I
| identificador: PROCEDURE OPTIONS (MAIN); [declaración; …] sentencia; … END; | Procedimiento principal OPTIONS (MAIN) puede omitirse si el procedimiento principal es el primero y/o único en el programa. |
| identificador: PROCEDURE [(argumento [, …])]; [declaración; …] sentencia; … END; | Procedimiento de subrutina |
| CALL identificador [(argumento [, …])]; | Llamada de subrutina Los Argumentos Variables son normalmente pasados por referencia. Cierre el argumento entre paréntesis para pasar por valor. |
| identificador: PROCEDURE [(argumento [, …])] RETURNS (tipo); [declaración; …] sentencia; … RETURN valor; END; | Procedimiento de Función |
| identifier [(argumento [, …])] | Llamada de Función (dentro de expresión) |
| DECLARE identificador tipo [INITIAL (valor)]; | Declaración de Variable |
| DECLARE identificador (dimensión [, …]) tipo; | Declaración de Arreglo |
| %REPLACE identificador BY valor; | Declara constante simbólica |
| identificador [(index [, …])] = expresión; | Asignación |
| arreglo = expresión; | Asignación a todos los elementos del arreglo |
| IF expression THEN sentencia1; [ELSE sentencia2;] | Ejecución condicional |
| DO sentencia; … END; BEGIN [declaration; …] sentencia; … END; | Secuencia de sentencia múltiples (puede usarse en lugar de sentencias simples en IF y ELSE) |
| DO identificador = comienzo TO final [BY incremento]; sentencia; … END; | Bucle contabilizado |
| DO WHILE (expresión); sentencia; … END; | Repite cuerpo de bucle mientras es verdadera la expresión |
| GET LIST (identificador [, …]); | Analiza campos delimitados por espacio/tab/coma desde cadena de entrada de terminal y los convierte de acuerdo al tipo de dato del identificador |
| PUT LIST (identificador|literal [, …]); | Imprime datos desde identificador o literal a cadena de salida de terminal |
| PUT SKIP [(lines)]; | Comienza salida en nueva línea |
| /* … */ | Comentario (ahora sabe de donde los obtuvo C) |
Tipos de datos
| Tipo | Declaración | Default longitud/ precisión | Literal | Consideraciones |
|---|---|---|---|---|
| Entero | FIXED BINARY [(precision)] | 31 bits | 123 | |
| Coma flontate (precisión simple) | FLOAT BINARY [(precisión)] | 24 bits | 1.23E-5 | |
| Coma flontante (precisión doble) | FLOAT BINARY (precisión) | 1.23E-5 | Especifica precisión de 25-53 bits | |
| Cadena de caracteres | CHARACTER [(longitud)] | 1 caracter | 'cadena' | |
| Booleano | BIT [(longitud)] | 1 bit | '0'B (false) '1'B (verdadero) |
PL/I soporta una cantidad de otros tipos de datos que principalmente guardan interés histórico.
Operadores
| Operador | Operación | Precedencia |
|---|---|---|
| ( … ) | Conjunto | 1 |
| ** | Exponenciación | 2 |
| + (prefijo) | Positivo | 2 |
| - (prefijo) | Negativo | 2 |
| ^ | NOT Lógico | 2 |
| * | Multiplicación | 3 |
| / | División | 3 |
| + | Adición | 4 |
| - | Substracción | 4 |
| || | Concatenación de cadena | 5 |
| = | Igual a | 6 |
| > | Mayor que | 6 |
| < | Menor que | 6 |
| ^> | No mayor que | 6 |
| ^< | No menor que | 6 |
| ^= | No igual a | 6 |
| <= | Menor o igual que | 6 |
| >= | Mayor o igual que | 6 |
| & | AND Lógico | 7 |
| | | OR Lógico | 8 |
Funciones incorporadas
(Ver "Chapter 11 Built-In Functions, Subroutines, and Pseudovariables" del Manual de Referencia Kednos PL/I 1).)
Identificadores
Los identificadores (nombres de variables, etiquetas, etc.) pueden tener hasta 31 caracteres de extensión comprendiendo caracteres A-Z, a-z, 0-9, $, y _. Los identificadores no pueden comenzar con un caracter numérico. Las mayúsculas y minúsculas se consideran equivalentes, de modo que A y a son el mismo identificador.
Formato fuente
Cada declaración debe estar terminada con un punto y coma (;), pero fuera de eso, el formato resulta libre. Pueden aparecer múltiples declaraciones en una única línea, y una decaración simple puede abarcar múltiples líneas. En PL/I pueden insertarse cualquier cantidad de caracteres de espacio en blanco, tabulación o nueva línea entre las palabras claves.
Otras referencias
- Introduction to VAX-11 PL/I, Digital Equipment Corporation, julio de 1980. [Online]. Disponible: https://bitsavers.org/pdf/dec/vax/lang/pl1/AA-H950A-TE_Introduction_to_VAX-11_PLI_198007.pdf. [Accedido: 19 de Oct., 2026].


