FLOW-MATIC es el nombre comercial del compilador B-0 (Business language versión 0), orientado al ámbito de la gestión y desarrollado por Grace Murray Hopper entre los años 1955 y 1958 para la computadora UNIVAC de Remington Rand.
Es el primer lenguaje de alto nivel en el que las instrucciones estaban basadas en palabras en inglés, y es el lenguaje en el que la misma Grace Hopper se basó posteriormente para desarrollar el lenguaje de programación COBOL.
Hopper encontraba que los clientes de procesamiento de datos de negocio se sentían incómodos con la notación matemática. A finales de 1953 propuso que los problemas de procesamiento de datos se expresaran con palabras clave en inglés, pero la empresa Remington Rand consideraba que la idea era inviable. A principios de 1955, ella y su equipo escribieron las directrices que debería cumplir un lenguaje de programación de este tipo e implementaron un prototipo.
El compilador FLOW-MATIC se puso a disposición del público a principios de 1958 y se completó sustancialmente en 1959.
Principales características de FLOW-MATIC:
1) Fue el primer lenguaje de programación para expresar operaciones utilizando declaraciones en inglés.
2) Fue el primer sistema que separaba claramente la descripción de los datos de las instrucciones que trataban con ellos. Su lenguaje de definición de datos, a diferencia de las sentencias ejecutables, no estaban basadas en el inglés. Las estructuras de datos se definían rellenando unos formularios preimpresos.
3) Tuvo una gran influencia en el diseño del lenguaje COBOL, ya que sólo él y su descendiente directo AIMACO estaban en uso real en ese momento.
LA COMPUTADORA UNIVAC I
La UNIVAC I (UNIVersal Automatic Computer) fue la segunda computadora comercial producida en los estados unidos.
Fue diseñada principalmente por J. Presper Eckert y John Mauchly, inventores del ENIAC, después de que su empresa, la Eckert-Mauchly Computer Corporation fuera comprada por la Remington Rand, posteriormente esta por la Sperry Rand y ahra es la actual Unisys.
Fue el primer computador diseñado para su uso en la administración y en los negocios, debido entre otras cosas a su velocidad en el cálculo de operaciones aritméticas simples con números relativamente largos, y sus capacidad de manejar y almacenar datos, en comparación con la complejidad de uso de las computadoras científicas.
Este sistema usaba cintas magnéticas para almacenar los datos, a diferencia de otros sistemas, principalmente IBM, que usaban las tarjetas perforadas. Para competir con estas empresas desarrollaron equipos que permitían pasar la información de las tarjetas perforadas a cinta magnética y al revés.
Como el incipiente mercado de las computadoras era muy reducido, para promover su venta se unió con la CBS para predecir el resultado de las elecciones presidenciales de Estados Unidos de 1952, en las que Eisenhower se enfrentaba a Adlai Stevenson. UNIVAC acertó y las tecnologías de computación tuvieron un gran reconocimiento público.
Las primeras UNIVAC se instalaron en agencias gubernamentales como la oficina del Censo de los Estados Unidos (31 de marzo de 1951), U.S. Air Force Pentagon, U.S. Army Map Service o la U.S. Atomic Energy Commission, entre otras. Compañías privadas como la General Electric, Du Pont Wilmington, Franklin Life Insurance ,Westinghouse o la Pacific Mutual Life Insurance también tuvieron su UNIVAC I.
Con un coste inicial de 159.000 US$ de la época, el coste fue subiendo hasta los 1.500.000 US$. Esto hacia que fueran demasiado caras para la mayoría de las universidades, y Sperry Rand, a diferencia de empresas como IBM, solo pudieron donar unas pocas unidades. Las afortunadas fueron la Harvard University (1956), the University of Pennsylvania (1957), y Case Institute of Technology in Cleveland, Ohio (1957). En este caso, la UNIVAC I siguió operativa hasta el año 1965 en que fue reemplazada por una UNIVAC 1107.
Pocas UNIVAC I siguieron en funcionamiento más allá de mediados de los años 60 debido a que quedaron obsoletas técnicamente. El Census Bureau la usó hasta el 1963, y las últimas UNIVAC I dejaron de funcionar en 1970, después de 13 años de servicio.
Un total de 46 equipos UNIVAC fueron construidos y entregados.
Información Técnica
Con una superficie total de 35 m2, un peso de 13 toneladas y un consumo de 125.000 Watios, la UNIVAC I usaba 5.200 válvulas de vacío y era capaz de realizar hasta 1.905 operaciones por segundo, con una velocidad de reloj de 2.25 MHz.
La memoria principal consistía en 1000 palabras de 12 caracteres. Los números se representaban con 11 dígitos decimales más el signo. Esta memoria consistía en 100 canales de 10 palabras cada una, basadas en líneas de retardo contenidas en tanques de mercurio. Cada uno de estos tanques se dividían a su vez en 18 canales.
Las instrucciones consistían en 6 caracteres alfanuméricos, y en una palabra cabían dos instrucciones. Era capaz de realizar una suma en 525 microsegundos y una multiplicación en 2150. La forma que tenía de almacenar los dígitos (BCD) hizo que se considerara una máquina decimal y no binaria. Esto podía ocasionar problemas si durante una operación aritmética se encontraba con un carácter que no correspondía a un dígito.
El sistema permitía conectar hasta 10 unidades de cinta UNISERVO, una máquina de escribir eléctrica y un osciloscopio. Las unidades UNISERVO fueron las primeras unidades de cinta comercializadas. Tenían una densidad de grabación de 128 bits por pulgada, una velocidad de transferencia de 7200 caracteres por segundo y podían leer y grabar en las dos direcciones.
La UNITYPER era una máquina de escribir modificada y sin conexión con el computador que grababa la información en una cinta magnética. Era usada por los programadores y para la introducción o edición de datos. Posteriormente esta cinta podía ser montada en una unidad UNISERVO para ser procesada por el computador.
Los datos también podían ser importados y exportados a tarjetas perforadas o cinta de papel perforada usando distintos dispositivos que se conectaban al UNIVAC I.
GRACE MURRAY HOPPER (fuente: Wikipedia)
Grace Murray Hopper (1906-1992) fue una científica especializada en Matemáticas y también una militar norteamericana, con grado de contraalmirante, considerada una pionera en el mundo de las ciencias de la computación. Fue la primera programadora que utilizó el Mark I y entre las décadas de los 50 y 60, propició la aplicación de los compiladores para el desarrollo de los lenguajes de programación y métodos de validación. Era conocida por sus amistades como la “Amazing Grace”.
Desde muy pequeña demostró aptitudes para las ciencias y las matemáticas. Se sentía atraída por cualquier tipo de dispositivo mecánico, tanto es así, que con 7 años desarmó todos los relojes de su casa para ver si podía entender como funcionaban. Estudió en varias escuelas privadas para mujeres, y en 1924 ingresó en Vassar College en Nueva York, donde estudió en matemáticas y física, graduándose con honores en 1928.
Siguiendo los pasos de su bisabuelo, en 1943 decidió unirse a las fuerzas armadas en plena segunda guerra mundial, para lo que tuvo que obtener un permiso especial. Asistió a la escuela de cadetes navales para mujeres, graduándose la primera de su clase en 1944 y con el rango de teniente. Fue enviada a Harvard para trabajar en el proyecto de computación que dirigía el comandante Howard Aiken, la construcción de la Mark I. Desarrolló varias aplicaciones contables para esta computadora, que estaba siendo utilizada por una compañía de seguros. Permaneció en Harvard hasta 1949, cuando Hopper empezó a trabajar en la Eckert-Mauchly Corporation en Filadelfia, que en esos momentos estaban desarrollando las computadoras BINAC y UNIVAC I. Trabajó en esa compañía y en sus sucesoras hasta su retiro en 1971. Allí fue donde Hopper realizó sus mayores contribuciones a la programación moderna. En 1952, desarrolló el primer compilador de la historia, el A-0, y en 1957 realizó el primer compilador para procesamiento de datos que usaba órdenes en inglés, el B-0 (FLOW-MATIC), utilizado principalmente para el cálculo de nóminas.
Tras su experiencia con FLOW-MATIC, Hopper pensó que podía crearse un lenguaje de programación que usara órdenes en inglés y que sirviera para aplicaciones de negocios. Con esta idea, las bases para COBOL habían sido establecidas, y 2 años después se creó el comité que diseño este lenguaje. Aunque Hopper no tuvo un papel preponderante en el desarrollo del lenguaje, fue miembro del comité original para crearlo, y el FLOW-MATIC fue una influencia tan importante en el diseño de COBOL, que Hopper ha pasado a la historia de la informática como su creadora.
Hopper permaneció en la reserva hasta finales de 1966, cuando tuvo que retirarse con el grado de Capitán de fragata, por haber alcanzado el límite de edad. Pero este retiro duró poco, ya que la armada la volvió a llamar en agosto de 1967 en principio, por un periodo de seis meses para que estandarizara los lenguajes de alto nivel que usaban, pero fue de forma indefinida. Se retiró de nuevo en 1971 pero se le pidió volver al servicio activo de nuevo en 1972. Fue ascendida a Capitán de navío en 1973. En 1983 ascendió a Contraalmirante y en 1986 se retiró de la armada de manera definitiva, siendo en ese momento la oficial de más edad de la armada de los Estados Unidos. Tras su retiro, se incorporó como asesora en Digital Equipment Corporation, participando en foros industriales, dando unas 200 conferencias por año y participando en programas educativos hasta su muerte.
A menudo, se le atribuye erróneamente la invención del término bug para referirse a un error o fallo en un programa. Trabajando con un Mark II en la universidad de Harvard el 9 de septiembre de 1947, los ingenieros encontraron una mariposilla enganchada a uno de los relés del ordenador y que impedía el funcionamiento del mismo. Dicho lepidóptero pasó a la historia de la informática por ser pegado al libro de registro de actividad del ordenador con el comentario «First actual case of bug being found», en español «Primer caso real de bug encontrado» (el término bug no se traduce al castellano por considerarse una palabra técnica). Como ella misma reconoció, no fue ella la que encontró el insecto.
Falleció mientras dormía en su domicilio de Arlington, Virginia, el 1 de enero de 1992 a los ochenta y cinco años. Fue enterrada con todos los honores militares el 7 de enero en el cementerio Nacional de Arlington.
A lo largo de su vida, recibió numerosos reconocimientos, que incluyen más de 40 doctorados honoris causa, la Medalla Wilbur Lucius Cross de Yale, el rango de capitán en 1973, el de comodoro en 1983 y el de contraalmirante en 1985. Única mujer con el grado de almirante de su país. A destacar:
1969 – Paradójicamente recibió el título de Hombre del año en ciencias de la computación (Data Processing Management Association).
1973 - Primera mujer nombrada miembro distinguido de la British Computer Society.
1986 - Tras su jubilación, recibió la Medalla de Servicio Distinguido de Defensa.
1988 – Recibió el Premio Golden Gavel en la convención Toastmasters Internacional en Washington, DC.
1991 – Medalla nacional de tecnología.
1996 – Se pone en marcha el buque de guerra, USS Hopper (DDG-70). Apodado Amazing Grace en su honor.
MI PROYECTO FLOW-MATIC
Iniciar un proyecto para programar un intérprete de un lenguaje obsoleto y del que no existe ningún tipo de documentación a partir de un único listado no es la mejor forma de empezar, pero lo he hecho y creo que no ha salido mal.
Así empezó todo.
Buscando información sobre el sistema UNIVAC encontré, entre otros PDF, un folleto publicitario de 8 páginas de presentación del lenguaje FLOW-MATIC y un manual completo del lenguaje MATH-MATIC.
El FLOW-MATIC me llamó la atención cuando leí que era el primer compilador de la historia, y que permitía programar mediante instrucciones redactadas en inglés. De esta forma, programar era mucho más sencillo y los listados de los programas eran claros y fáciles de comprender. El compilador se encargaba de la parte más farragosa: traducir el listado a código máquina.
Y sorprendido de ver que no existe información alguna en Internet... descarté el tema.
Como del MATH-MATIC tenía un PDF con el manual completo, empecé por éste y programé un intérprete totalmente operativo, con un entorno de desarrollo completo para poderlo usar de una forma bastante cómoda. Este intérprete lo inicié a finales del año 2012 y lo aparqué estando muy avanzado al quedarme bloqueado al intentar simular lo más fielmente posible la estructura de sus ficheros en las cintas de datos. A finales del año 2013 decidí continuar el proyecto prescindiendo de ciertos detalles confusos pero poco importantes a nivel de programación, y el proyecto finalizó satisfactoriamente.
A partir de la experiencia con el intérprete de MATH-MATIC me dediqué a analizar el listado del FLOW-MATIC, intentando deducir que hacia cada una de sus líneas.
Lo resolví todo bastante rápido, y solo me costó entender que hacían las líneas 0, 12 y 14:
- La línea 0 deduje que asocia estructuras de datos a ficheros de entrada o salida.
- La línea 12 se usa para cambiar la línea de destino de una instrucción de salto en una línea concreta del programa.
- Y respecto a la línea 14, me limité a tratarla igual que la instrucción COMPARE ya que no aprecio diferencia.
A partir de esa información, y aprovechando el entorno del intérprete de MATH-MATIC me decidí a programar una primera versión del intérprete de FLOW-MATIC que reconociera todas estas instrucciones, con una regla de oro: el intérprete no puede hacer nada que no tenga documentado, para ser lo más fiel posible al lenguaje original. Está regla solo me la he saltado en la definición de las estructuras de datos (FD) y en los mensajes de error.
En menos de una semana tenía el listado original corriendo en el intérprete.
¿Y que hace el programa de ejemplo?
- Hay dos ficheros de entrada: el (A) con códigos de productos y el (B) con códigos de productos y sus precios.
- Se supone que no todos los productos del fichero (A) están en el fichero (B).
- Se generan dos ficheros de salida: el de productos con precio (C) y productos sin precio (D).
- El programa revisa si el producto de (A) están en el fichero (B) y graba el registro en el fichero de salida correspondiente.
- Al finalizar cierra los ficheros de salida y rebobina la cinta de (B).
Enigma resuelto !!!
Pero para ampliar las instrucciones que reconocía el intérprete necesitaba encontrar más documentación. Después de muchas horas buscando material encontré un nuevo PDF de presentación del UNIVAC y allí se hacía una pequeña referencia al FLOW-MATIC, poniendo como ejemplo como usar las instrucciones de cálculo.
Gracias a esta información el intérprete ya podía sumar, restar, multiplicar y dividir.
También pude ver que el “AND GO TO OPERATION” al final de las sentencias es algo habitual, y lo incorporé a una parte de las instrucciones del intérprete. Posteriormente, con la instrucción SET se puede cambiar el destino del salto.
Y en otro apartado hablaba de las tarjetas perforadas, con la instrucción PUNCH, y la aproveché para dar salida a la información por pantalla e impresora.
Con todo, desde el principio he sido consciente que hasta que encuentre un manual de instrucciones este proyecto está predestinado a ser una versión inacabada que irá avanzando a medida que vaya descubriendo nueva información. Quiero que lo que haga, lo haga bien.
Podéis descargar los PDF de los dos folletos de estos sitios:
http://archive.computerhistory.org/reso ... 646140.pdf
http://bitsavers.trailing-edge.com/pdf/ ... nDescr.pdf
COMANDOS DE LA CONSOLA
Aunque he aprendido muchas cosas del UNIVAC, sigo ignorando como era el sistema por el que el operario se comunicaba con el UNIVAC. Pero como este proyecto está orientado a la programación de este lenguaje he adaptado el entorno del proyecto “Dartmouth BASIC”, con ciertas modificaciones y ampliaciones.
Me he inventado una serie de comandos que nos permiten, entre otrras cosas, introducir líneas de código, listar, cargar, grabar y borrar programas de FLOW-MATIC y gestionar las definiciones de las estructuras de datos.
LOAD nombre
Carga en memoria el programa indicado. El nombre debe corresponder a un fichero con extensión “.FMP”.
SAVE [nombre]
Graba en el disco el programa que hay en memoria.
Si se graba un programa nuevo, la primera vez se debe especificar un nombre de hasta 8 caracteres y sin extensión.
EXEC
Ejecuta el programa que hay en memoria.
LIST [desde] [hasta] / [FD [nombre]] / [VARS]
Este comando permite realizar tres listados distintos:
- Listar el programa en memoria, pudiendo indicar la línea inicial y final.
- Listar las definiciones de ficheros (FD), pudiendo indicar una definición en concreto.
- Listar las variables definidas indicando su nombre, tamaño y el valor que contienen. Útil para depurar un programa.
Podemos abortar un listado pulsando la tecla "ESC".
EDIT [línea] / [definición]
Este comando permite realizar dos acciones distintas:
- Editar una línea del programa indicando su número de línea.
- Editar una definición de estructura de datos (FD) indicando su nombre.
Al editar una línea o FD aparece una copia de la línea, a modo de guía, y debajo se entra en modo de edición, guardando un copia de la línea original en un buffer. El sistema de edición está inspirado en el del M-BASIC de Microsoft.
Controles de EDIT:
- SPACE: Muestra un carácter de la línea, excepto cuando se está en modo inserción.
- SUPR: Borra el siguiente carácter de la línea del buffer.
- BACK: Borra el carácter anterior de la línea del buffer.
- INS: Activa/desactiva el modo inserción. Con el modo de inserción activado se pueden añadir caracteres en la línea.
- ENTER: Acepta la línea en el estado actual.
- ESC: Anula la edición de la línea.
RESET
Borra el programa de memoria.
FILES
Muestra una lista con los ficheros con extensión “.FMP” que hay en la carpeta del intérprete FLOW-MATIC.
ERASE nombre
Borra el programa indicado de la carpeta de FLOW-MATIC. El fichero debe tener la extensión .”FMP”.
EXIT
Salir de FLOW-MATIC y volver al sistema operativo.
Pulsando [F1] se muestra una pantalla de ayuda con un resumen de los comandos de consola y las instrucciones del lenguaje FLOW-MATIC, entre otras cosas.
DECLARACIÓN DE ESTRUCTURAS DE DATOS (FD)
El lenguaje FLOW-MATIC separa la definición de datos del programa que los usa. Como no he conseguido encontrar documentación alguna sobre este tema he creado un sistema, a partir del análisis del listado original, que nos permite crear estructuras de datos para ser usadas posteriormente por el programa.
Cada estructura de datos se divide en tres partes: Nombre de la estructura, alias y variables de la estructura.
Analizando la línea 0 del programa original:
(0) INPUT INVENTORY FILE-A PRICE FILE-B ; OUTPUT PRICED-INV FILE-C UNPRICED-INV FILE-D ; HSP D .
... he interpretado que INVENTORY es una estructura de datos y FILE-A es el fichero de entrada de datos que usará esta estructura. La misma filosofía se ha usado con las otras 3 estructuras.
Analizando la línea 6 del programa original:
(6) MOVE UNIT-PRICE (B) TO UNIT-PRICE (C) .
... he interpretado que UNIT-PRICE es un campo de la estructura PRICE que tiene el alias (B). La estructura PRICED-INV con alias (C) tiene un campo con el mismo nombre.
Para relacionar esta línea con las variables que aparecen posteriormente en el listado, como PRODUCT-NO (A), he montado un sistema que nos permite establecer la relación.
INVENTORY = (A) ; PRODUCT-NO PIC 9(3) .
Como se puede ver, se define la estructura INVENTORY asignando un alias (A) que es usado por el programa. A continuación y separado por un “;” se van indicando los distintos campos que contiene la estructura. Me he basado en el COBOL para definir el formato de la variable PRODUCTO-NO como un campo numérico de 3 dígitos.
Para que funcione el programa de ejemplo original, se han definido 4 estructuras de datos:
INVENTORY = (A) ; PRODUCT-NO PIC 9(3) .
PRICE = (B) ; PRODUCT-NO PIC 9(3) ; UNIT-PRICE PIC 9(5) .
PRICED-INV = (C) ; PRODUCT-NO PIC 9(3) ; UNIT-PRICE PIC 9(5) .
UNPRICED-INV = (D) ; PRODUCT-NO PIC 9(3) .
La primera (A) y la última (D) contienen un único campo y un tamaño total de 3 dígitos, y las otras dos, (B) y (C), contienen dos campos con un tamaño total de 8 dígitos.
Aunque el sistema UNIVAC utilizaba tarjetas perforadas de 90 columnas, este intérprete ha limitado el tamaño de las estructuras a un total de 80 dígitos.
Por otro lado, como desconozco si este lenguaje de programación soportaba caracteres alfanuméricos, lo he limitado a campos numéricos sin especificar decimales. El intérprete redondea siempre a 2 decimales y producirá un error de overflow si no cabe en el espacio asignado a la variable.
Para ver la lista de estructuras definidas:
LIST FD (para verlas todas) ó
LIST FD INVENTORY (para ver únicamente la estructura INVENTORY)
Para modificar una estructura ya definida:
EDIT INVENTORY
Para eliminar una estructura ya definida:
INVENTORY =
Para ver los valores de todas las variables:
LIST VARS
Al grabar un programa con el comando SAVE se almacenan las líneas correspondientes a la estructura de datos al principio del fichero .FMP y a continuación se guardan las líneas del programa.
Al recuperar el programa con el comando LOAD, se procesan las líneas de la estructura de datos primero y las líneas del programa después.
No es obligatorio que una estructura de datos esté asociada a un fichero de datos. Esto nos permite definir variables para ser usadas durante la ejecución del programa.
El sistema permite la definición de hasta 200 variables, y no está contemplado el uso de matrices (por ahora).
Los nombres de estructura y alias deben ser únicos. Si se usa el mismo nombre de estructura, la última sobrescribirá a la anterior y en el caso de los alias, provocará un error.
INSTRUCCIONES DE FLOW-MATIC
A falta de un manual original o más información me he limitado a incluir las instrucciones que conozco con sus correspondientes funcionalidades. Así, desconozco si hay más instrucciones y si las que incorpora el intérprete permiten más opciones.
Este compilador reconoce 18 instrucciones divididas en cuatro grupos: manipulación de registros, entrada/salida de datos, control de la ejecución y funciones matemáticas.
MOVE
Copiar el contenido de una variable o valor numérico a otra variable. Tenemos la posibilidad de saltar a una línea concreta una vez procesada la instrucción.
Formato:
MOVE variable1/valor TO variable2 [AND GO TO OPERATION línea] .
Ejemplo:
MOVE UNIT-PRICE (B) TO UNIT-PRICE (C) .
MOVE UNIT-PRICE (B) TO UNIT-PRICE (C) AND GO TO OPERATION 5 .
MOVE 12345 TO UNIT-PRICE (C) .
TRANSFER
Copiar el contenido de un estructura a otra, acción que afecta a todas las variables que contiene la estructura de destino. La referencia a la estructura se hace mediante su alias. Tenemos la posibilidad de saltar a una línea concreta una vez procesada la instrucción.
Formato:
TRANSFER alias1 1 TO alias2 variable2 [AND GO TO OPERATION línea] .
Ejemplo:
TRANSFER A TO D .
TRANSFER A TO D AND GO TO OPERATION 5 .
COMPARE
Comparar dos valor, que pueden ser numéricos o variables. En función del resultado y las condiciones indicadas se puede saltar a una línea determinada. Permite encadenar varias sentencias IF en una misma línea.
Para ser compatible con el programa de ejemplo, el intérprete trata el valor ZZZZZZZZZZZZ como un 0.
Formato:
COMPARE valor1 WITH valor2 ; IF [EQUAL/GREATER/LOWER/OTHERWISE] GO TO OPERATION línea ; ... .
Ejemplo:
COMPARE PRODUCT-NO (A) WITH PRODUCT-NO (B) ; IF GREATER GO TO OPERATION 10 ; OTHERWISE GO TO OPERATION 2 .
COMPARE PRODUCT-NO (B) WITH 10 ; IF EQUAL GO TO OPERATION 10 ; OTHERWISE GO TO OPERATION 2 .
TEST
Esta instrucción aparece en el listado original pero ante las dudas sobre su funcionamiento se comporta igual que la instrucción COMPARE, respetando su sintaxis particular.
Formato:
TEST valor1 AGAINST valor2 ; IF [EQUAL/GREATER/LOWER/OTHERWISE] GO TO OPERATION línea ; ... .
Ejemplo:
TEST PRODUCT-NO (B) AGAINST ZZZZZZZZZZZZ ; IF EQUAL GO TO OPERATION 16 ; OTHERWISE GO TO OPERATION 15 .
TEST PRODUCT-NO (B) AGAINST 10 ; IF EQUAL GO TO OPERATION 10 ; OTHERWISE GO TO OPERATION 2 .
JUMP
La ejecución del programa salta a la línea de código indicada.
Formato:
JUMP TO OPERATION línea .
Ejemplo:
JUMP TO OPERATION 5 .
SET OPERATION
Permite cambiar el número de línea al que se salta desde la instrucción que hay en la línea indicada. Esto afecta a las instrucciones JUMP, READ-ITEM, WRITE-ITEM, MOVE, TRANSFER, ADD, SUBTRACT, MULTIPLY, DIVIDE y PUNCH, cuando aparece el “AND GO TO OPERATION” (excepto en JUMP).
Formato:
SET OPERATION línea1 TO GO TO OPERATION línea2 .
Ejemplo:
SET OPERATION 9 TO GO TO OPERATION 2 .
Como se puede ver en el programa de ejemplo, el JUMP de la línea 9 salta a la línea 1. Pero si se ejecuta la línea 12, desde ese momento la línea 9 saltará a la línea 2 y el COMPARE ya no se ejecutará más.
INPUT / OUTPUT
Define la relación entre una estructura de datos y un fichero de datos. En función de la instrucción (INPUT o OUTPUT) el fichero se abre en modo de lectura o escritura.
Formato:
READ-ITEM alias [IF END OF DATA GO TO OPERATION línea / AND GO TO OPERATION línea] .
Ejemplo:
INPUT INVENTORY FILE-A PRICE FILE-B .
INPUT INVENTORY FILE-A PRICE FILE-B ; OUTPUT PRICED-INV FILE-C UNPRICED-INV FILE-D ; HSP D .
Excepción: En el listado original aparece un “HSP D”. Esto no provoca ningún error pero tampoco tiene ningún efecto.
READ-ITEM
Lee un registro de un fichero asociado a la estructura, referenciado por su alias. Tenemos la posibilidad de saltar a una línea concreta una vez procesada la instrucción o en el supuesto de llegar al final del fichero.
Formato:
READ-ITEM alias [IF END OF DATA GO TO OPERATION línea / AND GO TO OPERATION línea] .
Ejemplo:
READ-ITEM A .
READ-ITEM A AND GO TO OPERATION 5 .
READ-ITEM A ; IF END OF DATA GO TO OPERATION 12 .
WRITE-ITEM
Graba un registro en un fichero asociado a la estructura, referenciado por su alias. Tenemos la posibilidad de saltar a una línea concreta una vez procesada la instrucción.
Formato:
WRITE-ITEM alias [AND GO TO OPERATION línea] .
Ejemplo:
WRITE-ITEM A .
WRITE-ITEM A AND GO TO OPERATION 5 .
PUNCH
Grabar en una tarjeta perforada el valor de un registro, referenciado por su alias. Tenemos la posibilidad de saltar a una línea concreta una vez procesada la instrucción.
Formato:
PUNCH alias CARD [AND GO TO OPERATION línea] .
Ejemplo:
PUNCH B CARD .
PUNCH D CARD AND GO TO OPERATION 5 .
Excepción: Como evidentemente el programa no trabaja con tarjetas perforadas, se ha aprovechado esta instrucción para dar salida por pantalla y/o impresora al valor de un registro. Así, se muestra el nombre del alias de la tarjeta y una serie de “+” y “-“ que indica donde empieza la posición de cada variable y su correspondiente tamaño. A continuación se mostrarán los valores.
CLOSE-OUT
Cierra uno o varios fichero de salida, referenciados por el alias de la estructura asociada a ellos.
Formato:
CLOSE-OUT FILES registro [ ; registro] .
Ejemplo:
CLOSE-OUT FILES C .
CLOSE-OUT FILES C ; D .
REWIND
Rebobina uno o varios ficheros de entrada, referenciados por el alias de la estructura asociada a ellos.
Formato:
REWIND registro [ ; registro ] .
Ejemplo:
REWIND C .
REWIND C ; D .
Excepción: A falta de más información, esta instrucción cierra y vuelve a abrir el fichero correspondiente, posicionándose en el primer registro. También se permite rebobinar más de una cinta para igualarla al funcionamiento de CLOSE-OUT.
ADD
Sumar dos valores o variables, guardando el resultado en una variable de destino. Existe la posibilidad de redondear el resultado, y saltar a una línea concreta una vez procesada la instrucción o en el supuesto de provocar un overflow en la variable.
Formato:
ADD [AND ROUND] variable1/valor1 TO variable2/valor2 PLACE THE RESULT IN variable [IF OVERFLOW GO TO OPERATION línea / AND GO TO OPERATION línea] .
Ejemplo:
ADD AND ROUND 12.34 TO PRICE-OLD (B) PLACE THE RESULT IN PRICE-NEW (B) .
ADD 12.34 TO PRICE-OLD (B) PLACE THE RESULT IN PRICE-NEW (B) AND GO TO OPERATION 5 .
ADD 12.34 TO PRICE (B) PLACE THE RESULT IN PRICE-NEW (B) IF OVERFLOW GO TO OPERATION 5 .
Excepción: La condición “IF CHECK FAILS” se ha ignorado por desconocer en que consiste el chequeo.
SUBTRACT
Restar dos valores o variables, guardando el resultado en una variable de destino. El primer valor se resta del segundo. Existe la posibilidad de redondear el resultado, y saltar a una línea concreta una vez procesada la instrucción o en el supuesto de provocar un overflow en la variable.
Formato:
SUBTRACT [AND ROUND] variable1/valor1 FROM variable2/valor2 PLACE THE RESULT IN variable [IF OVERFLOW GO TO OPERATION línea / AND GO TO OPERATION línea] .
Ejemplo:
SUBTRACT AND ROUND 12.34 FROM PRICE-OLD (B) PLACE THE RESULT IN PRICE-NEW (B) .
SUBTRACT 12.34 FROM PRICE-OLD (B) PLACE THE RESULT IN PRICE-NEW (B) AND GO TO OPERATION 5 .
SUBTRACT 12.34 FROM PRICE (B) PLACE THE RESULT IN PRICE-NEW (B) IF OVERFLOW GO TO OPERATION 5 .
Excepción: La condición “IF CHECK FAILS” se ha ignorado por desconocer en que consiste el chequeo.
MULTIPLY
Multiplica dos valores o variables, guardando el resultado en una variable de destino. Existe la posibilidad de redondear el resultado, y saltar a una línea concreta una vez procesada la instrucción o en el supuesto de provocar un overflow en la variable.
Formato:
MULTIPLY [AND ROUND] variable1/valor1 BY variable2/valor2 PLACE THE RESULT IN variable [IF OVERFLOW GO TO OPERATION línea / AND GO TO OPERATION línea] .
Ejemplo:
MULTIPLY AND ROUND QUANTITY (B) BY PRICE-OLD (B) PLACE THE RESULT IN PRICE-NEW (B) .
MULTIPLY 12.34 BY PRICE-OLD (B) PLACE THE RESULT IN PRICE-NEW (B) AND GO TO OPERATION 5 .
MULTIPLY 12.34 BY PRICE (B) PLACE THE RESULT IN PRICE-NEW (B) IF OVERFLOW GO TO OPERATION 5 .
Excepción: La condición “IF CHECK FAILS” se ha ignorado por desconocer en que consiste el chequeo.
DIVIDE
Divide dos valores o variables, guardando el resultado en una variable de destino. El primer valor es el dividendo y el segundo valor es el divisor. Existe la posibilidad de redondear el resultado, y saltar a una línea concreta una vez procesada la instrucción o en el supuesto de provocar un overflow en la variable.
Formato:
DIVIDE [AND ROUND] variable1/valor1 INTO variable2/valor2 PLACE THE RESULT IN variable [IF OVERFLOW GO TO OPERATION línea / AND GO TO OPERATION línea] .
Ejemplo:
DIVIDE AND ROUND PRICE-OLD (B) INTO QUANTITY (B) PLACE THE RESULT IN PRICE-NEW (B) .
DIVIDE PRICE-OLD (B) INTO 12.34 PLACE THE RESULT IN PRICE-NEW (B) AND GO TO OPERATION 5 .
DIVIDE PRICE (B) INTO 12.34 PLACE THE RESULT IN PRICE-NEW (B) IF OVERFLOW GO TO OPERATION 5 .
Excepción: La condición “IF CHECK FAILS” se ha ignorado por desconocer en que consiste el chequeo.
STOP
Finaliza la ejecución del programa. Debe aparecer siempre como la última línea del programa, y no puede aparecer en ninguna otra línea.
ERRORES DEL FLOW-MATIC
A falta de una lista de errores “oficial” he creado una propia, inspirada en los del MATH-MATIC, para ayudar en la identificación de los errores que se pueden producir durante la ejecución de un programa. En ese caso, los “xxxx” se sustituye por el comando que ha producido el error y el “nnn” por el número de línea del programa.
xxxx - SENT. NO. nnn: SYNTAX ERROR.
Error de sintaxis en la línea del programa.
xxxx - SENT. NO. nnn: SENT REF MISSING.
Una instrucción de salto hace referencia a una línea inexistente.
xxxx - SENT. NO. nnn: VARIABLE MISSING.
Una línea hace referencia a una variable que no existe.
xxxx - SENT. NO. nnn: NUMBER ERROR.
Una instrucción espera un valor numérico.
xxxx - SENT. NO. nnn: OVERFLOW.
Una variable intenta almacenar un valor superior a su capacidad.
xxxx - SENT. NO. nnn: DIVISION BY ZERO.
La instrucción DIVIDE intenta hacer una división entre cero.
xxxx - SENT. NO. nnn: CALCULATE ERROR.
Error general en el módulo calculador.
xxxx - SENT. NO. nnn: INSTRUCTION UNKNOWN.
Se intenta ejecutar una instrucción desconocida.
SYSTEM RESTRICTION: STOP MISSING.
La última instrucción del programa debe ser STOP, y no puede aparecer en medio del programa.
SYSTEM RESTRICTION: FILE ERROR.
Error general al acceder a un fichero de datos.
SYSTEM RESTRICTION: TOO MANY VARIABLES.
No se pueden definir más variables.
SYSTEM RESTRICTION: VARIABLE TOO LONG.
El nombre de las variables no pueden tener más de 12 caracteres.
SYSTEM RESTRICTION: DECLARE SYNTAX ERROR.
Error al declarar una estructura de datos.
SYSTEM RESTRICTION: UNEXPECTED ERROR SENT. NO. nnn.
Error desconocido de carácter general.
CONSOLE: COMMAND ERROR.
Se intenta ejecutar una instrucción desconocida desde la consola.
CONSOLE: LINE NUMBER ERROR.
Número de línea errónea. El número debe estar comprendido entre 0 y 999.
TECLAS ESPECIALES
Hay una serie de teclas de función que proporcionan ayuda o ciertas características especiales. Están operativas en cualquier momento excepto durante la ejecución de un programa.
[F1] – Muestra una pantalla de ayuda (no se muestra por la impresora).
[F5] – Activa / Desactiva el modo teletipo por pantalla. Desactivado por defecto.
[F9] – Activa / Desactiva el uso de la impresora. Desactivado por defecto
[ESC] – Detiene la ejecución del programa (EXEC) o de un listado (LIST).
LIMITES DEL INTERPRETE
A falta de especificaciones “oficiales”, este interprete tiene las siguientes limitaciones:
- El programa tiene un tamaño máximo de 200 líneas de código.
- Las líneas pueden tener un tamaño máximo de 640 caracteres.
- Se pueden definir un máximo de 32 estructuras de datos.
- Se pueden definir un máximo de 200 variables. Esto comprende variables y estructuras.
- Los nombres de las variables no pueden tener más de 12 caracteres y deben empezar con una letra.
- Las variables pueden tener un tamaño máximo de 11 dígitos.
- Los cálculos se redondean a 2 decimales, y se eliminan las cifras no significativas.
- Se pueden gestionar un máximo de 10 ficheros. Uno por cada unidad UNISERVO.
- Los programas se pueden redactar desde el propio intérprete o desde un editor externo.
EJECUTANDO EL PROGRAMA
El programa FMATIC.EXE es una aplicación MS-DOS que funciona en cualquier sistema MS-DOS, Windows o virtualizado mediante programas tipo DOSBOX o VMWARE.
La podéis descargar de este enlace:
Para ejecutarlo, simplemente copiar los ficheros en una carpeta, pendrive o disquete, y añadir, si se desea, los fuentes .FMP (Flow-Matic Program) y ficheros de datos .FMD (Flow-Matic Data) de ejemplo.
Para una correcta visualización del modo teletipo, NO ejecutar en una ventana de CMD ó COMMAND de Windows. Usar el modo pantalla completa de MS-DOS o Windows (si lo permite), o el DOSBOX.
Para trabajar con la impresora, es recomendable configurarla para que no espere a un CR final para imprimir la línea completa. Con esto conseguiremos que se comporte como una auténtica máquina de escribir. El uso desde Windows y sus colas de impresión (SPOOL) puede afectar a la impresión.
El programa accede al fichero “FMATIC.INI” para configurar ciertas características:
Estos son los tres parámetros configurables:
display: Hay tres modos de video disponible: Negro/Blanco (0), Blanco/Negro (1) y Verde/Negro (2).
teletype: Si el valor es 1 los caracteres se muestran por pantalla simulando un teletipo.
printer: Si el valor es 1 todo lo que aparece en pantalla se imprime por la impresora (serie/paralelo).
PROGRAMAS DE EJEMPLO
El intérprete viene con dos programas de ejemplo:
INVENT
Este es el programa de ejemplo de FLOW-MATIC y usa dos ficheros de entrada, “FILE-A.FMD” y “FILE-B.FMD”, y genera dos ficheros de salida, “FILE-C.FMD” y “FILE-D.FMD”.
Básicamente lee los productos del fichero “FILA-A” y busca en “FILE-B” si existen. En caso afirmativo los graba en “FILE-C” y en caso contrario los graba en “FILE-D”.
PRICES
Este programa usa un fichero de entrada “PRICES-O.FMD” y genera uno de salida “PRICES-N”.
Básicamente lee los productos del fichero “PRICES-O” con su precio y los graba en el fichero “PRICES-N” con el precio original y un nuevo precio incrementado en un 3.5%.
Para ejecutar cualquiera de los dos ejemplos o posteriores programas, es tan simple como...
FMATIC (entrar en el intérprete)
LOAD INVENT (Cargar el programa)
EXEC (Ejecutar el programa)
Ó desde la línea de comandos del sistema operativo con...
FMATIC INVENT (Entrar en el intérprete cargando el programa)
EXEC (Ejecutar el programa)
Y PARA TERMINAR...
Insistir que esta es una versión inacabada de este lenguaje de programación.
Espero poderlo acabar algún día...
IMAGENES DEL INTERPRETE
Dedicado a la increible Grace
FLOW-MATIC Interpreter
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados