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 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 no programadores escribieran programas fácilmente. 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 rangos y funciones definidas por el usuario, se eliminaron para simplificar el analizador . Se cambió el nombre de algunas de las palabras reservadas (palabras clave) para que todas comiencen con una primera letra única. Esto permite a los usuarios escribir programas utilizando declaraciones de un 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 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 a un FOCAL-71 ligeramente modificado . También estaba disponible un puerto para Intel 8080 .

FOCAL destaca por ser el idioma en el que se escribieron las versiones originales de los primeros videojuegos Hamurabi y Lunar Lander . Posteriormente, ambos fueron portados 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 cambio 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

jose

JOSS fue lanzado en mayo de 1963 en la computadora JOHNNIAC única de RAND Corporation . En RAND, el uso creció rápidamente y la máquina, construida originalmente en 1953, rápidamente se quedó sin capacidad. JOHNNIAC fue dado de baja en 1966 y JOSS se reimplementó en una PDP-6 recién adquirida , la primera máquina "grande" de Digital Equipment Corporation (DEC). El uso siguió creciendo y, en 1970, el sistema lo utilizaban 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 transportarse de una habitación a otra y conectarse para un acceso rápido. [4]

JOSS fue muy influyente. Surgió justo cuando se introducía el tiempo compartido . Había un gran interés en la interacción hombre-máquina y las computadoras se estaban utilizando cada vez 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ó funciones 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 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 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. Por el contrario, JOSS tuvo que continuar leyendo hasta leer la palabra de 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 pudieron ahorrar memoria escribiendo solo esa letra, reduciendo el tamaño del código fuente .

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

La primera versión de FOCAL se lanzó en 1968 para el PDP-8 . Al año siguiente siguió una versión actualizada, 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 la PDP-5 y la PDP-12 . Era 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 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 cubrir el costo de la copia de la cinta, mientras que el código fuente se proporcionó de forma gratuita con otras compras. [5]

BÁSICO

Mientras 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 incursionando en el bastión de las minicomputadoras de DEC , vendiendo máquinas similares que ejecutaban versiones de BASIC de 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 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 Minnesota Educational Computing Consortium , 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 dispuesto a otorgar licencias a otros fabricantes de computadoras. FOCAL estaba librando una dura batalla contra BASIC, que estaba disponible en GE, Honeywell, HP y otras computadoras.
Creo que terminó en una situación como la de Sony y Betamax. Sony dijo: "Betamax es nuestro y es un formato mejor que VHS", y así fue. Pero entonces, JVC dijo: "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 y contrató a una empresa que, según supo más tarde, era un programador único 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", y los sistemas más grandes de la serie tenían versiones ampliadas de BASIC y, en algunos casos, también FOCAL y FORTRAN . También se crearon algunos EduSystems basados ​​​​en PDP-11. [7]

Luego, Ahl comenzó 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 presentaciones 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. [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 los años 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 ordenadores domésticos compatibles con el PDP-11 . El más notable entre varios modelos fue la serie Electronika BK , lanzada en 1985. Inicialmente se suministraban con FOCAL en un cartucho ROM , [9] mientras que un cartucho BASIC era un complemento opcional. Los modelos posteriores suministraban 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 anteponerles 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. sido 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 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 usaban 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 en otros comandos en modo 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 oscilan entre 1,01 y 31,99. Cuando se imprima, utilizando WRITEel equivalente FOCAL de BASIC 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 cuando se generan para que todos los números de línea se alineen. Las declaraciones que hacen referencia a esas líneas no necesitan los ceros iniciales, 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 cierto nivel de organización de código que falta en lenguajes como Fortran o BASIC. El uso principal de estos era usar 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 usó durante el tiempo de edición, por ejemplo, uno podría WRITE 2producir una listado 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 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

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 al BASIC INPUT.

01.01 PREGUNTE "NOMBRE", NOMBRE01.02 PREGUNTE "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 COMMENTcomando (abreviatura C) crea un comentario. [16] Equivalente al BASIC REM. El manual original enumera CONTINUEcomo sinónimo de COMENTARIO, usado para marcar líneas vacías, pero esto no tiene 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 al 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 regresa a la declaración después del 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 llegar al final del bloque o RETURNhasta encontrar a. RETURNSólo se requiere regresar temprano 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 los de BASIC FORdonde el incremento es el último valor. , si está presente.

A diferencia de otras partes del lenguaje donde varias declaraciones en una línea son independientes, FORsiempre ejecuta las declaraciones que siguen en la línea antes de que se cumpla la terminación y luego continúa con 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 existe un equivalente al BASIC 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 QUIERES PEDER PRESTADO?", DIRECTOR01.20 PREGUNTE "¿POR CUANTOS AÑOS?", PLAZO01.30 PARA TASA=4.0,.5,10;HACER 2.001.40 SALIR02.10 ESTABLECER INTERÉS=PRINCIPAL*(TASA/100)*TERMINO02.20 TIPO "TASA",TASA," ","INTERÉS",INTERÉS,!

IR A

El GOTOcomando (abreviatura G) salta la ejecución del programa al número de línea especificado. [18] Es idéntica a la declaración del mismo nombre en BASIC. En FOCAL, GOTOtambién se usa para comenzar la ejecución, como 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 !!,"INTENTAR OTRA VEZ.",!!!!!;IR A 1.1

SI

El IFcomando (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 pasa 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 número de la tercera 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 podría acortarse colocando un punto y coma (o final de línea) más allá del número de la primera 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] Equivalente a BASIC STOPo END.

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

DEVOLVER

El RETURNcomando (abreviatura R) bifurca 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 regresa 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 'SÍ O NO'22.80 PREGUNTE “¿RESPONDE SI O NO?”,UN22.82 SI (AN-0SI)22.84,22.8622.84 SI (AN-0NO)22.8,22.88,22.822.86 CONJUNTO X=2;RETORNO22.88 CONJUNTO X=1;REGRESAR

COLOCAR

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

01.30 CONFIGURAR PI=3.1415601.60 ESTABLECER INTERÉS=PRINCIPAL*(TASA/100)*TERMINO

TIPO

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

Los elementos pueden ser variables, cadenas literales entre comillas dobles o una variedad de caracteres de control. Los caracteres de control incluyen !para generar un retorno de carro y un avance de línea, #solo para el retorno de carro 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 ESCRIBE "HOLA, GUAPO. ¿CUÁNTO DINERO QUIERES PEDER PRESTADO?",!01.50 TIPO "INTERÉS",INTERÉS,!01.80 ESCRIBA "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 incluye 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] Así, 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, que rellenan todo el ancho definido. El uso exclusivo de % provocó que la salida se imprimiera en "formato de punto flotante" utilizando la E. [23]

Un carácter de control especial causaba $que se imprimiera una tabla con todas las variables definidas y sus valores. Sólo se imprimirán las dos primeras letras del nombre, complementadas 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 (la F está reservada para funciones) y pueden contener cualquier secuencia de letras y números. Sin embargo, sólo los dos primeros caracteres son significativos. Por ejemplo, el siguiente ejemplo de código de FOCAL: Un nuevo lenguaje conversacional [25] hace referencia a la misma variable que DESTINO y luego DES. Internamente, ambas referencias hacen referencia a una variable denominada DE:

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

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

Matemáticas

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

Una curiosidad de FOCAL era que todos los operadores tenían precedencia independiente, como en el orden anterior. Eso significa 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.

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

 01.30 CONFIGURAR 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 personajes

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 incluyó varias funciones de propósito especial: [28]

Comandos ambientales

Programas en ejecución

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

Editar comandos

Se ingresan nuevas líneas en un programa simplemente iniciando el comando con un número de línea. Los comandos de edición fueron 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 biblioteca

FOCAL incluía la capacidad de gestionar colecciones de programas FOCAL como una biblioteca de códigos. Los programas podrí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 pueden tener seis caracteres. El comando BIBLIOTECA (abreviatura L) tenía los siguientes subcomandos:

FOCAL-71 agregó:

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, se detectó el error de división por cero y lo informaría ?28.73 @ 01.10, donde 28.73 representa el código que busca este error en la página 28 de la memoria 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 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 era en gran medida 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 dependía más de 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 FSGNfunción ahora devuelve cero si la expresión de entrada se evalúa como cero. Anteriormente esto devolvería uno. Ahora FRANutilizaron un algoritmo mejor que produjo números más distribuidos aleatoriamente. También agregó 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, cuando se inició, FOCAL,1971 ingresó a un cuadro de diálogo que preguntaba al usuario qué funciones quería usar.

Comparación con JOSS

FOCAL es, a todos los efectos, una versión limpia de JOSS con cambios para hacer que la sintaxis sea más concisa y más fácil de analizar. Casi todos los comandos FOCAL tienen una correspondencia uno a uno con JOSS y difieren sólo en detalles. El cambio más obvio a primera vista es que JOSS no distingue entre mayúsculas y minúsculas y genera palabras clave en mayúsculas y minúsculas, mientras que FOCAL solo estaba en mayúsculas. Además, las declaraciones JOSS terminan con un punto, lo que las hace parecer declaraciones 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 de construcciones ify . forAdemás, las ramas y los bucles se podían aplicar a cualquier declaració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, se podría:

1.10 Tipo 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. Por el contrario, FOCAL carecía de 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 se ajusten más a las intenciones del programador, a costa de hacer que el tiempo de ejecución sea más complejo. 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 costo; en FOCAL, el inicio, la parada y el paso se pueden escribir en una estructura personalizada en memoria y actualizarse fácilmente a medida que se realiza 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 sea más conciso en FOCAL, los cambios fueron relativamente menores. Por ejemplo, JOSS' Do part 20.se convierte en FOCAL ligeramente 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 ASK, tanto para acortarla como para permitir que la letra D se use exclusivamente para DO.

Para simplificar el analizador, se eliminaron algunas construcciones JOSS. Por ejemplo, JOSS podía realizar múltiples tareas 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 TYPEcon el archivo %.

Comparación con BÁSICO

Las comparaciones entre FOCAL y BASIC eran inevitables ya que ambos lenguajes eran comunes en minicomputadoras de la misma época y los dos lenguajes tienen mucho en común en sintaxis y estructura. En la mayoría de los casos, existe una conversión directa del código FOCAL hacia y desde BASIC. Por ejemplo, para pedirle a un usuario que ingrese un valor, en FOCAL se haría:

PREGUNTE "¿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 IFBASIC, que permitía colocar cualquier declaració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 del final; en BASIC se usa IF this THEN thatmientras que JOSS usa that IF this. FOCAL se parecía más 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 los dos 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 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. Sólo al manipular cadenas individuales, o caracteres en ellas, esto se convirtió en un problema importante.

Como las variables de cadena no eran compatibles, al ingresar una cadena se utilizaba una chapuza que convertía cualquier carácter escrito por un usuario en su valor de carácter numérico. Por ejemplo, si uno escribiera HELLOuna 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 intentaría calcular "8" elevado a la potencia "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 útil. Sin embargo, al hacer preguntas que se responderían con respuestas de una sola letra, como "¿Necesita instrucciones, S o N?", los programadores podrían probar el resultado con valores de caracteres conocidos para producir lo que parecía una entrada de caracteres.

Anteponer un cero a una cadena la forzaría a ser numérica, por lo que los programas podrían probar cadenas específicas de varios caracteres usando declaraciones IF como las I (A-0BROWN) 1.00,2.00,1.00que se bifurcarán 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 ingresara texto con caracteres 'E' colocados de manera desafortunada. Por ejemplo, se podría probar "MARRÓN" o "ROJO", pero no "VERDE" o "AMARILLO".

La implementación PDP-8 de FOCAL utilizó una representación de punto flotante que representaba 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 una gama de valores significativamente más amplia que la mayoría de los intérpretes contemporáneos, lo que convierte a FOCAL en 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 utilizó inicialmente un formato de 32 bits , mientras que 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 daban como resultado pequeños restos 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 de la época, a menudo con entre 6 y 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

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

Posteriormente, FOCAL se implementó en 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 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 del programa pasaron 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 utilizó hasta principios de la década de 1990 en computadoras domésticas producidas 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 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. [31]

01.04 T "CONTROL LLAMADA 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/S. ¡TIENES 16000 LBS DE COMBUSTIBLE. ESTIMADO"!01.11 T "TIEMPO DE IMPACTO EN CAÍDA LIBRE-120 SEG. PESO DE LA CÁPSULA-32500 LBS"!01.20 T "¡¡¡Próximamente PRIMERA COMPROBACIÓN DEL RADAR"!!!;E01.30 T "INICIAR PROCEDIMIENTO DE ATERRIZAJE"!"TIEMPO,SEGS ALTITUD,"01.40 T "MILAS+PIES VELOCIDAD, MPH COMBUSTIBLE, LIBRAS 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 ES 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;Yo (I)7.1,7.1;Yo (V)3.8,3.8;Yo (J)8.103.80 D 6;G 3.104.10 T "FALTA COMBUSTIBLE EN",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 LAS",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!-(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 "¡FELICIDADES POR UN MAL ATERRIZAJE"!;G 5.905.70 I (40-W)5.81,5.81;T "DAÑO A LA NAVE. ¡BUENA SUERTE"!;G 5.905.81 I (60-W)5.82,5.82;T "ATERRIZAJE ESTRELLADO: ¡TIENES 5 HORAS DE OXÍGENO"!;G 5.905.82 T "LO PERDÓN, PERO NO HABÍA SOBREVIVIENTES. ¡LO ECHASTE!"05.83 T "HECHO QUE HAS EXPULSADO UN NUEVO CRÁTER LUNAR", W*.277777, "FT.DEEP".05.90 T!!!!"INTENTAR OTRA VEZ?"!05.92 A "(REST. SI 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 (I)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 separado en muchas subrutinas. Esto era casi universal en los programas FOCAL (y JOSS), ya que el esquema de número de línea hacía que dichas construcciones fueran fáciles de usar. Este programa utiliza nueve rutinas. El primero, el 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, sino que utiliza la Mmasa actual y la masa vacía, Npor lo que el combustible restante se registra M-Ny el módulo de aterrizaje se queda sin combustible cuando M-Nes 0. También tenga en cuenta el Erase al final de la línea 01.20, que restablece todos los valores de las variables.

El ciclo 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 02.20, se Ale pide al usuario que ingrese la velocidad de combustión como Ky luego el temporizador de bucle se reinicia usando S T=10. La línea 02.70 prueba la entrada del usuario frente a varias posibilidades, si es superior a 200 o inferior a 8, escribe "IMPOSIBLE" y una fila de puntos, y luego retrocede 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 IFcomando de FOCAL son evidentes aquí, en BÁSICO esto podría reducirse a una solaIF 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, de ser así, regresa para imprimir todo nuevamente, 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 este período , reducirá la masa del vehículo en su conjunto, más allá del peso vacío, N. Si no, continúa, si lo hace, en su lugar configura el temporizador de bucle a la cantidad de tiempo que se quemará el combustible restante. , finalizando 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.S*KS*K-M

Cuando se acabe el cronómetro de 10 segundos, o llegue al final debido a la prueba de combustible en la línea 03.10 o la prueba de altitud en 07.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 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; de ​​lo contrario, cae a 05.98 y Quits.

Ver también

Referencias

  1. ^ Manual de 1968, pag. 1.1.
  2. ^ DICIEMBRE de 1957 al presente (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". Tiempo . 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) (Reporte técnico). rand.
  5. ^ "¡Mira cómo crece tu Altair!". Byte . Abril de 1976. pág. 48.
  6. ^ abcd Szczepaniak 2014.
  7. ^ Manual de EduSystem (PDF) . Digital. 1973. pág. v.
  8. ^ ab 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. pag. 8.
  10. ^ "Electrónica BK-0010". Museo de la Computadora Antigua .
  11. ^ Manual de 1968.
  12. ^ ab Manual de 1968, pág. 2.1.
  13. ^ Manual abc 1968, pag. 2.7.
  14. ^ ab Manual de 1968, pág. 3.7.
  15. ^ Manual abc 1968, pag. 3.2.
  16. ^ Manual abc 1968, pag. 3.6.
  17. ^ Manual de 1968, pag. A.1.
  18. ^ ab Manual de 1968, pág. 3.4.
  19. ^ ab Manual de 1968, pág. 3.5.
  20. ^ Manual de 1968, pag. 3.3.
  21. ^ Manual de 1968, pag. 3.1.
  22. ^ Manual de 1968, pag. 2.2.
  23. ^ Manual de 1968, pag. 2.3.
  24. ^ Manual de 1968, pag. 2.5.
  25. ^ FOCAL: un nuevo lenguaje conversacional. Digital.
  26. ^ Manual abcde 1968, pag. 2.4.
  27. ^ Manual de 1968, pag. 3.10.
  28. ^ Manual de 1968, pag. A.3.
  29. ^ Manual de 1968, pag. 3.8.
  30. ^ "¿Qué pasó con el intérprete de Microsoft FOCAL?". YouTube . Consultado el 18 de septiembre de 2022 .
  31. ^ "Lander lunar". Documentos relacionados con el juego Lunar Landing .

Bibliografía

enlaces externos