FOCAL (acrónimo de Formulating On-line Calculations in Algebraic Language , [ 1 ] o FORmula CALculator [ 2 ] ) es un lenguaje de programación interpretado interactivo basado en JOSS y utilizado principalmente en máquinas de la serie PDP de Digital Equipment Corporation (DEC) .
JOSS fue diseñado como un lenguaje interactivo que permitiera a usuarios sin conocimientos de programación escribir programas fácilmente. FOCAL es muy similar a JOSS en cuanto a los comandos que admite y la sintaxis general del lenguaje. Se diferencia en que muchas de las características avanzadas de JOSS, como los rangos y las funciones definidas por el usuario, se eliminaron para simplificar el analizador sintáctico y permitir que el sistema consumiera menos memoria. Algunas de las palabras reservadas (palabras clave) se renombraron para que todas comenzaran con una letra única. Esto permite a los usuarios escribir programas con instrucciones de un solo carácter, reduciendo aún más las necesidades de memoria. Esta fue una consideración importante en el PDP-8 , que a menudo estaba limitado a unos pocos kilobytes (KB).
Al igual que JOSS y, posteriormente , BASIC , FOCAL en el PDP-8 era un entorno completo que incluía un editor de línea , un intérprete y rutinas de entrada/salida . El paquete en su conjunto se denominó FOCAL-8 , que también se ejecutaba en el PDP-5 y el PDP-12 . Al portarse al PDP-11 , el FOCAL-11 resultante dependía del sistema operativo subyacente , RT-11 , para proporcionar soporte y edición de archivos. La definición del lenguaje se actualizó dos veces, a FOCAL-69 y a una versión ligeramente modificada, FOCAL-71 . También estaba disponible una versión para el Intel 8080 .
FOCAL es notable por ser el lenguaje en el que se escribieron las versiones originales de los primeros videojuegos Hamurabi y Lunar Lander . Ambos fueron posteriormente portados a BASIC, donde se hicieron mucho más conocidos. [ 3 ] FOCAL no fue popular fuera de la plataforma PDP y prácticamente desapareció durante la transición al VAX-11 . Tuvo un fuerte resurgimiento en la Unión Soviética , donde los clones del PDP-11 se utilizaron como computadoras educativas y domésticas ( serie BK ).
Historia
JOSS
JOSS se lanzó en mayo de 1963 en la computadora JOHNNIAC, un modelo único, en RAND Corporation . En RAND, su uso creció rápidamente, y la máquina, construida originalmente en 1953, pronto se quedó sin capacidad. JOHNNIAC fue desmantelada en 1966 y JOSS se reimplementó como JOSS-II en una PDP-6 recién adquirida , la primera máquina "grande" de Digital Equipment Corporation (DEC). El uso continuó creciendo y, para 1970, el sistema era utilizado por entre 500 y 600 usuarios en todo el país y había generado varias innovaciones, como terminales de computadora móviles que podían trasladarse de una habitación a otra y conectarse para un acceso rápido. [ 4 ]
JOSS tuvo una gran influencia. Surgió justo cuando se estaba introduciendo el tiempo compartido , cuando existía un gran interés en la interacción hombre-máquina y las computadoras se utilizaban cada vez más. Mientras que la mayoría de los sistemas operativos de tiempo compartido de la época se centraban en la gestión de cuentas de usuario y archivos, dejando que los usuarios se encargaran de su propia programación, JOSS proporcionaba edición de archivos y un lenguaje de programación en un solo paquete. RAND presentó el sistema a un grupo de personas de la industria. [ 4 ]
DEC consideró el PDP-6 un fracaso e inicialmente sugirió que abandonaría el mercado de las computadoras centrales. Sin embargo, poco después presentó el PDP-10 , que era un PDP-6 que utilizaba tecnología de semiconductores y encapsulado más modernos para producir un diseño mucho más simple y confiable de lo que, por lo demás, era una máquina casi idéntica. RAND permitió a DEC distribuir una versión de JOSS-II en estas máquinas bajo el nombre de "Diálogo Interpretativo Algebraico" o AID. [ 5 ]
FOCAL
El PDP-6 fue el primer ordenador central de DEC , y JOSS aprovechó al máximo su potencia y capacidad de memoria. Los programadores de DEC estaban familiarizados con el sistema y tenían interés en JOSS, pero la mayoría de los ordenadores que vendía DEC no tenían ni de lejos la potencia necesaria para ejecutarlo. Escrito por Richard Merrill , FOCAL eliminó características de JOSS según fuera necesario para poder ejecutarse en el espacio de memoria mucho más limitado del PDP-8 y otras máquinas de 12 bits de la gama de DEC. Para lograrlo, se realizó un cambio importante para reducir la cantidad de datos temporales, o estado , necesarios para analizar las instrucciones. Un efecto notable de esta decisión fue que las condicionales solo podían usarse para bifurcaciones , a diferencia de JOSS, donde las condicionales se pueden aplicar a cualquier instrucción.
Otro cambio notable fue la reorganización de las palabras clave para que cada una comenzara con una letra única. Esto simplificó el analizador , que solo necesitaba leer la primera letra del comando en una línea de código y luego podía avanzar al siguiente espacio en blanco . A continuación, lo comparaba con una lista interna de posibles palabras clave, de un carácter por entrada. En cambio, JOSS tenía que seguir leyendo hasta leer la palabra del comando completa y luego compararla con una lista que contenía palabras completas. Este cambio no solo ahorró memoria en el analizador, sino que los usuarios también podían ahorrar memoria escribiendo solo esa letra, reduciendo así el tamaño del código fuente .

La primera versión de FOCAL se lanzó en 1968 para el PDP-8 . Una versión actualizada le siguió al año siguiente, que más tarde se conoció como FOCAL-69. El sistema en su conjunto, independientemente de la versión, se conocía como FOCAL-8 cuando se portó a otras máquinas de la serie de 12 bits, incluidas el PDP-5 y el PDP-12 . Fue popular porque era muy eficiente en el uso de la memoria, que a menudo estaba severamente limitada en estas máquinas a unos pocos kilobytes (KB). El similar FOCAL-11 se ejecutaba en el PDP-11 bajo RT-11 .
Processor Technology también ofreció una versión de FOCAL 8k, con el módulo lunar incluido, para el sistema Altair 8800 basado en Intel 8080. Esta versión se proporcionaba por el precio de la copia de la cinta, mientras que el código fuente se ofrecía gratuitamente con otras compras. [ 6 ]
BÁSICO
Mientras que FOCAL se popularizaba en las máquinas DEC, BASIC se convertía en una alternativa cada vez más popular en otras plataformas. A finales de la década de 1960, varias compañías estaban ganando terreno en el mercado de las minicomputadoras , dominado por DEC , vendiendo máquinas similares que ejecutaban versiones de BASIC con tiempo compartido. Entre ellas destacaba la serie HP 2100 , que ejecutaba HP Time-Shared BASIC . [ 7 ]
David H. Ahl se había unido recientemente al Grupo PDP-8 de DEC, justo cuando la empresa se interesó en vender la máquina a entornos educativos. Debido a la popularidad de BASIC en el mercado educativo, especialmente con la creciente biblioteca de programas BASIC del Consorcio de Informática Educativa de Minnesota , a Ahl le resultó difícil vender la máquina con FOCAL a pesar de sus ventajas. [ 7 ] Como señaló más tarde:
El lenguaje FOCAL de DEC era igual a BASIC en la mayoría de los aspectos e incluso mejor en algunos, pero tenía un gran inconveniente: DEC no estaba dispuesta a licenciarlo a otros fabricantes de computadoras. FOCAL libraba una batalla cuesta arriba contra BASIC, que estaba disponible en computadoras GE, Honeywell, HP y otras. Creo que terminó en una situación similar a la de Sony con Betamax. Sony decía: "Betamax es nuestro y es un formato mejor que VHS", lo cual era cierto. Pero luego, JVC decía: "Tenemos VHS y Toshiba. Oye, ¿quieres usarlo? Perfecto, te lo licenciaremos por casi nada". [ 7 ]
Ahl se encargó personalmente de producir un sistema BASIC para la plataforma, contratando a una empresa que más tarde supo que era un solo programador en Brooklyn para producir una versión para el PDP-8 de 4 kW. DEC comenzó a vender versiones empaquetadas del PDP-8 con terminales y BASIC como la línea "EduSystem", con sistemas más grandes de la serie que incluían versiones ampliadas de BASIC y, en algunos casos, también FOCAL y FORTRAN . También se crearon algunos EduSystems basados en el PDP-11. [ 8 ]
Ahl comenzó entonces a portar programas de FOCAL a BASIC, en particular The Sumer Game (al que renombró Hamurabi ), una versión de Lunar Lander y muchas demos más pequeñas de FOCAL. Combinando sus adaptaciones con las contribuciones de programadores externos, logró recopilar suficiente material para que DEC publicara 101 BASIC Computer Games en 1973. El libro fue un éxito inmediato y finalmente tuvo tres ediciones hasta 1975. [ 9 ] [ 7 ]
A mediados de la década de 1970, BASIC era una característica estándar de todas las máquinas DEC y el uso de FOCAL desapareció. [ 9 ]
El renacimiento en la Unión Soviética
El PDP-11 fue clonado en la Unión Soviética en la década de 1970 con fines militares. En la década de 1980, se produjeron variantes de un solo chip similares al LSI-11 que dieron lugar a una serie de ordenadores domésticos compatibles con el PDP-11 . Entre los varios modelos, destacó la serie Electronika BK , lanzada en 1985. Inicialmente, estos se suministraban con FOCAL en un cartucho ROM , [ 10 ] mientras que un cartucho BASIC era un complemento opcional. Los modelos posteriores suministraban BASIC de forma predeterminada. [ 11 ]
Idioma
La siguiente descripción se basa en FOCAL-69 tal como aparece en el manual de referencia del lenguaje FOCAL-8. [ 12 ]
Modos directos e indirectos
FOCAL siguió el modelo JOSS para la interacción a través de una interfaz de línea de comandos . Esto permitía a los usuarios escribir comandos en "modo directo", que se ejecutaban inmediatamente, o anteponerles un número de línea, en cuyo caso se añadían al programa si eran únicos, o sobrescribían el código existente si ya se había utilizado el mismo número. [ 13 ]
El método de operación es similar al " modo inmediato " frente al "modo de programa" de BASIC . Contrasta con JOSS, en el que todos los comandos, tanto de programa como directos, se guardaban y cargaban como parte del espacio de trabajo del usuario. Esto permitía a JOSS tener comandos sin números de línea, que utilizaban para Formdefiniciones y otras tareas. FOCAL carecía de esta capacidad, por lo que las instrucciones que debían cargarse y guardarse se convirtieron en opciones de otros comandos del modo de programa, como Type. [ 13 ]
Declaraciones del programa
Cada línea en un programa FOCAL debe comenzar con un número de línea. Al igual que en JOSS, los números de línea son números de punto fijo que constan de dos enteros de dos dígitos separados por un punto. En FOCAL-8, los números de línea válidos van desde 1.01 hasta 31.99. Al imprimirse, usando WRITE, el equivalente en FOCAL al de BASIC LIST, se agregarán ceros iniciales; 1.10 se imprimirá como 01.10. Esto hace que todos los números de línea tengan cinco caracteres de longitud al imprimirse para que todos los números de línea se alineen. Las instrucciones que hacen referencia a esas líneas no necesitan los ceros iniciales, por ejemplo, GOTO 1.10. [ 14 ]
El número a la izquierda del punto se conoce como "número de grupo". Los grupos proporcionan cierto nivel de organización del código que falta en lenguajes como Fortran o BASIC. Su uso principal era utilizar un grupo como una subrutina que se podía llamar con DO, por ejemplo, DO 5saltará a la subrutina escrita en el grupo 5. El editor también los utilizaba durante la edición; por ejemplo, se podía WRITE 2generar un listado del código en el grupo 2 o ERASE 4eliminar todas las líneas del grupo 4. [ 14 ]
Cada línea debe comenzar con una palabra clave de comando seguida del número de línea. [ 14 ] No existe el concepto de "comando predeterminado" como en BASIC con su LETinstrucción opcional. Se pueden colocar varias instrucciones en una sola línea, separadas por punto y coma. Por lo general, el comportamiento no difiere del que se obtendría si las instrucciones estuvieran en líneas separadas, excepto en el caso de los bucles FOR. [ 15 ]
Comandos
PREGUNTAR
El ASKcomando (abreviatura A) tomará una lista de cadenas y variables, mostrará las cadenas y almacenará la entrada del usuario en variables. [ 16 ] Equivalente a BASIC INPUT.
01.01 PREGUNTA "NOMBRE", NOMBRE 01.02 PREGUNTAR "COORDENADAS", X, Y 01.03 PREGUNTAR "A1",A1,"OMEGA",W,"T0",T0,"FACTOR DE AMORTIGUACIÓN",FACTOR DE AMORTIGUACIÓN
Si el usuario no introduce un número sino texto, el sistema convertirá el carácter inicial en un número, donde "A"=1, "B"=2, etc.
COMENTARIO
El COMMENTcomando (abreviatura C) crea un comentario. [ 17 ] Equivalente a REM. El manual original lo enumera CONTINUEcomo sinónimo de COMMENT, usado para marcar líneas vacías, pero esto no tiene diferencia interna. [ 18 ]
01.01 COMENTARIO: EL JUEGO DE VERANO, DE RICHARD MERRILL
HACER
El DOcomando (abreviatura D) ramifica la ejecución a una subrutina. Es el equivalente de BASIC GOSUB. La subrutina se referencia mediante el número de grupo o el número de línea. Si se proporciona un número de línea, se ejecuta esa única línea y luego regresa automáticamente para continuar la ejecución en la instrucción posterior a DO. Si no se proporciona ningún número de línea, la ejecución comienza en la primera línea del bloque y continúa hasta que se alcanza el final del bloque. RETURNes compatible, pero solo es necesario para regresar anticipadamente del grupo; no es necesario al final del grupo. [ 19 ]
01.15 DO 7.24 01.16 DO 8
PARA
El FORcomando (abreviado F) implementa un bucle for . Cuando se especifican tres argumentos, el primero es el valor inicial de la variable del bucle, el segundo es el incremento y el tercero es el valor final del bucle. Si solo se proporcionan dos valores, el primero es el valor inicial y el segundo el valor final, y el incremento se establece en 1. Este es el patrón de los bucles de FORTRANDO , a diferencia de BASIC, FORdonde el incremento es el último valor, si lo hay.
A diferencia de otras partes del lenguaje donde varias instrucciones en una línea son independientes, FORsiempre ejecuta las instrucciones que le siguen en la línea antes de que se alcance la terminación, y luego continúa en la siguiente línea. Por lo tanto, los bucles deben estar en una sola línea, o bien, llamar a una subrutina con DO. No existe un equivalente al de BASIC NEXT. [ 15 ]
01.01 PARA X=1,10; TIPO X,! 01.02 PARA X=0,10,100; HACER 2
Un ejemplo de bucle FOR:
01.10 PREGUNTE "¿CUÁNTO DINERO DESEA PEDIR PRESTADO?", DIRECTOR 01.20 PREGUNTE "¿DURANTE CUÁNTOS AÑOS?", PLAZO 01.30 PARA TASA=4.0,.5,10;HACER 2.0 01.40 SALIR 02.10 ESTABLECER INTERÉS = CAPITAL * (TASA / 100) * PLAZO 02.20 TIPO "TAF",TAF,","INTERÉS",INTERÉS,!
IR A
El GOTOcomando (abreviatura G) salta la ejecución del programa al número de línea especificado. [ 19 ] Es idéntico a la instrucción del mismo nombre en BASIC. En FOCAL, GOTOtambién se usa para iniciar la ejecución, como en BASIC RUN, pero en este caso, la documentación se refiere a él como GOen lugar de GOTOa pesar de que el comando subyacente es el mismo.
01.05 IR A 1.01 02.90 TIPO !!,"INTÉNTALO DE NUEVO.",!!!!!;IR A 1.1
SI
El IFcomando (abreviatura I) proporciona una bifurcación condicional basada en el signo de la expresión. Después de la expresión numérica, el comando IF puede tomar de uno a tres números de línea. Si la expresión es menor que cero, la ejecución se bifurca al primer número de línea; si es igual a cero, al segundo número de línea; si es mayor que cero, al tercero número de línea. El lenguaje carecía de operadores relativos como mayor que, igual que o menor que. Para bifurcar si X > 5, se debe comparar X - 5. [ 20 ]
02.20 SI (25-25) 2.4,2.3,2.4 03.01 SI (X) 3.1,3.02,3.1
La función IF se puede abreviar colocando un punto y coma (o fin de línea) después del primer número de línea. Por ejemplo:
02.20 SI (X)1.8; TIPO "Q" 02.30 SI (X)1.8,2.50 02.40 TIPO "P"
En este caso, la prueba en 2.20 hará que el programa salte a la línea 1.8 si la prueba es negativa; de lo contrario, continuará y escribirá "Q" en la consola. La línea 2.30 saltará a 1.8 o 2.5 si el valor es negativo o cero; de lo contrario, continuará escribiendo "P" en la consola. [ 20 ]
ABANDONAR
El QUITcomando (abreviatura Q) finaliza la ejecución del programa y devuelve el control al entorno de edición. [ 17 ]STOP Equivalente a o de BASIC END.
01.10 PARA X=-10,1,10; TIPO X 01.20 SALIR
DEVOLVER
El RETURNcomando (abreviatura R) ramifica la ejecución de una subrutina de vuelta a la ubicación de llamada. [ 17 ] El uso de RETURNes opcional en la última línea de una subrutina; una subrutina regresa en la última línea del grupo de todos modos. A continuación se muestra una subrutina de ejemplo para convertir una solicitud de sí/no en un valor.
22.78 COMENTARIO: SUBRUTINA 'SÍ O NO' 22.80 PREGUNTE "¿RESPONDA SÍ O NO?",UN 22.82 SI (AN-0SÍ)22.84,22.86 22.84 SI (AN-0NO)22.8,22.88,22.8 22.86 ESTABLECER X=2;RETORNAR 22.88 ESTABLECER X=1;RETORNAR
COLOCAR
El SETcomando (abreviatura S) asigna los resultados de una expresión a la variable especificada. [ 21 ] Equivalente a BASIC LET.
01.30 ESTABLECER PI=3.14156 01.60 INTERÉS ESTABLECIDO = CAPITAL * (TASA / 100) * PLAZO
TIPO
El TYPEcomando (abreviatura T) permite la salida de uno o más elementos separados por comas. [ 22 ] Equivalente a BASIC PRINT.
Los elementos pueden ser variables, cadenas literales entre comillas dobles o diversos caracteres de control. Los caracteres de control incluyen para !generar un retorno de carro y un salto de línea, #para el retorno de carro únicamente y :para el carácter de tabulación. Los caracteres de control se pueden combinar; por ejemplo, !!!generará tres CR/LF sin necesidad de separarlos con comas. [ 16 ]
TIPO [NÚMEROS, E1, "TEXTO", !, #, :, $ O %] ...SALIDA 01.10 ESCRIBE "HOLA, GUAPO/A. ¿CUÁNTO DINERO QUIERES PEDIR PRESTADO?",! 01.50 TIPO "INTERÉS",INTERÉS,! 01.80 TIPO "EL INTERÉS POR", PLAZO," AÑOS,"!,"ES", INTERÉS, " DÓLARES.",!! 01.90 TIPO "NUEVA YORK",!,"WASHINGTON",!,"ATLANTA",!,"DALLAS",! 02.10 TIPO "X",X,"","X^2",X^2,"","SQRT",FSQT(X) 03.20 TIPO ".",# 02.20 TIPO !!!!!
TYPETambién se incluyó un especificador de formato opcional indicado mediante el formato %x.yz, donde x es el número de dígitos a la izquierda del punto decimal e yz es el número de dígitos a la derecha del punto. El formato predeterminado era %8.4, lo que significa un máximo de ocho dígitos y cuatro a la derecha del punto. [ 23 ] Por ejemplo:
CONJUNTO A=67823 TIPO %6.01,A = 67823.0 TIPO %5,A = 67823 TIPO %8.03,A = 67823.000 TIPO %,A = 6,7823E4
Nótese el espacio inicial adicional en algunos ejemplos, que rellena el ancho definido. El uso de % por sí solo provocó que la salida se imprimiera en "formato de punto flotante" utilizando la E. [ 24 ]
Se utilizó un carácter de control especial $que imprimía una tabla con todas las variables definidas y sus valores. Solo se imprimían las dos primeras letras del nombre, rellenadas con un cero si era necesario. Los elementos de los arrays se imprimían en líneas separadas y las variables con un solo elemento se indexaban (00). Por ejemplo: [ 25 ]
TIPO $ A0(00)=67823
Variables
Los nombres de las variables pueden comenzar con cualquier letra excepto F (F está reservada para funciones) y pueden contener cualquier secuencia de letras y números. Sin embargo, solo los dos primeros caracteres son significativos. Por ejemplo, el siguiente fragmento de código de FOCAL: A New Conversational Language [ 26 ] se refiere a la misma variable como DESTINATION y luego como DES. Internamente, ambas referencias se refieren a una variable denominada DE:
01.80 PREGUNTAR DESTINO 02.30 IF (DES-14) 2.4,3.1,2.4
Cualquier variable puede tratarse como una matriz, permitiendo subíndices desde -2048 hasta 2047.
Matemáticas
FOCAL contenía cinco operadores matemáticos: [ 27 ]
^Para los exponentes, el exponente se convierte a un entero de 12 bits.*para la multiplicación/para división+para añadir-para resta
Una peculiaridad de la versión de FOCAL de 1968 era que los operadores tenían precedencia independiente, como en el orden anterior. Si bien esto se aplica a la exponenciación, la multiplicación y la división, existe cierta ambigüedad en el manual de FOCAL de 1968 con respecto a la suma y la resta. Específicamente, se proporcionan ejemplos que demuestran la precedencia de los operadores para la multiplicación y la división, pero faltan ejemplos que demuestren la precedencia de los operadores para la suma y la resta. Sin embargo, la interpretación literal del manual de FOCAL de 1968 sugiere que la fórmula SET T=2-3+1se evaluaría en el orden 2-(3+1) y, por lo tanto, produciría -2. Esto era muy diferente a la mayoría de los lenguajes, donde + y - tenían la misma precedencia y se evaluarían (2-3)+1 para producir 0. [ 27 ] Esto puede causar errores sutiles al convertir el código fuente de FOCAL a otros sistemas.
Sin embargo, los signos + y - tienen la misma precedencia en FOCAL-69 y FOCAL-71, por lo que SET T=2-3+1el resultado es 0, como era de esperar.
FOCAL era inusual porque las expresiones matemáticas podían usar (), [] y <> indistintamente en pares coincidentes para establecer precedencia. [ 27 ] Por ejemplo, la siguiente es una expresión válida:
01.30 ESTABLECER A=<10*[5+1]*(1+5)>
Todos estos tienen el mismo nivel de precedencia y se leen de izquierda a derecha cuando están en el mismo nivel, por lo que esta instrucción se evaluará [], luego (), luego <>, para producir 360. [ 27 ]
El lenguaje contenía las siguientes funciones integradas: [ 28 ]
FABS()– Valor absolutoFATN()– ArcotangenteFCOS()– Coseno del argumento en radianesFEXP()– Base natural para la fuerza del argumentoFITR()– Parte entera del argumentoFLOG()– Logaritmo naturalFRAN()– Número aleatorioFSGN()– Signo del argumento; FSGN(0)=1 en FOCAL-69, pero FSGN(0)=0 en FOCAL-71 y versiones posteriores.FSIN()– Seno de un ángulo dado en radianesFSQT()– Raíz cuadrada
Funciones de caracteres
FOCAL-71 añadió dos nuevas funciones para introducir valores de un solo carácter, similares a ASK pero que devuelven valores ASCII.
FINSe detiene hasta que el usuario escribe un carácter y luego devuelve el código ASCII.FOUTEnvía el valor ASCII como un carácter a la consola o a un archivo.
Otras funciones
FOCAL también incluía varias funciones de propósito especial: [ 29 ]
FADCLee un valor de los convertidores analógico-digitales del PDP-8, con el número de canal como parámetro.FDIStraza en una ubicación Y determinadaFDXStraza en una ubicación X determinada
Comandos de entorno
Programas de carrera
FOCAL se usa GOTOen el editor para iniciar un programa. Sin embargo, una regla general era abreviarlo a GO. Esto es el equivalente de RUNen BASIC. GOTOTambién se puede usar en el editor para iniciar la ejecución en una línea específica.
Comandos de edición
Se insertan nuevas líneas en un programa simplemente comenzando el comando con un número de línea. Los comandos de edición fueron ERASE(abreviatura E), [ 27 ]MODIFY (abreviatura M), [ 30 ] y WRITE(abreviatura W): [ 16 ]
ERASE– poner a cero todas las variables; esto se usa a veces en los programas para reiniciarlas.ERASE line number– elimina la instrucción en una línea específicaERASE group number– eliminar todas las declaraciones en un grupo específicoERASE ALL– eliminar un programa completoMODIFY line number– permite editar una línea específicaWRITE line number– mostrar la instrucción en una línea específicaWRITE group number– mostrar todas las declaraciones en un grupo específicoWRITE ALL– mostrar un programa específico
Comandos de archivo
El comando de archivo fue OPEN (abreviatura O):
OPEN INPUT [device:][file][,ECHO]– prepárese para leer desde el principio de un archivo.OPEN OUTPUT [device:][file][,ECHO]– prepárese para escribir desde el inicio de un archivoOPEN RESTORE INPUT[,ECHO]– reanudar la entradaOPEN RESTORE OUTPUT[,ECHO]– reanudar salidaOUTPUT CLOSE– mostrar el búfer y cerrar un archivo
Comandos de la biblioteca
FOCAL incluía la capacidad de gestionar colecciones de programas FOCAL como una biblioteca de código. Los programas podían llamar a otros programas en cadena usando LIBRARY CALL, o llamar a una sola subrutina en otro programa usando LIBRARY GOSUB. Los nombres de los programas podían tener seis caracteres de longitud. El comando LIBRARY (abreviatura L) tenía los siguientes subcomandos:
LIBRARY DELETE [device:]program name– eliminar un programaLIBRARY LIST [device:][file name]– catálogoLIBRARY RUN [device:]program name [line number]– encadenar un programa, reanudando opcionalmente en un número de línea específico.LIBRARY SAVE [device:]program name– guardar un programaLIBRARY EXIT– Volver al programa de monitorización PDP-8
FOCAL-71 añadido:
LIBRARY CALL [device:]program name– cargar un programaLIBRARY GOSUB [device:]program name [group number]– llamar a una subrutina en un programa externo
Códigos de error
Dado que el intérprete carecía de suficiente espacio de memoria para almacenar mensajes de error, o incluso una tabla de números de error, FOCAL utilizó una solución alternativa informando la dirección del código de detección de errores como un número de punto fijo. Por ejemplo, si se detectaba un error de división por cero , informaría ?28.73 @ 01.10, donde 28.73 representa el código que verifica este error en la página de memoria 28 más un desplazamiento de 73 palabras, y 01.10 es el número de línea donde ocurrió el error. Las páginas en el PDP-8 tenían 128 bytes de longitud, por lo que esta dirección se traduce a la ubicación 3657.
Cambios entre versiones
DEC lanzó tres versiones de FOCAL para la serie PDP-8: la original, conocida simplemente como FOCAL, y dos versiones actualizadas, FOCAL,1969 y FOCAL,1971. FOCAL,1969 era prácticamente idéntica a la original, pero FOCAL,1971 supuso una importante actualización que incorporó gestión de archivos, nuevas funciones matemáticas y otros cambios. A diferencia de las dos primeras versiones, que eran sistemas independientes, FOCAL,1971 se basaba en el incipiente sistema operativo OS/8 (entonces todavía conocido como PS/8) y dependía en mayor medida de este sistema operativo para la gestión y edición de archivos.
FOCAL, 1971
Un cambio en la nueva versión fue un paquete matemático de 10 dígitos para mayor precisión. La FSGNfunción ahora devolvía cero si la expresión de entrada se evaluaba como cero. Anteriormente, devolvía uno. FRANAhora se utilizaba un algoritmo mejor que producía números distribuidos de forma más aleatoria. También se añadió la nueva FINfunción que tomaba una cadena y devolvía su valor ASCII (similar a la de BASIC ASC) y FOUTque tomaba un número y devolvía una cadena con ese carácter ASCII ( CHR).
Como todas estas opciones consumían memoria limitada, al iniciarse, FOCAL,1971 mostraba un cuadro de diálogo que preguntaba al usuario qué funciones deseaba utilizar.
Comparación con JOSS
FOCAL es, en esencia, una versión simplificada de JOSS con cambios que hacen que la sintaxis sea más concisa y fácil de analizar. Casi todos los comandos de FOCAL tienen una correspondencia uno a uno con JOSS y solo difieren en detalles. El cambio más evidente a primera vista es que JOSS no distingue entre mayúsculas y minúsculas y muestra las palabras clave en mayúsculas y minúsculas, mientras que FOCAL solo usa mayúsculas. Además, las instrucciones de JOSS terminan con un punto, lo que les da una apariencia de sentencias escritas, mientras que FOCAL no requiere un final de línea.
Una diferencia importante es que JOSS incluía un conjunto completo de operaciones de comparación y un sistema de lógica booleana que operaba dentro ifde las forconstrucciones. Además, se podían aplicar bifurcaciones y bucles a cualquier instrucción, a diferencia de FOCAL, donde la única operación que se podía realizar era el equivalente a un goto. Por ejemplo, en JOSS se podía:
1.10 Tipo A si X>10. 1.20 Tipo i para i=1(1)10.
La primera línea imprime opcionalmente A según el valor de X, y la segunda imprime los números del 1 al 10. En cambio, FOCAL carecía de la capacidad de comparar valores, y los bucles se aplicaban saltando a la siguiente línea al finalizar. El código equivalente en FOCAL sería:
1.10 SI (X-10),,1.30 1.20 ¡TIPO A! 1.30 PARA I=1,1,10; TIPO I,!
La implementación de JOSS facilita la creación de construcciones comunes y las hace más acordes con las intenciones del programador, aunque a costa de aumentar la complejidad del entorno de ejecución. Por ejemplo, JOSS permitía describir rangos en bucles de forma flexible, como 1,2,3,10(5)50,75,78. Esta flexibilidad tiene un precio: en FOCAL, el inicio, el final y el paso se pueden escribir en una estructura personalizada en memoria y actualizar fácilmente durante la ejecución del bucle, mientras que JOSS requiere que se reevalúe una expresión que puede ser, aunque a menudo no lo es, más compleja.
Para que el código de FOCAL fuera más conciso, los cambios fueron relativamente menores. Por ejemplo, JOSS Do part 20.se convierte en el ligeramente más pequeño FOCAL DO 20, mientras que Do step 20.1se convierte en DO 20.1. Las palabras clave de comando también se acortaron donde fue posible, por lo que JOSS Demandse convierte en FOCAL ASK, tanto para hacerlo más corto como para permitir que la letra D se use exclusivamente para DO.
Para simplificar el analizador, se eliminaron algunas construcciones de JOSS. Por ejemplo, JOSS podía realizar múltiples asignaciones con Set S=P, P=Q, Q=S.mientras que en FOCAL estas debían hacerse como declaraciones individuales, SET S=P; SET P=Q; SET Q=S. Del mismo modo, el , utilizado por JOSS Formpara formatear la salida, se combinó con el de FOCAL TYPEcon el %.
Comparación con BASIC
Las comparaciones entre FOCAL y BASIC eran inevitables, ya que ambos lenguajes eran comunes en los miniordenadores de la misma época, y comparten muchas similitudes en sintaxis y estructura. En la mayoría de los casos, existe una conversión directa de código FOCAL a BASIC y viceversa. Por ejemplo, para solicitar a un usuario que introduzca un valor, en FOCAL se haría lo siguiente:
PREGUNTA "¿Cuál es tu edad?",EDAD
mientras que en BASIC el equivalente es:
ENTRADA "¿Cuál es tu edad?" , EDADA excepción de algunas características que faltaban en uno u otro, y algunas diferencias relativamente menores en la sintaxis, los dos lenguajes son muy similares.
Una excepción notable es IFen BASIC, que permitía colocar cualquier instrucción después de THEN, haciéndolo más similar a las estructuras de control de JOSS. BASIC invirtió el orden del código en comparación con JOSS, colocando la expresión condicional al principio de la línea en lugar de al final; en BASIC se usa IF this THEN thatmientras que JOSS usaba that IF this. El de FOCAL era más como el goto calculadoIF de BASIC , , pero permitía cualquier número de líneas como destinos, a diferencia de solo tres para negativo, cero y positivo como en FOCAL.ONXGOTO10,20,30ON...GOTO
Otra diferencia importante entre ambos es que FOCAL carecía de soporte nativo para cadenas de caracteres como elementos de datos asignables a variables. Al igual que en las primeras versiones de BASIC o FORTRAN antes de la incorporación de cadenas (en F77), esta limitación se solía evitar mediante el uso de cadenas literales en los comandos de entrada y salida. El problema solo se convertía en algo significativo al manipular cadenas individuales o caracteres dentro de ellas.
Como no se admitían variables de cadena, la entrada de una cadena utilizaba una solución chapucera que convertía cualquier carácter escrito por el usuario a su valor numérico. Por ejemplo, si se escribía HELLOuna instrucción de entrada, FOCAL convertía la H en "8", el valor numérico de "H" en los códigos de caracteres de seis bits del PDP-8 ("H" es la octava letra). Luego interpretaba la "E" como el inicio de un exponente, y luego intentaba calcular "8" elevado a la potencia "LLO", lo que tomaba varios segundos de tiempo de CPU y daba como resultado un valor de 0,76593020E+103, una respuesta poco útil. Sin embargo, al hacer preguntas que se respondían con respuestas de una sola letra, como "¿Necesita instrucciones, S o N?"Los programadores podían probar el resultado comparándolo con valores de caracteres conocidos para producir lo que parecía una entrada de caracteres."
Anteponer un cero a una cadena la convertiría en numérica, por lo que los programas podrían comprobar cadenas multicaracteres específicas usando sentencias IF, como I (A-0BROWN) 1.00,2.00,1.00la que redirigiría a 2.00 si A = "MARRÓN" o a 1.00 en caso contrario. Sin embargo, el programa generaría un error de desbordamiento si el usuario introdujera texto con caracteres 'E' mal ubicados. Por ejemplo, se podría comprobar si se trata de "MARRÓN" o "ROJO", pero no de "VERDE" o "AMARILLO".
La implementación de FOCAL para PDP-8 utilizaba una representación de punto flotante que representaba los números como cuatro palabras de 12 bits, cuarenta y ocho bits en total, con treinta y seis bits de mantisa y doce bits de exponente. Esto permitía una precisión significativamente mayor y un rango de valores mucho más amplio que la mayoría de los intérpretes contemporáneos, lo que convertía a FOCAL en una opción razonable para trabajos numéricos serios. Esta alta precisión, junto con buenas opciones para el formato de salida decimal predeterminado, significaba que las dificultades con el redondeo de binario a decimal no eran evidentes para los usuarios principiantes. En comparación, Microsoft BASIC inicialmente utilizaba un formato de 32 bits , mientras que las versiones posteriores lo ampliaron a 40 bits. La mayoría de las versiones de BASIC tenían problemas con el redondeo que provocaban que ecuaciones simples dieran como resultado pequeños restos distintos de cero.
En general, se acepta que FOCAL era más eficiente en el uso de recursos que los sistemas BASIC comparables. En una máquina típica de la época, que solía tener entre 6 y 24 kilobytes de memoria de núcleo magnético , FOCAL podía manejar tareas de programación más grandes y complejas que BASIC.
Versiones y derivados
La Corporación Coca-Cola utilizó una versión personalizada de FOCAL llamada COKE.
Posteriormente, FOCAL se implementó en los procesadores PDP-7, PDP-9, PDP-10, PDP-11, PDP-12, PDP-5 y LINC-8.
El manual de FOCAL mostraba cómo agregar comandos al analizador de FOCAL, por lo que muchos sitios agregaron comandos especializados para operar hardware personalizado.
La Sociedad de Usuarios de Computadoras para Equipos Digitales (Digital Equipment Computer Users' Society) recopiló numerosos parches y mejoras para FOCAL. Incluso surgieron versiones mejoradas de FOCAL, como FOCAL-W, que añadía muchas funciones, incluyendo una mejor entrada/salida de archivos de almacenamiento masivo e incluso memoria de variables virtuales.
A mediados de la década de 1970, DELTA era una versión más sofisticada de FOCAL. Los números de línea del programa iban del 00 al 99 ("partes") y del 000000 al 999999 ("pasos"), ejecutados en orden alfanumérico. DELTA contaba con algunos comandos especializados para el osciloscopio Tektronix 4010/14.
En Rusia , se siguió utilizando hasta principios de la década de 1990 en ordenadores domésticos de producción masiva de la serie Electronika BK .
Microsoft vendió una versión de FOCAL suministrada en cinta de papel. [ 31 ] Según Raymond Chen, la cinta maestra está perdida y FOCAL ya no está disponible.
Código de ejemplo
El módulo lunar original constituye un excelente ejemplo para examinar el código FOCAL, ya que utiliza la mayoría de las características del lenguaje. Este código proviene del original y se encuentra en la página del módulo lunar de Jim Storer . [ 32 ]
01.04 T "CONTROL DEL MÓDULO LUNAR. ¡SE REQUIERE CONTROL MANUAL!" 01.06 T "¡PUEDE RESTABLECER LA TASA DE COMBUSTIBLE K CADA 10 SEGUNDOS A 0 O A CUALQUIER VALOR!" 01.08 T "ENTRE 8 Y 200 LIBRAS/SEG. TIENES 16000 LIBRAS DE COMBUSTIBLE. ¡ESTIMADO!" 01.11 T "TIEMPO DE IMPACTO EN CAÍDA LIBRE: 120 SEGUNDOS. PESO DE LA CÁPSULA: 32500 LIBRAS"! 01.20 T "¡PRIMERA COMPROBACIÓN DE RADAR PRÓXIMAMENTE!";E 01.30 T "¡COMIENCE EL PROCEDIMIENTO DE ATERRIZAJE!" TIEMPO, SEGUNDOS ALTITUD," 01.40 T "MILLAS+PIES VELOCIDAD,MPH COMBUSTIBLE,LBS TASA DE COMBUSTIBLE"! 01.50 SA=120;SV=1;SM=32500;SN=16500;SG=.001;SZ=1.8 02.10 T " ",%3,L," ",FITR(A)," ",%4,5280*(A-FITR(A)) 02.20 T %6.02", ",3600*V", ",%6.01,MN," K=";AK;ST=10 02.70 T %7.02;I (200-K)2.72;I (8-K)3.1,3.1;I (K)2.72,3.1 02.72 T "NO ES POSIBLE";FX=1,51;T "." 02.73 T "K=";AK;G 2.7 03.10 I (MN-.001)4.1;I (T-.001)2.1;SS=T 03.40 I ((N+S*K)-M)3.5,3.5;SS=(MN)/K 03.50 D 9;I (I)7.1,7.1;I (V)3.8,3.8;I (J)8.1 03.80 D 6;G 3.1 04.10 T "COMBUSTIBLE AGOTADO A LAS",L," SEGUNDOS"! 04.40 SS=(FSQT(V*V+2*A*G)-V)/G;SV=V+G*S;SL=L+S 05.10 T "EN LA LUNA A",L," SEGUNDOS"!;SW=3600*V 05.20 T "VELOCIDAD DE IMPACTO DE",W,"MPH"!,"COMBUSTIBLE RESTANTE:"MN," LBS"! 05.40 I (1-W)5.5,5.5;T "¡ATERRIZAJE PERFECTO!-(¡SUERTE!)";G 5.9 05.50 I (10-W)5.6,5.6;T "BUEN ATERRIZAJE-(PODRÍA SER MEJOR)";G 5.9 05.60 I (22-W)5.7,5.7;T "¡FELICIDADES POR UN ATERRIZAJE DEFICIENTE!";G 5.9 05.70 I (40-W)5.81,5.81;T "DAÑOS A LA EMBARCACIÓN. ¡BUENA SUERTE!";G 5.9 05.81 I (60-W)5.82,5.82;T "ATERRIZAJE DE ACCIDENTE: ¡TIENES 5 HORAS DE OXÍGENO!";G 5.9 05.82 T "LO SIENTO, PERO NO HUBO SUPERVIVIENTES, ¡LO ARRUINASTE!""EN " 05.83 T "HECHO QUE HAS CREADO UN NUEVO CRÁTER LUNAR",W*.277777," PIES DE PROFUNDIDAD." 05.90 T !!!!"¿INTENTAR DE NUEVO?"! 05.92 A "(RESPUESTA SÍ O NO)"P;I (P-0NO)5.94,5.98 05.94 I (P-0SÍ)5.92,1.2,5.92 05.98 T "¡CONTROL FUERA!";Q 06.10 SL=L+S;ST=TS;SM=MS*K;SA=I;SV=J 07.10 I (S-.005)5.1;SS=2*A/(V+FSQT(V*V+2*A*(GZ*K/M))) 07.30 D 9;D 6;G 7.1 08.10 SW=(1-M*G/(Z*K))/2;SS=M*V/(Z*K*(W+FSQT(W*W+V/Z)))+.05;D 9 08.30 I (I)7.1,7.1;D 6;I (-J)3.1,3.1;I (V)3.1,3.1,8.1 09.10 SQ=S*K/M;SJ=V+G*S+Z*(-QQ^2/2-Q^3/3-Q^4/4-Q^5/5) 09.40 SI=AG*S*S/2-V*S+Z*S*(Q/2+Q^2/6+Q^3/12+Q^4/20+Q^5/30)
El programa está claramente separado en muchas subrutinas. Esto era casi universal en los programas FOCAL (y JOSS), ya que el esquema de numeración de líneas hacía que tales construcciones fueran fáciles de usar. Este programa usa nueve rutinas. La primera, grupo 1, simplemente imprime las instrucciones usando la Tinstrucción ype y establece los valores iniciales para la ejecución. La masa de combustible no se registra directamente, en su lugar, usa la Mmasa actual y vacía, N, por lo que el combustible restante es M-Ny el módulo de aterrizaje se queda sin combustible cuando M-Nes 0. También observe el Erase al final de la línea 01.20 , que restablece todos los valores de las variables.
El bucle principal del juego es impulsado por el grupo 2. A medida que el código "cae" a través del grupo 1 hacia el grupo 2 durante la primera ejecución, los valores iniciales se imprimen en las dos primeras líneas. Cerca del final de la línea 02.20 , se le pide al usuario Aque ingrese la tasa de quema como K, y luego el temporizador del bucle se reinicia usando S T=10. La línea 02.70 prueba la entrada del usuario contra varias posibilidades, si es mayor que 200 o menor que 8 escribe "IMPOSIBLE" y una fila de puntos, y luego vuelve a pedirle al usuario que lo intente de nuevo. Si el valor está entre estos valores, salta al grupo 3. Tenga en cuenta que las capacidades limitadas del IFcomando de FOCAL son evidentes aquí; en BASIC esto podría reducirse a un soloIFK>200ORK<8THEN...
El grupo 3 primero comprueba si el combustible se ha agotado y, si es así, salta al grupo 4. A continuación, comprueba si el período de 10 segundos Tha expirado y, si es así, vuelve a 02.10 e imprime todo de nuevo, lo que tiene el efecto secundario de restablecer T y S a 10. La línea 03.40 comprueba si la cantidad de combustible quemado en este período, , reducirá la masa del vehículo en su conjunto, , más allá del peso en vacío, N. Si no, continúa; si lo hará, en su lugar establece el temporizador del bucle en la cantidad de tiempo que el combustible restante se quemará, terminando así el bucle antes de tiempo. En cualquier caso, llama al grupo 9 para actualizar la velocidad y la posición. A continuación, repite los grupos 7, 8 y 9 hasta que el valor de I converge.S*KS*K-M
Cuando se agota el temporizador de 10 segundos, o llega al final debido a la prueba de combustible en la línea 03.10 o la prueba de altitud en 07.10 . En estos últimos casos, saltará al grupo 4 y luego pasará al grupo 5, o saltará directamente al grupo 5. El grupo 5 escribe los resultados del final del juego y luego le pregunta al usuario si desea intentarlo de nuevo. Si es así, salta a 01.20 para borrar todos los valores e imprimir los encabezados nuevamente, si no es así, pasa a 05.98 y Qsale.
Véase también
Referencias
- ↑ Manual 1968 , pág. 1.1.
- ↑ DIC, 1957 hasta la actualidad (PDF) . DIC. 1978. pág. 38.
- ↑ McCracken, Harry (29 de abril de 2014). "Cincuenta años de BASIC, el lenguaje de programación que personalizó las computadoras" . Time . Archivado del original el 5 de febrero de 2016. Consultado el 12 de febrero de 2016 .
- 1 2 Marks, Shirley (diciembre de 1971). Los años de JOSS: reflexiones sobre un experimento (PDF) (Informe técnico). Rand.
- ↑ Programación conversacional con AID (PDF) . DIC. 1970. pág. 123.
- ↑ "¡Mira cómo crece tu Altair!" . Byte . Abril de 1976. pág. 48 .
- 1 2 3 4 Szczepaniak 2014 .
- ↑ Manual de EduSystem (PDF) . Digital. 1973. p. V.
- 1 2 Savetz 2013 .
- ↑ Stapleton, RA; Goodman, SE (junio de 1988). La Unión Soviética y la "revolución" de la computadora personal (PDF) (Informe técnico). Universidad de Arizona. pág. 8. Archivado (PDF) del original el 9 de marzo de 2014. Recuperado el 26 de agosto de 2025 .
- ↑ "Elektronika BK-0010" . Museo de Computadoras Antiguas .
- ↑ Manual 1968 .
- 1 2 Manual 1968 , pág. 2.1.
- 1 2 3 Manual 1968 , pág. 2.7.
- 1 2 Manual 1968 , pág. 3.7.
- 1 2 3 Manual 1968 , pág. 3.2.
- 1 2 3 Manual 1968 , pág. 3.6.
- ↑ Manual 1968 , pág. A.1.
- 1 2 Manual 1968 , pág. 3.4.
- 1 2 Manual 1968 , pág. 3.5.
- ↑ Manual 1968 , pág. 3.3.
- ↑ Manual 1968 , pág. 3.1.
- ↑ Manual 1968 , pág. 2.2.
- ↑ Manual 1968 , pág. 2.3.
- ↑ Manual 1968 , pág. 2.5.
- ↑ FOCAL: Un nuevo lenguaje conversacional . Digital.
- 1 2 3 4 5 Manual 1968 , pág. 2.4.
- ↑ Manual 1968 , pág. 3.10.
- ↑ Manual 1968 , pág. A.3.
- ↑ Manual 1968 , pág. 3.8.
- ↑ "¿Qué pasó con el intérprete Microsoft FOCAL?" . YouTube . 16 de septiembre de 2022 . Consultado el 18 de septiembre de 2022 .
- ↑ "Aterrizador Lunar" . Documentos relacionados con el juego de aterrizaje lunar .
Bibliografía
- Manual de programación de FOCAL (PDF) . Digital Equipment Corporation. 1968.
- Szczepaniak, John (1 de mayo de 2014). "Una historia básica de BASIC en su 50 aniversario" . Gamasutra .
- Savetz, Kevin (abril de 2013). "Dave Ahl y Betsy Ahl" (Entrevista).
Enlaces externos
- Código fuente de FOCALFuente FOCAL para varios programas, incluidos Lunar Lander, Sumer Game y otros.
- Folleto promocional de FOCAL de DEC de 1969
- El proyecto de simulación de historia computacional (Focal está disponible para su descarga gratuita aquí).
- "Enlace FTP" . www.cozx.com ( FTP ).(Para ver los documentos, consulte Ayuda:FTP ) Versión en código fuente C que se ejecuta en varios sistemas operativos, incluido Linux.
- El código fuente en C para una versión moderna de DOS adecuada para la enseñanza.
- Abramov VA Idioma del diálogo FOCAL (en ruso) ISBN 5-06-001785-0
- Osetinsky LG FOCAL para minicomputadoras (en ruso) ISBN 5-217-00323-5
- Фокал снаружи и изнутри. (пишется) – FOCAL por fuera y por dentro. (en progreso) (en ruso)
- Файл справки к фокалу-1б – Archivo de ayuda para FOCAL-1B (en ruso)
- Familia de lenguajes de programación JOSS
- Software DEC
- Lenguajes de programación creados en 1968