FOCAL 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) . El nombre es un acrónimo de F ormulating O n-Line C alculations en A lgebraic L anguage, [1] o para FO rmula CAL envidious. [2]
Desarrollador | Richard Merrill, DEC |
---|---|
Apareció por primera vez | 1968 |
Influenciado por | |
JOSS | |
Influenciado | |
BASIC-PLUS |
FOCAL es muy similar a JOSS en términos de los comandos que admite y la sintaxis general del lenguaje. Se diferencia en que muchas de las funciones avanzadas de JOSS, como los rangos y las funciones definidas por el usuario, se eliminaron para simplificar el analizador. Se cambió el nombre de algunas de las palabras clave para que todas comiencen con una primera letra única. Esto permite a los usuarios escribir programas utilizando declaraciones de un solo carácter, lo que reduce aún más las necesidades de memoria. Esta fue una consideración importante en el PDP-8 , que a menudo se limitaba a unos pocos kilobytes (KB).
Al igual que JOSS y los BASIC posteriores , FOCAL en el PDP-8 era un entorno completo que incluía un editor de línea, el intérprete y rutinas de entrada / salida. El paquete en su conjunto se llamó FOCAL-8 , que también se ejecutó en PDP-5 y PDP-12 . Cuando se transfirió al PDP-11 , el FOCAL-11 resultante se basó en el 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 un FOCAL-71 muy ligeramente modificado . También estaba disponible un puerto para Intel 8080 .
FOCAL es notable como el idioma en el que se escribieron las versiones originales de los primeros videojuegos Hamurabi y Lunar Lander . Ambos fueron portados posteriormente a BASIC, donde se hicieron mucho más conocidos. [3] FOCAL no era popular fuera de la plataforma PDP y desapareció en gran medida durante el traslado al VAX-11 . Tuvo un fuerte resurgimiento en la Unión Soviética, donde los clones de PDP-11 se utilizaron como computadoras educativas y domésticas .
Historia
JOSS
JOSS fue lanzado en mayo de 1963 en la computadora JOHNNIAC única en RAND Corporation . Dentro de RAND, el uso creció rápidamente y la máquina, construida originalmente en 1953, rápidamente se quedó sin capacidad. JOHNNIAC fue desmantelado en 1966 y JOSS fue reimplementado en un PDP-6 recién comprado , la primera máquina "grande" de Digital Equipment Corporation (DEC). El uso siguió creciendo y, para 1970, el sistema estaba siendo utilizado por entre 500 y 600 usuarios en todo el país y había generado una serie de innovaciones, como terminales de computadora móviles que podían transportarse con ruedas de una habitación a otra y enchufarse para un acceso instantáneo. [4]
JOSS fue muy influyente. Surgió justo cuando se estaba introduciendo el tiempo compartido . Había un interés significativo en la interacción hombre-máquina y las computadoras estaban siendo utilizadas más ampliamente. Mientras que la mayoría de los sistemas operativos de tiempo compartido de la época se concentraban en la gestión de archivos y cuentas de usuario, dejando que los usuarios hicieran su propia programación, JOSS proporcionó la edición de archivos y un lenguaje de programación en un solo paquete. RAND mostró el sistema a un desfile de personas de la industria. [4]
FOCAL
El PDP-6 fue el primer mainframe de DEC y JOSS aprovechó al máximo su potencia y capacidad de memoria. Escrito por Richard Merrill , FOCAL eliminó las funciones de JOSS según se requería para poder ejecutarse en el espacio de memoria mucho más limitado del PDP-8 y otras máquinas de 12 bits en la línea DEC. Para lograr esto, se realizó un cambio importante para reducir la cantidad de datos temporales, o " estado ", necesarios para analizar las declaraciones. Un efecto notable de esta decisión fue que los condicionales solo se podían usar para las sucursales , a diferencia de JOSS, donde los condicionales se pueden aplicar a cualquier declaración.
El otro cambio notable fue reorganizar las palabras clave para que cada una comenzara con una letra única. Esto simplificó el analizador , que necesitaba leer solo la primera letra del comando en una línea de código, y luego podía saltar al siguiente carácter de espacio en blanco . Luego compararía eso con una lista interna de posibles palabras clave, que era un carácter por entrada. Por el contrario, JOSS tuvo que seguir leyendo hasta que leyó la palabra de comando completa y luego la comparó con una lista que contenía palabras completas. Este cambio no solo ahorró memoria en el analizador, los usuarios también podían ahorrar memoria escribiendo solo esa letra, reduciendo 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 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 transfirió a otras máquinas de la serie de 12 bits, incluidas las PDP-5 y PDP-12 . Era popular porque era muy eficiente en términos de uso de la memoria, que a menudo estaba muy limitada en estas máquinas a unos pocos kilobytes (KB). El FOCAL-11 similar se ejecutó en el PDP-11 bajo RT-11 .
Processor Technology también ofreció una versión de 8k FOCAL, completa con Lunar Lander, para el sistema Altair 8800 basado en Intel 8080 . Esto se proporcionó para el cargo de copia de la cinta, mientras que el código fuente se proporcionó de forma gratuita con otras compras. [5]
BÁSICO
Si bien FOCAL se estaba volviendo popular en las máquinas DEC, BASIC se estaba convirtiendo en una alternativa más popular en otras plataformas. A finales de la década de 1960, varias empresas estaban haciendo incursiones en el bastión de las minicomputadoras de DEC vendiendo máquinas similares que ejecutaban versiones de BASIC en tiempo compartido. Entre ellos se destacó la serie HP 2100 , que ejecuta HP Time-Shared BASIC . [6]
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 en entornos educativos. Debido a la popularidad de BASIC en el mercado educativo, especialmente con la creciente biblioteca de programas BASIC del Consorcio de Computación Educativa de Minnesota , Ahl descubrió que vender la máquina con FOCAL era difícil a pesar de sus ventajas. [6] Como señaló más tarde:
- El lenguaje FOCAL de DEC era igual al BÁSICO en la mayoría de los aspectos e incluso mejor en algunos, pero tenía un gran inconveniente: DEC no estaba dispuesto a licenciarlo a otros fabricantes de computadoras. FOCAL estaba librando una batalla cuesta arriba contra BASIC, que estaba disponible en GE, Honeywell, HP y otras computadoras.
Creo que terminó con una situación como Sony y Betamax. Sony dice: "Betamax es nuestro y es un formato mejor que VHS", que era. Pero luego, JVC dice: "Tenemos VHS y Toshiba. Oye, ¿quieres usarlo? Bien, te lo licenciaremos por casi nada". [6]
Ahl se encargó de producir un sistema BÁSICO para la plataforma, contratando a una empresa de la que más tarde se enteró 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 el BASIC como la línea "EduSystem", con sistemas más grandes de la serie con versiones ampliadas de BASIC y, en algunos casos, FOCAL y FORTRAN también. También se crearon algunos EduSystems basados en PDP-11. [7]
Ahl luego comenzó a portar programas de FOCAL a BASIC, en particular The Sumer Game (que renombró Hamurabi ), una versión de Lunar Lander , y varias demostraciones de FOCAL más pequeñas. Combinando sus versiones con presentaciones de programadores externos, se las arregló para recopilar suficiente material para que DEC publicara 101 BASIC Computer Games en 1973. El libro fue un éxito inmediato y finalmente pasó por tres ediciones hasta 1975. [8] [6]
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 se evaporó. [8]
Renacimiento en la Unión Soviética
El PDP-11 había sido clonado en la Unión Soviética en la década de 1970 con fines militares. En la década de 1980, se produjeron variaciones de un solo chip similares al LSI-11 que dieron lugar a una serie de computadoras domésticas compatibles con PDP-11 . Los más notables entre varios modelos fueron la serie Electronika BK , lanzada en 1985. Inicialmente se suministraron con FOCAL en un cartucho ROM , [9] mientras que un cartucho BASIC era un complemento opcional. Los modelos posteriores suministran BASIC por defecto. [10]
Idioma
La siguiente descripción se basa en FOCAL-69 como se ve en el manual de referencia del lenguaje FOCAL-8. [11]
Modos directo e indirecto
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 realizaban inmediatamente, o anteponerlos con un número de línea, en cuyo caso se agregaban al programa si eran únicos, o anulaban el código existente si el mismo número tenía utilizado anteriormente. [12]
El método de operación es similar al "modo inmediato" de BASIC frente al "modo de programa". Contrasta con JOSS, en el que todos los comandos, tanto programados como directos, se guardaron y cargaron como parte del espacio de trabajo del usuario. Esto permitió que JOSS tuviera comandos sin números de línea, que usaban para Form
definiciones y otras tareas. FOCAL carecía de esta capacidad, por lo que las instrucciones que debían cargarse y guardarse se convirtieron en opciones en otros comandos del modo de programa como Type
. [12]
Declaraciones del programa
Cada línea en un programa FOCAL debe comenzar con un número de línea. Al igual que con JOSS, los números de línea son números de coma fija que constan de dos números 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. Cuando se imprima, utilizando WRITE
el equivalente FOCAL de BASIC LIST
, se agregarán ceros a la izquierda para que todos los números de línea se alineen. Esto significa que todos los números de línea tendrán un total de cinco caracteres, incluido el punto; 1.10 se imprimirá como 01.10
. Las declaraciones que se refieren a esas líneas no necesitan los ceros a la izquierda, por ejemplo, GOTO 1.10
. [13]
El número a la izquierda del período se conoce como "número de grupo". Los grupos proporcionan algún nivel de organización del código que falta en lenguajes como Fortran o BASIC. El uso principal de estos fue usar un grupo como una subrutina que se puede llamar DO
, por ejemplo, DO 5
que saltará a la subrutina escrita en el grupo 5. El editor también los usó durante el tiempo de edición, por ejemplo, uno podría WRITE 2
producir una lista del código en el grupo 2, o ERASE 4
para eliminar todas las líneas del grupo 4. [13]
Cada línea debe comenzar con una palabra clave de comando después del número de línea. [13] No existe el concepto de un "comando predeterminado" como es el caso en BASIC con su LET
declaración opcional . Se pueden colocar varias declaraciones en una sola línea, separadas por punto y coma. Por lo general, el comportamiento no es diferente que si las declaraciones hubieran estado en líneas separadas, excepto en el caso de bucles FOR. [14]
Comandos
PEDIR
El ASK
comando (abreviatura A) tomará una lista de cadenas y variables, hará eco de las cadenas y almacenará la entrada del usuario en variables. [15] Equivalente a BASIC INPUT
.
01.01 PREGUNTAR "NOMBRE", NOMBRE01.02 PREGUNTAR "COORDENADAS", X, Y01.03 PREGUNTE "A1", A1, "OMEGA", W, "T0", T0, "FACTOR DE AMORTIGUACIÓN", FACTOR DE AMORTIGUACIÓN
Si el usuario no ingresa un número pero ingresa texto, el sistema convertirá el carácter inicial en un número con "A" = 1, "B" = 2, etc.
COMENTARIO
El COMMENT
comando (abreviatura C) crea un comentario. [16] Equivalente a BASIC REM
.
COMENTARIO 01.01: EL JUEGO DE VERANO, POR RICHARD MERRILL
HACER
El DO
comando (abreviatura D) bifurca la ejecución a una subrutina. Es el equivalente de BASIC GOSUB
. Se hace referencia a la subrutina por número de grupo o número de línea. Si se proporciona un número de línea, esa única línea se ejecuta y luego vuelve a la instrucción después de DO
. Si no se proporciona un 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 o RETURN
se encuentra a. RETURN
solo se requiere regresar temprano del grupo, no es necesario al final del grupo. [17]
01.15 DO 7.2401.16 DO 8
POR
El FOR
comando (abreviatura F) implementa un bucle for . Cuando se especifican tres argumentos, el primero es el valor inicial de la variable del ciclo, el segundo es el incremento y el tercer valor es el valor final del ciclo. Si se proporcionan dos valores, el primero es el valor inicial y el segundo es el valor final, y el incremento se establece en 1.
En contraste con otras partes del lenguaje donde múltiples declaraciones en una línea son independientes, FOR
siempre ejecuta las declaraciones que la siguen en la línea antes de que se cumpla la terminación, y luego continúa a la siguiente línea. Por lo tanto, los bucles deben estar en una sola línea o, alternativamente, llamar a una subrutina con DO
. No hay equivalente de BASIC NEXT
. [14]
01.01 PARA X = 1,10; TIPO X ,!01.02 PARA X = 0,10,100; HACER 2
Una muestra de bucle FOR:
01.10 PREGUNTE "¿CUÁNTO DINERO QUIERE PRESTAR?", DIRECTOR01.20 PREGUNTE "¿CUÁNTOS AÑOS?", PLAZO01.30 PARA TASA = 4.0, .5,10; DO 2.001.40 SALIR02.10 ESTABLECER INTERES = PRINCIPAL * (TASA / 100) * PLAZO02.20 ¡TIPO "TASA", TASA, "", "INTERÉS", INTERÉS,!
IR
El GOTO
comando (abreviatura G) salta la ejecución del programa al número de línea especificado. [17] Es idéntica a la declaración del mismo nombre en BASIC. En FOCAL, GOTO
también se usa para comenzar la ejecución, como BASIC RUN
, pero en este uso, la documentación se refiere a él como en GO
lugar de GOTO
a pesar de que el comando subyacente es el mismo.
01.05 GOTO 1.0102.90 TYPE !!, "INTENTAR DE NUEVO.", !!!!!; GOTO 1.1
SI
El IF
comando (abreviatura I) proporciona una rama 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 número de la primera línea; si es igual a cero, al número de la segunda línea; si es mayor que cero, al tercer número de línea. El lenguaje carecía de operadores relativos como mayor que, igual o menor que. Para bifurcar si X> 5, se debe comparar X - 5. [18]
02.20 SI (25-25) 2.4,2.3,2.403.01 SI (X) 3.1,3.02,3.1
IF podría abreviarse colocando un punto y coma (o el final de la línea) más allá del número de la primera línea. Por ejemplo:
02,20 IF (X) 1,8; TIPO "Q"02.30 IF (X) 1.8,2.5002.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, y de lo contrario continuará escribiendo "P" en la consola. [18]
DEJAR
El QUIT
comando (abreviatura Q) finaliza la ejecución del programa y devuelve el control al entorno de edición. [16] Equivalente a BASIC STOP
o END
.
01.10 PARA X = -10,1,10; TIPO X01.20 SALIR
REGRESO
El RETURN
comando (abreviatura R) bifurca la ejecución desde una subrutina de regreso a la ubicación de la llamada. [16] El uso de RETURN
es 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 muestra para convertir una solicitud de sí / no en un valor. [1]
22.78 COMENTARIO: SUBRUTINA 'SI O NO'22.80 PREGUNTE "¿RESPONDER SÍ O NO?",22,82 SI (AN-0 SÍ) 22,84,22,8622.84 SI (AN-0NO) 22.8, 22.88, 22.822.86 ESTABLECER X = 2; VOLVER22.88 ESTABLECER X = 1; VOLVER
COLOCAR
El SET
comando (abreviatura S) asigna los resultados de una expresión a la variable especificada. [19] Equivalente a BASIC LET
.
01.30 AJUSTE PI = 3.1415601.60 ESTABLECER INTERES = PRINCIPAL * (TASA / 100) * PLAZO
TIPO
El TYPE
comando (abreviatura T) proporciona la salida de uno o más elementos separados por comas. [20] Equivalente a BASIC PRINT
.
Los elementos pueden ser variables, cadenas literales rodeadas de comillas dobles o una variedad de caracteres de control. Los caracteres de control incluyen !
para generar un retorno de carro y un salto de línea, solo #
para el retorno de carro y :
para un carácter de tabulación. Los caracteres de control se pueden unir, por ejemplo, !!!
generarán tres CR / LF sin la necesidad de separarlos con comas. [15]
TIPO [NÚMEROS, E1, "TEXTO",!, #,:, $ O%] ... SALIDA01.10 TIPO "HOLA, BUEN ESTADO. ¿CUÁNTO DINERO QUIERES PRESTAR?" ,!01.50 TIPO "INTERÉS", INTERÉS ,!01.80 TIPO "EL INTERÉS PARA", 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 !!!!!
TYPE
también incluyó un especificador de formato opcional indicado usando el formato %x.yz
, donde x es el número de dígitos a la izquierda del 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 período. [21] Entonces, por ejemplo:
CONJUNTO A = 67823TIPO% 6.01, A= 67823,0TIPO% 5, A= 67823TIPO% 8.03, A= 67823.000ESCRIBE UN= 6.7823E4
Tenga en cuenta los espacios iniciales adicionales en algunos ejemplos, rellenando todo el ancho definido. El uso de% solo hizo que la salida se imprimiera en "formato de punto flotante" utilizando la E. [22]
Un carácter de control especial fue el $
que provocó que se imprimiera una tabla de todas las variables definidas y sus valores. Solo se imprimirán las dos primeras letras del nombre, rellenadas con un cero si es necesario. Los elementos de las matrices se imprimen en líneas separadas y las variables con un solo elemento se indexarán (00). Por ejemplo: [23]
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 ejemplo de código de FOCAL: A New Conversational Language [24] se refiere a la misma variable que DESTINATION y luego DES. Internamente, ambas referencias se refieren a una variable designada DE:
01.80 CONSULTAR DESTINO02.30 IF (DES-14) 2.4,3.1,2.4
Cualquier variable puede tratarse como una matriz, lo que permite subíndices desde -2048 hasta 2047. [2]
Matemáticas
FOCAL-69 contenía cinco operadores matemáticos: [25]
^
para exponentes: el exponente se convierte en un número entero de 12 bits*
para multiplicar/
para la división+
para la adición-
para restar
Una curiosidad de FOCAL fue que todos los operadores tenían precedencia independiente, como en el orden anterior. Eso significa que la fórmula SET T=2-3+1
, sería evaluada en el orden 2- (3 + 1) y así produciría -2. Esto era muy diferente a la mayoría de los lenguajes, donde + y - tenían igual precedencia y serían evaluados (2-3) +1 para producir 0. [25] Esto puede causar errores sutiles al convertir el código fuente FOCAL a otros sistemas.
FOCAL era inusual en el sentido de que las expresiones matemáticas podían usar (), [] y <> indistintamente en pares coincidentes para establecer la precedencia. [25] Por ejemplo, la siguiente es una expresión válida:
01.30 AJUSTE 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 declaración se evaluará [], luego (), luego <>, para producir 360. [25]
El idioma contenía las siguientes funciones integradas: [26]
FABS()
- Valor absolutoFATN()
- ArctangentFCOS()
- Coseno del argumento en radianesFEXP()
- Base natural al poder del argumentoFITR()
- Parte entera del argumentoFLOG()
- Tronco naperianoFRAN()
- Número aleatorioFSGN()
- Signo del argumento; FSGN (0) = 1 en FOCAL-69, pero FSGN (0) = 0 en FOCAL-71 y versiones posterioresFSIN()
- Seno de un ángulo expresado en radianesFSQT()
- Raíz cuadrada
Otras funciones
FOCAL también incluyó una serie de funciones con fines especiales: [27]
FDIS
tomó dos valores y trazó un punto en la pantalla de terminales gráficosFADC
leer un valor de una entrada analógica numerada y devolver un valor entero
Comandos de entorno
Programas en ejecución
FOCAL utilizado GOTO
en el editor para iniciar un programa. Sin embargo, una regla general era acortar esto a GO
. Este es el equivalente de RUN
en BASIC. GOTO
también se puede utilizar en el editor para iniciar la ejecución en una línea específica.
Editando comandos
Las nuevas líneas se ingresan al programa simplemente comenzando el comando con un número de línea. Los comandos de edición fueron BORRAR (abreviatura E), [25] MODIFICAR (abreviatura M) [28] y ESCRIBIR (abreviatura W): [15]
ERASE
- pone a cero todas las variables. esto a veces se encuentra dentro de los programas para restablecerlosERASE line number
- elimina la declaración en la línea especificadaERASE group number
- elimina todas las declaraciones en el grupo especificadoERASE ALL
- borra todo el programaMODIFY line number
- permite al programador editar la línea especificadaWRITE line number
- mostrar la declaración en la línea especificadaWRITE group number
- mostrar todas las declaraciones en el grupo especificadoWRITE ALL
- mostrar el programa especificado
Comandos de archivo
El comando de archivo fue ABRIR (abreviatura O):
OPEN INPUT [device:][file][,ECHO]
- prepárate para leer desde el principio de un archivoOPEN OUTPUT [device:][file][,ECHO]
- prepárate para escribir desde el principio de un archivoOPEN RESTORE INPUT[,ECHO]
- reanudar la entradaOPEN RESTORE OUTPUT[,ECHO]
- reanudar la salidaOUTPUT CLOSE
- generar el búfer y cerrar el archivo
Comandos de biblioteca
FOCAL incluyó la capacidad de administrar colecciones de programas FOCAL como una biblioteca de códigos. Los programas pueden 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 pueden tener seis caracteres. El comando LIBRARY (abreviatura L) tenía los siguientes subcomandos:
LIBRARY DELETE [device:]program name
- eliminar un programaLIBRARY LIST [device:][file name]
- catalogoLIBRARY RUN [device:]program name [line number]
- encadenar el programa, reanudando opcionalmente en el número de línea especificadoLIBRARY SAVE [device:]program name
- guardar el programaLIBRARY EXIT
- volver al programa del monitor PDP-8
FOCAL-71 agregó:
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 al informar la dirección del código de detección de errores como un número de punto fijo. Por ejemplo, se detectó el error de división por cero que reportarí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 del PDP-8 tenían 128 bytes de longitud, por lo que esta dirección se traduce en 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 fue en gran parte idéntico al original, pero FOCAL, 1971 fue una actualización importante que agregó manejo de archivos, nuevas matemáticas y una variedad de otros cambios. A diferencia de las dos primeras versiones, que eran sistemas independientes, FOCAL, 1971 se basó en el emergente OS / 8 (entonces todavía conocido como PS / 8) y se basó más en ese sistema operativo para el manejo 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 FSGN
función ahora devuelve cero si la expresión de entrada se evalúa como cero. Anteriormente, esto devolvería uno. La FRAN
ahora utilizarse un mejor algoritmo que produjo números más distribuidas al azar. También agregó la nueva FIN
función que tomó una cadena y devolvió su valor ASCII (similar al de BASIC ASC
) y FOUT
que tomó un número y devolvió una cadena con ese carácter ASCII ( CHR
).
Como todas estas opciones consumían memoria limitada, cuando se inició, FOCAL, 1971 entró en un cuadro de diálogo que preguntaba al usuario qué funciones deseaba utilizar.
Comparación con JOSS
FOCAL es, para todos los efectos, una versión limpia de JOSS con cambios para hacer la sintaxis más tersa y más fácil de analizar. Casi todos los comandos FOCAL tienen una correspondencia uno a uno con JOSS y solo se diferencian en los detalles. Faltaban algunas características de JOSS en FOCAL.
Una diferencia importante es que JOSS incluía un conjunto completo de operaciones de comparación y un sistema lógico booleano que operaba dentro de si y para construcciones. Además, los ifs y loops podían aplicarse a cualquier instrucción, a diferencia de FOCAL, donde la única operación que cualquiera podía realizar era el equivalente a un goto. Por ejemplo, en JOSS, uno podría:
1.10 Escriba A si X> 10. 1.20 Escriba 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 contraste, FOCAL no tenía la capacidad de comparar valores y los bucles se aplicaban saltando a la siguiente línea cuando se completaban. El código equivalente en FOCAL sería:
1.10 SI (X-10) ,, 1.301.20 TIPO A!1.30 PARA I = 1,1,10; TIPO I ,!
La implementación de JOSS hace que las construcciones comunes sean más fáciles de construir y coincidan más estrechamente con las intenciones del programador, a costa de hacer que el tiempo de ejecución sea más complejo. Por ejemplo, JOSS permitió que los rangos en bucles se describieran de una manera flexible como 1, 2, 3, 10 (5) 50, 75, 78. Esta flexibilidad tiene un costo; en FOCAL, el inicio, la parada y el paso pueden escribirse en una estructura personalizada en memoria y actualizarse fácilmente a medida que se realiza el ciclo, mientras que JOSS lo requiere para reevaluar una expresión que puede ser, pero a menudo no lo es, más compleja.
En términos de hacer el código más terso, los cambios fueron relativamente menores. Por ejemplo, JOSS 'se Do part 20.
convierte en el FOCAL ligeramente más pequeño DO 20
, mientras que se Do step 20.1
convierte en DO 20.1
. Las palabras clave de comando también se acortaron cuando fue posible, por lo que JOSS 'se Demand
convierte en FOCAL's ASK
, tanto para acortarlo como para permitir que la letra D se use de manera única DO
. Se eliminó el período necesario para indicar el final de una línea en JOSS.
Para simplificar el analizador, se eliminaron algunas opciones FOCAL. Por ejemplo, JOSS podría realizar múltiples asignaciones Set S=P, P=Q, Q=S.
mientras que en FOCAL, estas debían ser declaraciones individuales SET S=P; SET P=Q; SET Q=S
. Del mismo modo, JOSS ' Form
, utilizado para formatear la salida, se combinó en FOCAL TYPE
con el %
.
Comparación con BASIC
Las comparaciones entre FOCAL y BASIC eran inevitables ya que ambos lenguajes eran comunes en miniordenadores de la misma época, y los dos lenguajes tienen mucho en común en términos de sintaxis y estructura. En la mayoría de los casos, hay una conversión directa de código FOCAL hacia y desde BASIC. Por ejemplo, para pedirle al usuario que ingrese un valor, en FOCAL uno:
PREGUNTE "¿Cuál es su edad?", EDAD
mientras que en BASIC el equivalente es:
INPUT "¿Cuál es su edad?", EDAD
Con la 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 IF
en BASIC, que permitía colocar cualquier instrucción después de THEN
, haciéndola 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 that
mientras que en FOCAL se usa that IF this
, como en JOSS. La versión de BASIC tiene la ventaja de que el tiempo de ejecución puede abortar inmediatamente la lectura del resto de la declaración si la expresión no es verdadera. En contraste, de FOCAL IF
era más como de BASIC Goto computarizada , ON X GOTO 10,20,30
, pero la ON...GOTO
permite cualquier número de líneas como dianas, en contraposición a sólo tres para el negativo, cero y positiva como en JOSS y focal.
Otra diferencia importante entre los dos es que FOCAL carecía de soporte inherente para cadenas como elementos de datos que podrían asignarse a variables. Como era el caso en las primeras versiones de BASIC o FORTRAN antes de la adición de cadenas (en F77), esta limitación generalmente se evitaba mediante el uso de cadenas literales en los comandos de entrada y salida. Fue solo cuando uno tuvo que manipular cadenas individuales o caracteres dentro de ellas que esto se convirtió en un problema significativo.
Como no se admitían las variables de cadena, al ingresar una cadena se utilizó un kludge que convertía cualquier carácter ingresado por el usuario a su valor de carácter numérico. Por ejemplo, si uno escribe "HOLA" en una declaración de entrada, FOCAL convertirí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 interpretaría la "E" como un exponente inicial, luego trataría de calcular "8" a la potencia de "LLO", lo que tomaría varios segundos de tiempo de CPU y daría como resultado un valor de 0.76593020E + 103, no un respuesta particularmente útil. Sin embargo, al hacer preguntas que serían respondidas usando respuestas de una sola letra Do you need instructions, Y or N"
, los programadores podrían probar el resultado con valores de caracteres conocidos para producir lo que parecía una entrada de caracteres.
La implementación de PDP-8 de FOCAL utilizó 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 permitió una precisión significativamente mayor y un rango de valores significativamente más amplio que la mayoría de los intérpretes contemporáneos, lo que hizo que FOCAL fuera una opción razonable para trabajos numéricos serios. Esta alta precisión y las buenas opciones para el formato de salida decimal predeterminado significaron que las dificultades con el redondeo de binario a decimal no eran evidentes para los usuarios principiantes. A modo de comparación, Microsoft BASIC usó inicialmente un formato de 32 bits , mientras que las versiones posteriores lo expandieron a 40 bits. La mayoría de los BASIC tenían problemas con el redondeo que conducían a ecuaciones simples que daban como resultado pequeños residuos distintos de cero.
En general, se acepta que FOCAL fue más eficiente en el uso de recursos que los sistemas BASIC comparables. En una máquina típica del día, a menudo con 6 a 24 kilobytes de memoria de núcleo magnético , FOCAL podría manejar tareas de programación más grandes y complejas que BASIC.
Versiones y spin-offs
The Coca-Cola Corporation utilizó una versión personalizada de FOCAL llamada COKE. [ cita requerida ]
Posteriormente, FOCAL se implementó en PDP-7, PDP-9, PDP-10, PDP-11, PDP-12, PDP-5 y LINC-8.
El manual FOCAL mostró cómo agregar comandos al analizador FOCAL, por lo que muchos sitios agregaron comandos especializados para operar hardware personalizado.
La Sociedad de Usuarios de Computadoras de Equipos Digitales recopiló muchos parches y mejoras para FOCAL. Incluso hubo importantes ramificaciones mejoradas de FOCAL, como FOCAL-W, que agregó muchas características, incluida una mejor E / S de archivos de almacenamiento masivo e incluso memoria variable virtual.
A mediados de la década de 1970, DELTA era una versión más sofisticada de FOCAL. Los números de línea de programa iban de 00 a 99 "partes" y de 000000 a 999999 "pasos" ejecutados en orden alfanumérico. DELTA tenía algunos comandos especializados para el osciloscopio de visualización Tektronix 4010/14.
En Rusia , se usó hasta principios de la década de 1990 en computadoras domésticas de producción masiva de la serie Electronika BK .
Código de ejemplo
El Lunar Lander original es un excelente ejemplo para examinar el código FOCAL, ya que utiliza la mayoría de las características del lenguaje. Este código es del original, que se encuentra en la página Lunar Lander de Jim Storer . [29]
01.04 T "MÓDULO LUNAR DE LLAMADA DE CONTROL. ¡ES NECESARIO EL CONTROL MANUAL"!01.06 T "PUEDE RESTABLECER LA TASA DE COMBUSTIBLE K CADA 10 SEGUNDOS A 0 O CUALQUIER VALOR"!01.08 T "ENTRE 8 Y 200 LBS / SEG. TIENE 16000 LBS DE COMBUSTIBLE. ESTIMADO"!01.11 T "TIEMPO DE IMPACTO DE CAÍDA LIBRE-120 SEG. PESO DE LA CÁPSULA-32500 LBS"!01.20 T ¡¡¡"PRÓXIMAMENTE VERIFICACIÓN DEL PRIMER RADAR" !!!01.30 T "PROCEDIMIENTO DE ATERRIZAJE COMIENZO"! "TIEMPO, ALTITUD SEGUNDA",01.40 T "MILLAS + PIES DE VELOCIDAD, MPH DE COMBUSTIBLE, LBS TASA DE COMBUSTIBLE"!01.50 SA = 120; SV = 1; SM = 32500; SN = 16500; SG = .001; SZ = 1.802.10 T "",% 3, L, "", FITR (A), "",% 4,5280 * (A-FITR (A))02.20 T% 6.02, "", 3600 * V, "",% 6.01, MN, "K ="; AK; ST = 1002.70 T% 7.02; I (200-K) 2.72; I (8-K) 3.1,3.1; I (K) 2.72,3.102.72 T "NO POSIBLE"; FX = 1,51; T "."02.73 T "K ="; AK; G 2.703.10 I (MN-.001) 4.1; I (T-.001) 2.1; SS = T03.40 I ((N + S * K) -M) 3.5,3.5; SS = (MN) / K03.50 D 9; I (I) 7.1,7.1; I (V) 3.8,3.8; I (J) 8.103.80 D 6; G 3.104.10 T "FUEL FUEL AT", L, "SECS"!04.40 SS = (FSQT (V * V + 2 * A * G) -V) / G; SV = V + G * S; SL = L + S05.10 T "EN LA LUNA A", L, "SECS"!; SW = 3600 * V05.20 T "VELOCIDAD DE IMPACTO DE", W, "MPH"!, "COMBUSTIBLE IZQUIERDO:" MN, "LBS"!05.40 I (1-W) 5.5,5.5: T "¡ATERRIZAJE PERFECTO! - (AFORTUNADO)" !; G 5.905.50 I (10-W) 5.6,5.6; T "BUEN ATERRIZAJE- (PODRÍA SER MEJOR)" !; G 5.905.60 I (22-W) 5.7,5.7; T "¡FELICIDADES POR UN POBRE ATERRIZAJE"!; G 5.905.70 I (40-W) 5.81,5.81; T "DAÑO A LA ARTESANÍA. ¡BUENA SUERTE"!; G 5.905.81 I (60-W) 5.82,5.82; T "ATERRIZAJE ACCIDENTE - TIENE 5 HORAS DE OXÍGENO"!; G 5.905.82 T "LO SENTIMOS, PERO NO HUBO SUPERVIVIENTES, ¡LO HAS ESTALLADO!"!05.83 T "HECHO DE QUE HAS ESTALLADO UN NUEVO CRÁTER LUNAR", W * .277777, "PIES DE PROFUNDIDAD.05.90 ¡¡¡¡T !!!! "¡INTENTAR OTRA VEZ?"!05.92 A "(RESPUESTA SÍ O NO)" P; I (P-0NO) 5.94,5.9805.94 I (P-0SÍ) 5.92,1.2,5.92 05.98 T "CONTROL FUERA" !!!; Q06.10 SL = L + S; ST = TS; SM = MS * K; SA = I; SV = J07.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.108.10 SW = (1-M * G / (Z * K)) / 2; SS = M * V / (Z * K * (W + FSQT (W * W + V / Z))) +. 05; D 908.30 I (I) 7.1,7.1; D 6; I (-J) 3.1,3.1; I (V) 3.1,3.1,8.109.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 varias subrutinas. Esto era casi universal en los programas FOCAL (y JOSS), ya que el esquema de números de línea hacía que tales construcciones fueran fáciles de usar. Este programa utiliza nueve rutinas. El primero, el grupo 1, simplemente imprime las instrucciones usando la T
instrucción ype y establece los valores iniciales para la ejecución. La masa de combustible no se registra directamente, sino que usa el M
asno actual y la masa vacía N
, por lo que el combustible restante es MN y el módulo de aterrizaje se queda sin combustible cuando MN es 0. También observe el E
rase al final de la línea 1.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" del grupo 1 al 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 2.20, se A
solicita al usuario que ingrese la velocidad de combustión como K
, y luego el temporizador de bucle se reinicia usando S T=10
. La línea 2.70 prueba la entrada del usuario contra varias posibilidades, si está por encima de 200 o por debajo de 8, escribe "NO POSIBLE" y una fila de puntos, y luego vuelve para pedirle al usuario que vuelva a intentarlo. Si el valor está entre estos valores, salta al grupo 3. Tenga en cuenta que las capacidades limitadas del IF
comando de FOCAL son evidentes aquí, en BASIC esto podría reducirse a un soloIF K>200 OR K<8 THEN...
El grupo 3 primero prueba para ver si el combustible se ha agotado, y salta al grupo 4 si es así. Luego, prueba si el período de 10 segundos T
ha expirado y, si es así, vuelve a imprimir todo de nuevo, lo que tiene el efecto secundario de restablecer T y S a 10. La línea 3.40 prueba para ver si la cantidad de combustible quemado este período, S * K, reducirá la masa del vehículo en su conjunto, S * KM, más allá del peso vacío, N. Si no, sigue adelante, si lo hace, en su lugar establece el temporizador de bucle en la cantidad de tiempo, el combustible restante se quemará, terminando así el ciclo antes de tiempo. En cualquier caso, llama al grupo 9 para actualizar la velocidad y la posición. Luego recorre los grupos 7, 8 y 9 hasta que el valor de I converge.
Cuando se agota el temporizador de 10 segundos o llega al final debido a la prueba de combustible en la línea 3.10 o la prueba de altitud en 7.10. En los últimos casos, saltará al grupo 4 y 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 le gustaría volver a intentarlo. Si es así, salta a 1.20 para borrar todos los valores e imprimir los encabezados nuevamente, si no, cae a 5.98 y Q
uits.
Ver también
- JOSS , el idioma Rand que inspiró a FOCAL
- MUMPS , un lenguaje de manipulación de datos basado en conceptos JOSS y FOCAL
Referencias
- ^ Manual de 1968 , p. 1.1.
- ^ Diciembre de 1957 hasta el presente (PDF) . DIC. 1978. p. 38.
- ^ McCracken, Harry (29 de abril de 2014). "Cincuenta años de BASIC, el lenguaje de programación que hizo a las computadoras personales" . Tiempo . Archivado desde el original el 5 de febrero de 2016 . Consultado el 12 de febrero de 2016 .
- ^ a b Marks, Shirley (diciembre de 1971). Los años de JOSS: Reflexiones sobre un experimento (PDF) (Informe técnico). Rand.
- ^ "¡Mira cómo crece tu Altair!" . Byte . Abril de 1976. p. 48 .
- ↑ a b c d Szczepaniak, 2014 .
- ^ Manual de EduSystem (PDF) . Digital. 1973. p. V.
- ↑ a b Savetz, 2013 .
- ^ Stapleton, RA; Goodman, SE (junio de 1988). La Unión Soviética y la "revolución" de las computadoras personales (PDF) (Informe técnico). Universidad de Arizona. pag. 8.
- ^ "Elektronika BK-0010" . Museo de la Computación Antigua .
- ^ Manual de 1968 .
- ^ a b Manual de 1968 , p. 2.1.
- ^ a b c Manual 1968 , pág. 2.7.
- ^ a b Manual de 1968 , p. 3.7.
- ^ a b c Manual 1968 , pág. 3.2.
- ^ a b c Manual 1968 , pág. 3.6.
- ^ a b Manual de 1968 , p. 3.4.
- ^ a b Manual de 1968 , p. 3.5.
- ^ Manual de 1968 , p. 3.3.
- ^ Manual de 1968 , p. 3.1.
- ^ Manual de 1968 , p. 2.2.
- ^ Manual de 1968 , p. 2.3.
- ^ Manual de 1968 , p. 2.5.
- ^ FOCAL: Un nuevo lenguaje conversacional . Digital.
- ^ a b c d e Manual de 1968 , pág. 2.4.
- ^ Manual de 1968 , p. 3.10.
- ^ Manual de 1968 , p. A.3.
- ^ Manual de 1968 , p. 3.8.
- ^ "Lunar Lander" . Documentos relacionados con el juego de aterrizaje lunar .
Bibliografía
- Manual de programación FOCAL (PDF) . Corporación de Equipos Digitales. 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 FOCAL , fuente FOCAL para varios programas, incluidos Lunar Lander, Sumer Game y otros
- Folleto promocional FOCAL 1969 de DEC
- The Computer History Simulation Project (Focal está disponible como descarga gratuita aquí)
- ftp://www.cozx.com/pub/langs/focal.tar.gz Versión de fuente C que se ejecuta en varios sistemas operativos, incluido Linux
- la fuente 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 miniordenadores (en ruso) ISBN 5-217-00323-5
- Фокал снаружи и изнутри. (пишется) - FOCAL por fuera y por dentro. (en curso) (en ruso)
- Файл справки к фокалу-1б - Archivo de ayuda para FOCAL-1B (en ruso)