stringtranslate.com

FOCAL (lenguaje de programación)

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 las máquinas de la serie de procesadores de datos programados (PDP) de Digital Equipment Corporation (DEC) .

JOSS fue diseñado para ser un lenguaje interactivo simple que permitiera que los programas fueran escritos fácilmente por personas que no eran programadores. FOCAL es muy similar a JOSS en 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 . Algunas de las palabras reservadas (palabras clave) se renombraron para que todas comiencen con una primera letra única. Esto permite a los usuarios escribir programas utilizando instrucciones 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 estaba limitado 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íneas , 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 . Cuando se trasladó al PDP-11 , el FOCAL-11 resultante dependía del sistema operativo subyacente , RT-11 , para proporcionar compatibilidad y edición de archivos. La definición del lenguaje se actualizó dos veces, a FOCAL-69 y a un FOCAL-71 muy ligeramente modificado . También estaba disponible un puerto para el Intel 8080 .

FOCAL es conocido por ser el lenguaje en el que se escribieron las versiones originales de los 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 desapareció en gran medida 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

JOSÉ

JOSS se lanzó en mayo de 1963 en la computadora JOHNNIAC de la Corporación RAND . En RAND, su uso creció rápidamente y la máquina, construida originalmente en 1953, pronto se quedó sin capacidad. JOHNNIAC se desmanteló en 1966 y JOSS se volvió a implementar en una PDP-6 recién adquirida , la primera máquina "grande" de Digital Equipment Corporation (DEC). Su uso continuó creciendo y, en 1970, el sistema lo usaban 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 llevarse con ruedas de una habitación a otra y enchufarse para un acceso rápido. [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 se estaban utilizando más. 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 proporcionaba 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. Los programadores de DEC estaban interesados ​​en JOSS, pero la mayoría de sus máquinas 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 línea DEC. Para lograrlo, 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 ramas , 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 lo compararía con una lista interna de posibles palabras clave, que era un carácter por entrada. En contraste, JOSS tenía que continuar leyendo hasta que hubiera leído la palabra de comando completa y luego la comparaba con una lista que contenía palabras completas. Este cambio no solo ahorraba memoria en el analizador, sino que los usuarios también podían ahorrar memoria escribiendo solo esa letra, lo que reducía el tamaño del código fuente .

Cintas perforadas PDP-8 , incluida una cinta FOCAL-69 con fecha del 7/9/69

La primera versión de FOCAL se lanzó en 1968 para la PDP-8 . Al año siguiente se publicó una versión actualizada, que más tarde se conocería como FOCAL-69. El sistema en su conjunto, independientemente de la versión, se conocía como FOCAL-8 cuando se trasladó a otras máquinas de la serie de 12 bits, incluidas la PDP-5 y la PDP-12 . Fue popular porque era muy eficiente en el uso de la memoria, que a menudo estaba muy limitada en estas máquinas a unos pocos kilobytes (KB). El similar FOCAL-11 se ejecutaba en la PDP-11 con 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. Esta versión se proporcionó a cambio del costo de copia de la cinta, mientras que el código fuente se proporcionó de forma gratuita con otras compras. [5]

BÁSICO

Mientras que FOCAL se estaba haciendo popular en las máquinas DEC, BASIC se estaba convirtiendo en una alternativa más popular en otras plataformas. A fines de la década de 1960, varias compañías estaban incursionando en el bastión de las minicomputadoras de DEC , vendiendo máquinas similares que ejecutaban versiones de BASIC de tiempo compartido. Entre ellas, se destacaba la serie HP 2100 , que ejecutaba HP Time-Shared BASIC . [6]

David H. Ahl se había unido recientemente al grupo PDP-8 de DEC, justo cuando la empresa se interesaba 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 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 cederlo bajo licencia a otros fabricantes de ordenadores. FOCAL estaba librando una batalla cuesta arriba contra BASIC, que estaba disponible en GE, Honeywell, HP y otros ordenadores.
Creo que acabó en una situación como la de Sony y Betamax. Sony decía: "Betamax es nuestro y es un formato mejor que VHS", lo cual era cierto. Pero entonces, JVC decía: "Tenemos VHS y Toshiba. Oye, ¿quieres usarlo? Bien, te lo cederemos bajo licencia por casi nada". [6]

Ahl se encargó 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 kWord. DEC comenzó a vender versiones empaquetadas del PDP-8 con terminales y el BASIC como la línea "EduSystem", con sistemas más grandes en la serie que tenían versiones expandidas de BASIC y, en algunos casos, también FOCAL y FORTRAN . También se crearon algunos EduSystems basados ​​en PDP-11. [7]

Ahl comenzó entonces a portar programas de FOCAL a BASIC, en particular The Sumer Game (al que rebautizó como Hamurabi ), una versión de Lunar Lander y muchas demostraciones más pequeñas de FOCAL. Combinando sus ports con propuestas de programadores externos, logró reunir 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. [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 . El más notable entre varios modelos fue la serie Electronika BK , lanzada en 1985. Estos se suministraron inicialmente con FOCAL en un cartucho ROM , [9] mientras que un cartucho BASIC era un complemento opcional. Los modelos posteriores suministraron 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 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 prefijarlos con un número de línea, en cuyo caso se añadían al programa si eran únicos, o anulaban el código existente si se había utilizado previamente el mismo número. [12]

El método de funcionamiento es similar al " modo inmediato " de BASIC frente al "modo de programa". 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 permitió 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 aquellas instrucciones que necesitaban cargarse y guardarse se convertían en opciones de otros comandos de modo de programa como Type. [12]

Declaraciones del programa

Cada línea de 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 punto fijo que consisten en 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. Cuando se imprime, utilizando WRITE, el equivalente de FOCAL a LIST, se agregarán ceros a la izquierda; 1.10 se imprimirá como 01.10. Esto hace que todos los números de línea tengan cinco dígitos de longitud cuando se imprimen, de modo que todos los números de línea se alinean. Las declaraciones que hacen referencia a esas líneas no necesitan los ceros a la izquierda, por ejemplo, GOTO 1.10. [13]

El número que se encuentra a la izquierda del punto se conoce como "número de grupo". Los grupos proporcionan un cierto nivel de organización del código que falta en lenguajes como Fortran o BASIC. El uso principal de estos era utilizar un grupo como una subrutina que se puede llamar con DO, por ejemplo, DO 5saltará a la subrutina escrita en el grupo 5. El editor también los usaba durante el tiempo de edición, por ejemplo, uno podía WRITE 2producir una lista del código en el grupo 2, o ERASE 4eliminar todas las líneas en el 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 "comando predeterminado" como es el caso en BASIC con su LETdeclaración opcional. Se pueden colocar múltiples 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 los bucles FOR. [14]

Comandos

PREGUNTAR

El ASKcomando (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 INPUT.

01.01 PREGUNTAR "NOMBRE", NOMBRE01.02 PREGUNTAR "COORDENADAS", X, Y01.03 PREGUNTAR "A1",A1,"OMEGA",W,"T0",T0,"FACTOR DE AMORTIGUACIÓN",FACTORAMORTIGUACIÓN

Si el usuario no ingresa un número sino texto, el sistema convertirá el carácter inicial en un número con "A"=1, "B"=2, etc.

COMENTARIO

El COMMENTcomando (abreviado C) crea un comentario. [16] Equivalente al de BASIC REM. El manual original lo enumera CONTINUEcomo sinónimo de COMMENT, utilizado para marcar líneas vacías, pero no tiene ninguna diferencia interna. [17]

01.01 COMENTARIO: EL JUEGO DEL VERANO, POR RICHARD MERRILL

HACER

El DOcomando (abreviatura D) ramifica la ejecución a una subrutina. Es el equivalente de BASIC GOSUB. La subrutina se referencia por número de grupo o número de línea. Si se proporciona un número de línea, se ejecuta esa línea única y luego se regresa 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 llega al final del bloque o RETURNse encuentra un . RETURNsolo se requiere que regrese antes del grupo, no es necesario al final del grupo. [18]

01.15 HACER 7.2401.16 HACER 8

PARA

El FORcomando (abreviatura 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 tercer valor es el valor final del bucle. Si solo se proporcionan dos valores, el primero es el valor inicial y el segundo es 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 está presente.

A diferencia de otras partes del lenguaje donde múltiples sentencias en una línea son independientes, el FORsiempre ejecuta las sentencias que lo siguen en la línea antes de que se haya alcanzado la terminación, y luego continúa con la siguiente línea. Por lo tanto, los bucles tienen que estar en una sola línea o, alternativamente, llamar a una subrutina con DO. No existe un equivalente de NEXT. [14]

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 QUIERE PEDIR PRESTADO?", PRINCIPAL01.20 PREGUNTAR "¿POR CUÁNTOS AÑOS?", PLAZO01.30 PARA TASA=4.0,.5,10;HACER 2.001.40 SALIR02.10 ESTABLECER INTERÉS=CAPITAL*(TASA/100)*PLAZO02.20 TIPO "TASA",TASA," ","INTERÉS",INTERÉS,!

IR A

El GOTOcomando (abreviado G) hace que la ejecución del programa salte al número de línea especificado. [18] Es idéntico a la instrucción del mismo nombre en BASIC. En FOCAL, GOTOtambién se utiliza para comenzar la ejecución, como el comando de BASIC RUN, pero en este uso, 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.0102.90 ¡TIPO!, "INTENTE OTRA VEZ.",!!!!!; IR A 1.1

SI

El IFcomando (abreviatura I) proporciona una ramificació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 ramifica 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 tercer número de línea. El lenguaje carecía de operadores relativos como mayor que, igual o menor que. Para ramificar si X > 5, se debe comparar X - 5. [19]

02.20 SI (25-25) 2.4,2.3,2.403.01 SI (X) 3.1,3.02,3.1

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.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. [19]

ABANDONAR

El QUITcomando (abreviatura Q) finaliza la ejecución del programa y devuelve el control al entorno de edición. [16]STOP Equivalente a o de BASIC END.

01.10 PARA X=-10,1,10;TIPO X01.20 SALIR

DEVOLVER

El RETURNcomando (abreviatura R) ramifica la ejecución desde una subrutina hasta la ubicación de llamada. [16] El uso de RETURNes opcional en la última línea de una subrutina, una subrutina retorna en la última línea del grupo de todos modos. La siguiente es una subrutina de ejemplo para convertir un mensaje de sí/no en un valor. [1]

22.78 COMENTARIO: SUBRUTINA 'SI O NO'22.80 PREGUNTE "¿RESPONDA SÍ O NO?",AN22.82 SI (AN-0SI)22.84,22.8622.84 SI (AN-0NO)22.8,22.88,22.822.86 ESTABLECER X=2;RETORNO22.88 ESTABLECER X=1;RETORNO

COLOCAR

El SETcomando (abreviatura S) asigna los resultados de una expresión a la variable especificada. [20] Equivalente a LET.

01.30 ESTABLECER PI=3.1415601.60 ESTABLECER INTERÉS=CAPITAL*(TASA/100)*PLAZO

TIPO

El TYPEcomando (abreviatura T) permite la salida de uno o más elementos separados por comas. [21] Equivalente a PRINT.

Los elementos pueden ser variables, cadenas literales entre comillas dobles o una variedad de caracteres de control. Los caracteres de control incluyen el !para generar un retorno de carro y un salto de línea, #para el retorno de carro solo y :para un carácter de tabulación. Los caracteres de control se pueden encadenar, por ejemplo, !!!generarán tres CR/LF sin necesidad de separarlos con comas. [15]

TIPO [NÚMEROS, E1, "TEXTO", !, #, :, $ O %] ...SALIDA01.10 TIPO "HOLA, GUAPO. ¿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 incluía un especificador de formato opcional indicado mediante 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 punto. [22] Por ejemplo:

Conjunto A=67823TIPO %6.01,A= 67823.0TIPO %5,A= 67823TIPO %8.03,A= 67823.000TIPO %,A= 6,7823E4

Tenga en cuenta los espacios iniciales adicionales en algunos ejemplos, que rellenan el ancho definido. El uso de % solo provocó que la salida se imprimiera en "formato de punto flotante" utilizando la E. [23]

Se utilizó un carácter de control especial $que hacía que se imprimiera una tabla con 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: [24]

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 [25] hace referencia a la misma variable que DESTINATION y luego DES. Internamente, ambas referencias hacen referencia a una variable designada DE:

01.80 CONSULTAR DESTINO02.30 SI (DES-14) 2.4,3.1,2.4

Cualquier variable puede ser tratada como una matriz, permitiendo subíndices desde -2048 hasta 2047.[2]

Matemáticas

FOCAL contenía cinco operadores matemáticos: [26]

Una curiosidad de la versión de 1968 de FOCAL era que los operadores tenían precedencia independiente, como en el orden anterior. Aunque esto ciertamente se aplica a la exponenciación, la multiplicación y la división, hay 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. [26] Esto puede causar errores sutiles al convertir el código fuente de FOCAL a otros sistemas.

Sin embargo, + y - tienen la misma precedencia en FOCAL-69 y FOCAL-71, por lo que SET T=2-3+1el resultado es 0, como se esperaba.

FOCAL era inusual en el sentido de que las expresiones matemáticas podían usar (), [] y <> indistintamente en pares coincidentes para establecer precedencia. [26] Por ejemplo, la siguiente es una expresión válida:

 01.30 CONJUNTO 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. [26]

El lenguaje contenía las siguientes funciones integradas: [27]

Funciones de los caracteres

FOCAL-71 agregó dos nuevas funciones para ingresar valores de un solo carácter, similares a ASK pero que devuelven valores ASCII.

Otras funciones

FOCAL también incluía varias funciones especiales: [28]

Comandos del entorno

Programas en ejecución

FOCAL se utiliza GOTOen el editor para iniciar un programa. Sin embargo, una regla general era abreviarlo a GO. Este es el equivalente de RUNen BASIC. GOTOTambién se puede utilizar en el editor para iniciar la ejecución en una línea específica.

Comandos de edición

Las nuevas líneas se introducen en un programa simplemente iniciando el comando con un número de línea. Los comandos de edición eran ERASE(abreviatura E), [26] MODIFY (abreviatura M), [29] y WRITE(abreviatura W): [15]

Comandos de archivo

El comando del archivo era OPEN (abreviatura O):

Comandos de la biblioteca

FOCAL incluía la capacidad de gestionar colecciones de programas FOCAL como una biblioteca de códigos. Los programas podían llamar a otros programas en cadena mediante LIBRARY CALL, o llamar a una única subrutina en otro programa mediante LIBRARY GOSUB. Los nombres de los programas podían tener seis caracteres de longitud. El comando LIBRARY (abreviatura L) tenía los siguientes subcomandos:

Se agregó FOCAL-71:

Códigos de error

Como el intérprete no tenía 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 el 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 se produjo 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 era una actualización importante que añadía 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 basaba en el emergente OS/8 (en aquel entonces todavía conocido como PS/8) y dependía más de ese sistema operativo para el manejo y la 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 evaluada era cero. Anteriormente, esto devolvía uno. FRANAhora se utiliza un algoritmo mejor que produce números distribuidos de forma más aleatoria. También se agregó la nueva FINfunción que toma una cadena y devuelve su valor ASCII (similar a la de BASIC ASC) y FOUTque toma un número y devuelve una cadena con ese carácter ASCII ( CHR).

Como todas estas opciones utilizaban una memoria limitada, al iniciarse, FOCAL,1971 aparecía un cuadro de diálogo que preguntaba al usuario qué funciones deseaba utilizar.

Comparación con JOSS

FOCAL es, a todos los efectos, una versión mejorada de JOSS con cambios para hacer 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 difieren solo en los detalles. El cambio más obvio a primera vista es que JOSS no distingue entre mayúsculas y minúsculas y genera las palabras clave en mayúsculas y minúsculas combinadas, mientras que FOCAL solo usaba mayúsculas. Además, las instrucciones de JOSS terminan con un punto, lo que las hace parecer instrucciones 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 booleanaif que operaba dentro de las construcciones y for. Además, las ramificaciones y los bucles podían aplicarse a cualquier instrucción, a diferencia de FOCAL, donde la única operación que cualquiera de las dos podía llevar a cabo 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 en función del valor de X, y la segunda imprime los números del 1 al 10. Por el contrario, FOCAL no tenía la capacidad de comparar valores y se aplicaban bucles 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 de un 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 manera flexible como 1,2,3,10(5)50,75,78. Esta flexibilidad tiene un costo; en FOCAL, el inicio, la detención y el paso se pueden escribir en una estructura personalizada en memoria y actualizarse fácilmente a medida que se ejecuta el bucle, mientras que JOSS requiere que se reevalúe una expresión que puede ser, pero a menudo no lo es, más compleja.

Para que el código de FOCAL fuera más conciso, se hicieron cambios relativamente menores. Por ejemplo, JOSS' Do part 20.se convierte en FOCAL, que es un poco más pequeño DO 20, mientras que Do step 20.1se convierte en DO 20.1. Las palabras clave de comando también se acortaron cuando fue posible, por lo que JOSS' Demandse convierte en FOCAL's ASK, tanto para acortarlo como para permitir que la letra D se use de manera única 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 realizarse con instrucciones individuales. SET S=P; SET P=Q; SET Q=SDel mismo modo, la construcción de JOSS Form, utilizada para formatear la salida, se combinó con la de FOCAL TYPEcon la construcción de %.

Comparación con BASIC

Las comparaciones entre FOCAL y BASIC eran inevitables, ya que ambos lenguajes eran comunes en las minicomputadoras de la misma época y ambos tienen mucho en común en cuanto a sintaxis y estructura. En la mayoría de los casos, existe una conversión directa del código FOCAL a y desde BASIC. Por ejemplo, para pedirle a un usuario que ingrese 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?" , 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 el IFen BASIC, que permitía que cualquier declaración se colocara 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 comienzo 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 parecido al goto calculadoIF de BASIC , , pero permitía cualquier número de líneas como objetivos, en lugar de solo tres para negativo, cero y positivo como en FOCAL.ON X GOTO 10,20,30ON...GOTO

Otra diferencia importante entre ambos es que FOCAL carecía de soporte inherente para cadenas como elementos de datos que pudieran asignarse a variables. Como era el caso en las primeras versiones de BASIC o FORTRAN antes de la incorporación de cadenas (en F77), esta limitación se evitaba generalmente mediante el uso de cadenas literales en los comandos de entrada y salida. Fue solo al manipular cadenas individuales, o caracteres en ellas, que esto se convirtió en un problema significativo.

Como no se admitían variables de cadena, para introducir una cadena se utilizaba un truco que convertía cualquier carácter introducido por un usuario en su valor numérico. Por ejemplo, si se escribía HELLOen una declaració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 "LLO", lo que llevaría varios segundos de tiempo de CPU y daría como resultado un valor de 0,76593020E+103, una respuesta poco útil. Sin embargo, al hacer preguntas que se responderían utilizando respuestas de una sola letra, como "¿Necesitas instrucciones, Y o N?"Los programadores podrían probar el resultado contra valores de caracteres conocidos para producir lo que parece una entrada de caracteres.

Anteponer un cero a una cadena la convertiría en numérica, por lo que los programas podrían probar cadenas de caracteres múltiples específicas utilizando instrucciones IF como, por ejemplo, I (A-0BROWN) 1.00,2.00,1.00which se ramificará a 2.00 si A = "BROWN" o 1.00 en caso contrario. Sin embargo, el programa arrojaría un error de desbordamiento si el usuario ingresaba texto con caracteres 'E' colocados de manera desafortunada. Por ejemplo, se podría probar "BROWN" o "RED" pero no "GREEN" o "YELLOW".

La implementación PDP-8 de FOCAL 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 significativamente más amplio que la mayoría de los intérpretes contemporáneos, lo que hacía de FOCAL una opción razonable para el trabajo numérico serio. 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 utilizó inicialmente un formato de 32 bits , mientras que las versiones posteriores lo ampliaron a 40 bits. La mayoría de los BASIC tenían problemas con el redondeo que conducían a ecuaciones simples que resultaban en minúsculos restos distintos de cero.

En general, se acepta que FOCAL era más eficiente en el uso de los recursos que los sistemas BASIC comparables. En una máquina típica de la época, a menudo con 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 spin-offs

La Corporación Coca-Cola utilizó una versión personalizada de FOCAL llamada COKE. [ cita requerida ]

FOCAL se implementó posteriormente en los modelos PDP-7, PDP-9, PDP-10, PDP-11, PDP-12, PDP-5 y LINC-8.

El manual de FOCAL mostró cómo agregar comandos al analizador FOCAL, por lo que muchos sitios agregaron comandos especializados para operar hardware personalizado.

La Digital Equipment Computer Users' Society recopiló numerosos parches y mejoras para FOCAL. Incluso hubo importantes versiones mejoradas de FOCAL, como FOCAL-W, que agregó muchas funciones, incluida una mejor entrada/salida 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 Tektronix 4010/14.

En Rusia , se siguió utilizando hasta principios de la década de 1990 en ordenadores domésticos producidos en masa de la serie Electronika BK .

Microsoft vendió una versión de FOCAL suministrada en cinta de papel. [30] Según Raymond Chen, falta la cinta maestra y FOCAL ya no está disponible.

Código de ejemplo

El módulo de aterrizaje 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 es del original y se encuentra en la página de Jim Storer sobre el módulo de aterrizaje lunar. [31]

01.04 T "CONTROL LLAMADA AL MÓDULO LUNAR. ¡ES NECESARIO 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. ¡TIENES 16000 LBS DE COMBUSTIBLE. ESTIMADO"!01.11 T "TIEMPO DE IMPACTO DE CAÍDA LIBRE: 120 SEGUNDOS. PESO DE LA CÁPSULA: 32 500 LIBRAS"01.20 T "¡PRIMERA COMPROBACIÓN DE RADAR!"!!!;E01.30 T "¡INICIE PROCEDIMIENTO DE ATERRIZAJE!"TIEMPO, SEGUNDOS ALTITUD,"01.40 T "VELOCIDAD EN MILLAS+PIES, COMBUSTIBLE EN MPH, TASA DE COMBUSTIBLE EN LBS"!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 Yo (MN-.001)4.1;Yo (T-.001)2.1;SS=T03,40 Yo ((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 "¡SE AGOTA EL COMBUSTIBLE A LAS 1,8 SEG"!04.40 SS=(FSQT(V*V+2*A*G)-V)/G;SV=V+G*S;SL=L+S05.10 T "EN LA LUNA A LAS",L,"SEG"!;SW=3600*V05.20 T "VELOCIDAD DE IMPACTO DE",W,"MPH"!,"COMBUSTIBLE QUEDA:"MN,"LBS"!05.40 I (1-W)5.5,5.5;T "¡ATERRIZAJE PERFECTO! (¡SUERTE!)"!;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 "¡FELICITACIONES POR UN MAL ATERRIZAJE"!;G 5.905.70 I (40-W)5.81,5.81;T "DAÑOS EN LA NAVE. ¡BUENA SUERTE"!;G 5.905.81 I (60-W)5.82,5.82;T "ATERRIZAJE FORZOSO: ¡TIENES 5 HORAS DE OXÍGENO"!;G 5.905.82 T "LO SIENTO, PERO NO HUBO SOBREVIVIENTES. ¡LO ARRUINASTE!"05.83 T "HECHO QUE HAS EXPLOTADO UN NUEVO CRÁTER LUNAR",W*.277777," FT.DEEP."05.90 T !!!!"¿INTENTA OTRA VEZ?"!05.92 A "(RESPUESTA SÍ O NO)"P;I (P-0NO)5.94,5.9805,94 I (P-0SI)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 Yo (Yo)7.1,7.1;D 6;Yo (-J)3.1,3.1;Yo (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 dividido en muchas 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. La primera, el grupo 1, simplemente imprime las instrucciones utilizando la Tdeclaración ype y establece los valores iniciales para la ejecución. La masa de combustible no se registra directamente, en su lugar, utiliza la Mmasa actual de ass 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. Observe también el Erase al final de la línea 01.20, que restablece todos los valores de las variables.

El bucle principal del juego está controlado por el grupo 2. A medida que el código "cae" a través del grupo 1 al grupo 2 durante la primera ejecución, los valores iniciales se imprimen en las primeras dos líneas. Cerca del final de la línea 02.20, se Ale pide al usuario que ingrese la velocidad 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 frente a varias posibilidades; si es mayor de 200 o menor de 8, escribe "NO ES POSIBLE" y una fila de puntos, y luego vuelve al bucle anterior para pedirle al usuario que lo intente nuevamente. Si el valor está entre estos valores, salta al grupo 3. Tenga en cuenta que las capacidades limitadas del IFcomando FOCAL son evidentes aquí; en BASIC, esto podría reducirse a un solo comando.IF K>200 OR K<8 THEN...

El grupo 3 primero prueba para ver si se ha acabado el combustible, y salta al grupo 4 si es así. Luego prueba si el período de 10 segundos Tha 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 03.40 prueba para ver si la cantidad de combustible quemado en este período, , reducirá la masa del vehículo en su conjunto, , más allá del peso vacío, N. Si no, sigue adelante, si lo hará, en su lugar establece el temporizador del bucle en la cantidad de tiempo que se quemará el combustible restante, terminando así el bucle antes de tiempo. En cualquier caso, llama al grupo 9 para actualizar la velocidad y la posición. Luego repite los grupos 7, 8 y 9 hasta que el valor de I converge.S*KS*K-M

Cuando se agota el tiempo 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 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 01.20 para borrar todos los valores e imprimir los encabezados nuevamente, si no, pasa a 05.98 y Qsale.

Véase también

Referencias

  1. ^ Manual 1968, pág. 1.1.
  2. ^ Dic., 1957 hasta la actualidad (PDF) . Dic. 1978. pág. 38.
  3. ^ McCracken, Harry (29 de abril de 2014). «Cincuenta años de BASIC, el lenguaje de programación que hizo que las computadoras fueran personales». Time . Archivado desde el original el 5 de febrero de 2016. Consultado el 12 de febrero de 2016 .
  4. ^ ab Marks, Shirley (diciembre de 1971). Los años de JOSS: reflexiones sobre un experimento (PDF) (informe técnico). Rand.
  5. ^ "¡Mira cómo crece tu Altair!". Byte . Abril de 1976. pág. 48.
  6. ^ abcd Szczepaniak 2014.
  7. ^ Manual del sistema educativo (PDF) . Digital. 1973. p. V.
  8. ^ desde Savetz 2013.
  9. ^ 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. pág. 8.
  10. ^ "Elektronika BK-0010". Museo de la Computación Antigua .
  11. ^ Manual 1968.
  12. ^ ab Manual 1968, pág. 2.1.
  13. ^ Manual abc 1968, pág. 2.7.
  14. ^ ab Manual 1968, pág. 3.7.
  15. ^ Manual abc 1968, pág. 3.2.
  16. ^ Manual abc 1968, pág. 3.6.
  17. ^ Manual 1968, pág. A.1.
  18. ^ ab Manual 1968, pág. 3.4.
  19. ^ ab Manual 1968, pág. 3.5.
  20. ^ Manual 1968, pág. 3.3.
  21. ^ Manual 1968, pág. 3.1.
  22. ^ Manual 1968, pág. 2.2.
  23. ^ Manual 1968, pág. 2.3.
  24. ^ Manual 1968, pág. 2.5.
  25. ^ FOCAL: Un nuevo lenguaje conversacional. Digital.
  26. ^ Manual abcde 1968, pág. 2.4.
  27. ^ Manual 1968, pág. 3.10.
  28. ^ Manual 1968, pág. A.3.
  29. ^ Manual 1968, pág. 3.8.
  30. ^ "¿Qué pasó con el intérprete FOCAL de Microsoft?". YouTube . Consultado el 18 de septiembre de 2022 .
  31. ^ "Lunar Lander". Documentos relacionados con el juego Lunar Landing .

Bibliografía

Enlaces externos