
direct mode. Nótese la diferencia entre el punto al final de las instrucciones y el punto medio para la multiplicación.JOSS (acrónimo de JOHNNIAC Open Shop System ) [ a ] fue uno de los primeros lenguajes de programación interactivos de tiempo compartido . Fue pionero en muchas características que se volverían comunes en los lenguajes desde la década de 1960 hasta la de 1980, incluido el uso de números de línea como instrucciones de edición y destinos para bifurcaciones , sentencias basadas en decisiones booleanas y un editor de código fuente incorporado que puede ejecutar instrucciones en modo directo o inmediato, lo que ellos denominaron una interfaz de usuario conversacional .
JOSS se implementó inicialmente en la máquina JOHNNIAC de RAND Corporation y se puso en línea en 1963. Resultó muy popular y los usuarios rápidamente sobrecargaron la máquina. Para 1964, se buscó un reemplazo con mayor rendimiento. JOHNNIAC se retiró en 1966 y fue reemplazado por un PDP-6 , que finalmente llegó a soportar cientos de terminales de computadora basados en el IBM Selectric . Los terminales usaban tinta verde para la entrada del usuario y negra para la respuesta de la computadora. Cualquier comando que no se entendiera provocaba la respuesta Eh?.
El sistema tuvo una gran influencia, dando lugar a diversas adaptaciones y ramificaciones. Algunas se mantuvieron similares a la original, como TELCOMP y STRINGCOMP , CAL , CITRAN, ISIS, PIL/I, JEAN ( serie ICT 1900 ), BOSS e INTERP en el Burroughs B5500 , y Algebraic Interpretive Dialogue (AID, en el PDP-10 ). Otras, como FOCAL y MUMPS , se desarrollaron en direcciones distintas. JOSS también guarda un gran parecido con los intérpretes BASIC que se encontraban en los microordenadores de la década de 1980, diferenciándose principalmente en detalles de sintaxis .
Historia
Idea inicial
En 1959, Willis Ware escribió un memorando para RAND sobre el tema de la computación en el que afirmaba que las computadoras futuras tendrían "una multiplicidad de estaciones personales de entrada/salida, de modo que muchas personas puedan interactuar con la máquina al mismo tiempo". [ 2 ] El memorando captó el interés de la Fuerza Aérea de los Estados Unidos , principal patrocinador de RAND, y en 1960, formaron el Proyecto de Procesamiento de Información para explorar este concepto, lo que pronto se conocería como tiempo compartido . El proyecto no se centraba específicamente en el tiempo compartido, sino que tenía como objetivo mejorar la interacción humano-computadora en general. La idea en ese momento era que la interacción constante entre el usuario y la computadora de forma bidireccional haría que dichas interacciones fueran más naturales. [ 2 ] Como lo expresó más tarde el director de JOSS, Keith Uncapher :
Creo que dos percepciones impulsaron el experimento. Una era que, al menos desde 1950, cuando me uní a Rand, siempre hubo un enfoque en la parte de ciencias de la computación de Rand hacia una interacción fluida con el usuario. Era algo intrínseco a nosotros. Lo aprendimos de Gunning... era lo único en lo que pensábamos. La otra era ver a los matemáticos batallando con las calculadoras Marchant, sin poder usar JOHNNIAC en su forma básica. Era demasiado difícil. Tenían que aprender a programar. Era una experiencia frustrante para ellos. Queríamos algo que les pareciera una forma natural de pensar en una ayuda para la solución de sus problemas sin mucha capacitación, y sin ninguna percepción de convertirse en programadores, porque eso los habría alejado. [ 3 ]
En marzo de 1961 se aceptó una propuesta formal para desarrollar lo que se convertiría en JOSS en la computadora JOHNNIAC. [ 2 ]
JOSS-1
JOSS fue implementado casi en su totalidad por J. Clifford Shaw , un matemático que trabajaba en la creciente división de computación de Rand. Fue escrito en un lenguaje ensamblador simbólico llamado EasyFox (E y F en el alfabeto fonético militar estadounidense de la época), también desarrollado por Shaw. [ 4 ]
El sistema JOSS se presentó formalmente por primera vez en mayo de 1963, soportando cinco consolas, una en la sala de máquinas y otras cuatro en oficinas alrededor del edificio. [ 5 ] Las primeras consolas se basaban en la máquina de escribir transmisora IBM Modelo 868, ya que la Selectric aún no se había introducido en el mercado cuando comenzó el desarrollo. [ 6 ] El primer horario se publicó el 17 de junio, con JOSS funcionando durante tres horas, de 9 a 12 todos los días. [ 7 ] Se declaró completamente operativo en ocho terminales en enero de 1964. [ 1 ] La versión final se implementó en enero de 1965. [ 8 ]
Para entonces, el JOHNNIAC ya tenía más de una década, y su lógica basada en válvulas nunca fue muy fiable. Incluso cuando funcionaba bien, el sistema se hizo tan popular que rápidamente se ralentizó. Los usuarios estaban entusiasmados; uno de ellos afirmó:
La gente adapta su vida a JOSS… No sirve de nada llegar a RAND antes de las 10:00 a. m. cuando llega JOSS; de hecho, el mediodía o después de las 5:00 p. m. es mejor, JOSS está menos ocupado. Cuando JOSS empieza a teclear respuestas, el placer estimulante solo se compara con la angustia que sigue cuando JOSS empieza a escribir galimatías [ sic ] o se va condenando tu código al olvido. Apenas podemos vivir con JOSS, pero no podemos vivir sin él. [ 9 ]
Otro lo expresó de forma más concisa:
Es mejor que la cerveza; nos tiene enganchados. [ 1 ]
Conmutación JOSS-2
En mayo de 1964, se decidió buscar una nueva máquina para reemplazar la JOHNNIAC y dedicarla exclusivamente a ejecutar una versión ampliada de JOSS. La máquina también tendría que ser compatible con nuevos terminales fabricados según las especificaciones de Rand y entregarse antes del 31 de octubre de 1965. [ 7 ]
Se recibieron un total de nueve ofertas para la nueva máquina. Digital Equipment Corporation (DEC) ganó el concurso con su nuevo sistema PDP-6 , y la Fuerza Aérea liberó los fondos para la compra. DEC también acordó construir treinta terminales basadas en la máquina de escribir IBM Selectric modificada con un mecanismo especial para avanzar a la página siguiente mediante una alimentación de papel en abanico. Otras empresas suministraron varias partes del sistema completo. [ 10 ]
El PDP-6 llegó a finales de julio de 1965 y se probó inicialmente utilizando Teletype Modelo 33 como terminales. La nueva versión del código fue desarrollada por Charles L. Baker, Joseph W. Smith, Irwin D. Greenwald y G. Edward Bryan. El sistema se declaró operativo por primera vez en octubre, aunque esto incluía seis horas de mantenimiento programado por semana. [ 11 ] El primer prototipo de terminal llegó en noviembre. En diciembre, un terminal en Las Vegas se conectó a la máquina de forma remota por primera vez. [ 10 ] En febrero de 1966, este se envió a la Base de la Fuerza Aérea McClellan , seguido de uno en agosto a la Academia de la Fuerza Aérea y dos en septiembre a ARPA y una oficina de la Fuerza Aérea en el Pentágono . La primera conexión de teletipo permanente fuera de las instalaciones para un Teletype Modelo 35 se instaló en la Base de la Fuerza Aérea Langley en febrero de 1967. [ 11 ]
Con la nueva máquina en funcionamiento, JOHNNIAC se desconectó el 11 de febrero de 1966 y se retiró oficialmente el 18 de febrero. Su último programa en ejecución estaba escrito en JOSS y mostraba los segundos restantes hasta su apagado. La máquina fue enviada al Museo del Condado de Los Ángeles [ 12 ] y finalmente terminó en el Museo de Historia de la Computación en las afueras de San Francisco [ 13 ] . Habiendo sido reemplazada por el sistema JOSS-2, la original pasó a denominarse retroactivamente JOSS-1 [ 14 ] .
Uso de JOSS-2
A finales de 1966, el nuevo sistema JOSS-2 estaba completamente operativo y se puso a disposición de JOSS para su uso las 24 horas del día, los 7 días de la semana. La nueva máquina ofrecía una velocidad de cálculo aproximadamente 30 veces mayor, cinco veces más espacio de almacenamiento por usuario y muchas características nuevas en el propio lenguaje. [ 15 ] [ 1 ] La nueva plataforma podía soportar hasta 100 terminales en uso simultáneo. [ 16 ] La Fuerza Aérea siguió siendo la propietaria del sistema, con Rand y otros operando como consultores. El tiempo de CPU se facturaba a los usuarios externos a una tarifa de aproximadamente 1 dólar por minuto, aunque esto solo se aplicaba durante la ejecución real; el tiempo dedicado a escribir e imprimir era gratuito. [ 17 ]
Para 1970, había entre 500 y 600 usuarios en Rand y en varios emplazamientos de la Fuerza Aérea en todo el país. [ 18 ] Muchos de ellos eran usuarios ocasionales, precisamente para lo que se había diseñado el sistema. Para darles soporte, los terminales personalizados se equiparon con enchufes especiales "JOSS" para que pudieran trasladarse de una oficina a otra y conectarse a tomas de corriente personalizadas. Se instalaron doscientos de estos enchufes en Rand, y el chasis del terminal se diseñó para que fuera lo suficientemente estrecho como para pasar por las puertas, dejando espacio para una taza de café a un lado. [ 19 ] Al accionar el interruptor de encendido del terminal, este se conectaba en la nueva ubicación. [ 16 ]
Los terminales personalizados se diseñaron para JOSS, ya que los ingenieros consideraban que las funciones de telecomunicaciones del Modelo 33 eran un misterio para quienes no estaban capacitados y resultarían demasiado confusas para los usuarios ocasionales. [ 20 ] En la práctica, los mecanismos basados en Selectric demostraron ser demasiado frágiles para el uso constante al que estaban sometidos y los técnicos de IBM los reparaban frecuentemente en el campo. En 1970, un tercio de los terminales se reconstruyeron por completo y se redujo la velocidad de salida del ordenador para mejorar la fiabilidad. Para entonces, la Fuerza Aérea había decidido utilizar el Modelo 35, ya que estaba fácilmente disponible y era mucho menos costoso. [ 21 ] [ 11 ]
Los usuarios fueron entusiastas y, para atenderlos, Rand comenzó a publicar The JOSS Newsletter , editado por Shirley Marks. Finalmente, se publicaron 44 números entre noviembre de 1967 y junio de 1971. [ 22 ]
JOSS-3
A principios de la década de 1970, programadores de una de las instalaciones de IBM en la costa oeste construyeron un JOSS-3 para el IBM 370/158 con OS/360 . Existe poca información sobre este sistema, salvo que fue en esta máquina donde JOSS finalmente se retiró. [ 23 ] Según una nota en una reseña histórica, Rand se mostró reacio a permitir que IBM utilizara el nombre JOSS y, como resultado, "la versión de IBM nunca se utilizó ampliamente". [ 24 ]
Implementación

JOSS-II en el PDP-6 estaba dividido en dos partes, de acuerdo con la distribución de la memoria interna de la máquina. La máquina estaba equipada con dos bancos de memoria principal , con 16k palabras de 36 bits en cada banco. El propio sistema JOSS, que incluía el sistema operativo , el código de gestión de usuarios y archivos, el controlador de terminal y el intérprete, consumía gran parte del primero de estos bancos. El segundo banco se utilizaba para los programas de usuario. Aunque esta era una cantidad de memoria relativamente grande para la época, el sistema se utilizaba tanto que el almacenamiento de usuario de 16k palabras no era suficiente, y se respaldaba con un tambor magnético para la paginación . [ 16 ] El tambor era accionado por hardware externo y no requería atención del procesador principal. [ 25 ]
Para admitir múltiples programas de usuario, el hardware del PDP-6 se modificó para examinar el bit 20 de cualquier referencia de dirección. Si este bit estaba activado, la dirección se encontraba en el "espacio de usuario" y se modificaba de manera que la dirección cero apuntara a la dirección base de ese usuario. De esta forma, los programas de usuario podían moverse por la memoria sin causar problemas al sistema, y el sistema operativo podía cambiar de usuario simplemente modificando un único registro interno. [ 16 ]
El almacenamiento permanente lo proporcionaba un disco duro de Storage Products con 5,7 millones de palabras de almacenamiento. Al igual que con el tambor, la entrada/salida real hacia y desde el tambor se gestionaba externamente, aunque en este caso el movimiento se activaba mediante acciones del usuario para cargar y almacenar sus programas. Se utilizaba una unidad de cinta compatible con IBM para transferir datos hacia y desde la unidad según fuera necesario, una operación que también era independiente de la CPU. También estaban disponibles dos unidades DECtape que funcionaban de la misma manera que la unidad IBM. [ 26 ] Había programas de demostración disponibles, como una calculadora de hipotecas y los primeros juegos de mainframe . [ 27 ] Debido a que los programas grandes causaban paginación que ralentizaba el ordenador para todos, el boletín informativo de JOSS a menudo pedía a los usuarios que utilizaran menos almacenamiento. [ 28 ]
Los terminales se gestionaban mediante un "concentrador" personalizado que consistía en un interruptor mecánico Strowger capaz de conectar cualquiera de los 300 a 400 conectores de terminal posibles a cualquiera de las 40 salidas. Otras ocho líneas estaban dedicadas a las entradas del Teletipo Modelo 33 , a diferencia de los Selectric de estilo JOSS. Estas 48 líneas se conectaban a un multiplexor electrónico conectado a la CPU. El multiplexor funcionaba mediante interrupciones , lo que significaba que los terminales inactivos no consumían ciclos. [ 26 ]
Los terminales JOSS personalizados fueron fabricados por DEC. Estos consistían en un mecanismo Selectric integrado en un chasis personalizado que contenía el sistema de comunicaciones, la fuente de alimentación y otros componentes. Se utilizó una esfera tipográfica personalizada para proporcionar símbolos matemáticos básicos como ≠, por lo que no fue necesario utilizar combinaciones de dos caracteres como <>. El sistema de comunicaciones se basaba en un código de caracteres de 6 bits en un paquete de 8 bits con bits de inicio y parada. Las líneas se transmitían a 120 bits/s para igualar la velocidad máxima de 15 caracteres por segundo del mecanismo Selectric. Se utilizaron códigos de cambio de color (shift-in y shift-out) para mover la cinta de verde a negro y viceversa. Estos códigos también eran detectados por el sistema de comunicaciones y cambiaban las luces del panel frontal para indicar si la computadora o el usuario tenían el control del terminal en ese momento. [ 29 ]
Idioma
JOSS hacía tanto hincapié en la facilidad de uso que "como JOSS" se convirtió en un descriptor de un nuevo usuario que interactuaba con un sistema de tiempo compartido. Los niños y otras personas decían que, a diferencia de una computadora "complicada", JOSS era "amigable" y "amable" como "una persona real con sentido del humor", con respuestas divertidas como Eh?. [ 30 ]
Modo directo e indirecto
JOSS introdujo la idea de un editor de línea de comandos único que funcionaba tanto como lenguaje interactivo como editor de programas. Los comandos que se escribían sin número de línea se ejecutaban inmediatamente, en lo que JOSS denominaba " modo directo ". Si la misma línea iba precedida de un número de línea, se copiaba en el área de almacenamiento del código del programa, lo que JOSS llamaba "modo indirecto". Se añadían nuevas líneas al programa si el número de línea era único, se reemplazaban las líneas existentes con el mismo número o se eliminaban del programa si se escribía un número de línea existente sin código posterior. [ 31 ]
A diferencia de la mayoría de los BASIC, JOSS guardaba toda la entrada del usuario en archivos, no solo el código del programa. Al cargarse, JOSS básicamente volvía a escribir las líneas. Esto significaba que los archivos de programa podían contener tanto sentencias de programa como instrucciones en modo directo. Por ejemplo, era común ver programas que listaban las líneas de sentencia y luego tenían el archivo finalizado con Go.para ejecutar el programa inmediatamente después de completar la carga. Había algunas características que solo podían usarse en modo directo, como Lety Form, que se ingresaban sin números de línea pero que aun así se devolvían cuando se cargaba el programa. [ 32 ]
En un espacio de trabajo se podían combinar libremente instrucciones directas e indirectas. Esto permitía insertar comentarios en el código fuente añadiendo líneas en modo directo que comenzaban con *, [ 33 ] o colocando una al final de una línea de código y añadiendo un comentario después. Las líneas en blanco también se ignoraban, lo que permitía dividir el programa para mayor claridad. [ 34 ]
Declaraciones del programa
Cada línea de un programa JOSS debe comenzar con un número de línea. Los números de línea son números de punto fijo que constan de dos enteros de dos dígitos separados por un punto. Al igual que en BASIC, los números de línea se utilizan tanto como etiquetas para identificar las instrucciones `from` Toy Do`from`, como para facilitar la edición. Al introducir una línea de código con un nuevo número, esta se inserta en el programa, mientras que al introducir una con un número de línea existente, se reemplaza la versión anterior o se elimina si está vacía.
La parte del número de línea a la izquierda del punto se denomina página o parte , mientras que la parte a la derecha se denomina línea . Por lo tanto, el número de línea 10.12se refiere a la página 10, línea 12. Las ramificaciones pueden apuntar a una página o a una línea dentro de una página. Cuando se utiliza este último formato, la página y la línea combinadas se denominan paso .
Las páginas se utilizan para definir subrutinas , que regresan cuando la siguiente línea está en una página diferente. Por ejemplo, si una subrutina para calcular la raíz cuadrada de un número está en la página 3, se podrían tener tres líneas de código 3.1, 3.2 y 3.3, y se llamaría usando Do part 3.El código regresaría a la instrucción después del Do cuando llegue a la siguiente línea en una página diferente, por ejemplo, 4.1. No existe necesidad del equivalente de un RETURNal final, aunque si se requiere un retorno anticipado, Donelo logra.
Cada línea debe comenzar con una palabra clave de comando seguida del número de línea. No existe el concepto de comando predeterminado , como en BASIC con su LETinstrucción opcional. Se pueden colocar varias instrucciones en una misma línea, separadas por dos puntos o punto y coma. Cada línea debe terminar con un punto.
Bucles y condiciones
JOSS utiliza una notación de sufijo para indicar la evaluación condicional, "haz esto si esto es verdadero", a diferencia de la mayoría de los lenguajes que colocan la condición al principio en notación de prefijo, "si esto es verdadero, haz esto". A diferencia de FORTRAN o FOCAL , cualquier instrucción puede evaluarse condicionalmente de esta manera. Por ejemplo, para imprimir una cadena solo si se cumple una condición, se puede combinar el if con un Type:
1.1 Escribe "Hola, Mundo!" si X=5.
JOSS admitía seis comparaciones infijas, =, ≠, ≥, ≤, >, <, y operadores booleanos or, and, y not. [ 35 ]
Los bucles se manejaban de forma similar, utilizando el Forcomando y un formato algo oscuro para especificar los límites del bucle y el valor del paso, start(step)end. Por ejemplo, para ir de 1 a 10 de 2 en 2, el formato es 1(2)10. Al igual que If, Forse podía aplicar a cualquier otra instrucción:
1.2 Escribe "Hola, Wikipedia!" para i=1(2)10.
Tenga en cuenta que el bucle `for` se aplica solo a una única instrucción; si se desea ejecutar varias instrucciones en un bucle, estas se separarían en otra parte y se llamarían usando `do`:
1.3 Realice la parte 5 para i=1(1)100. 5.1 Escribe "Hola, Wikipedia!". 5.2 Escribe "Esto es JOSS."
Al igual que en BASIC, cualquiera de las entradas del bucle for puede ser una constante, una variable u otra expresión.
Como este tipo de rangos se podían aplicar a cualquier línea de código, era posible definir límites y bucles al ejecutar el programa. Por ejemplo, consideremos el siguiente programa:
1.1 Tipo X.
Normalmente, si uno invoca esto de una manera similar a la de BASIC RUN:
Haz la parte 1.
Produciría:
0
Sin embargo, este comportamiento puede modificarse añadiendo una estructura de bucle a la invocación:
Realiza la parte 1 para X = 1(1)5.
Lo cual produciría:
1 2 3 4 5
Esto permite construir fórmulas en los programas sin necesidad de utilizar bucles. Si se desea, el usuario puede implementar los bucles al iniciar el programa.
Expresiones y proposiciones
Una característica única de JOSS era su manejo de expresiones lógicas. La mayoría de los lenguajes de programación ofrecen alguna forma de formar una expresión matemática de varias partes, por ejemplo, Set x=(1+2)·3.que asigna el valor 9 a la variable x. JOSS amplió este concepto definiendo claramente el concepto de "proposición", una expresión que devuelve un valor lógico, verdadero o falso, en lugar de uno numérico. Se veían principalmente en Ifsentencias, como en los ejemplos anteriores, pero el valor booleano también podía almacenarse directamente en una variable, [ 36 ] o se podía convertir verdadero a 1 y falso a 0 usando la función tv( valor de verdad ). [ 37 ]
Además de las proposiciones, JOSS también contaba con el concepto de "expresiones condicionales". Estas consistían en cadenas de proposiciones junto con el código que se ejecutaría si dicha proposición fuera verdadera. Esto permitía escribir árboles de decisión de varios pasos en una sola línea. Cumplen una función similar a la del operador ternario que se encuentra en lenguajes modernos como C o Java , donde se utilizan para devolver un valor a partir de una estructura compacta que implementa if-then-else . La versión de JOSS admite cualquier número de condicionales, no solo tres, por lo que se asemeja más a una sentencia switch compacta que a una sentencia if-then compacta. [ 38 ]
Este ejemplo recrea la función de la sgnfunción: [ 39 ]
Sea s(x)=[x=0:0; x>0:1; x<0:-1].
Esto define una función "s" que toma un único parámetro, "x", y realiza tres pruebas consecutivas sobre él. La prueba que tenga éxito primero devuelve el valor correspondiente después de los dos puntos. [ 40 ]
Rangos
Otra característica avanzada de JOSS era que incluía el concepto de rango como un tipo integrado que podía almacenarse y manipularse. Los rangos se encuentran normalmente como entradas de los bucles for , donde forman parte de la sintaxis del propio bucle. Por ejemplo, en BASIC se escribe un bucle for utilizando esta sintaxis básica:
PARA I = 1 A 5 PASO 2Esto realizará un bucle que asignará a I los valores 1, 3, 5 y luego saldrá.
JOSS utilizaba un formato algo oscuro para definir los límites del bucle. El código equivalente en JOSS sería:
I=1(2)5
Tenga en cuenta que este código no incluye un bucle for. Esto se debe a que en JOSS, los rangos son elementos de primera clase del lenguaje, no algo que forme parte de un bucle como en BASIC. Los rangos se pueden definir y usar en muchos contextos fuera de los bucles. Por ejemplo, aquí hay una expresión condicional que evalúa el factorial de un parámetro x: [ 38 ]
Sea f(x)=[x=0:1 ; fp(x)=0:prod(i=1(1)x:i)].
En este ejemplo, hay dos proposiciones principales, separadas por punto y coma. La primera, a la izquierda, establece que si el parámetro x es 0, la condición debe devolver inmediatamente 1. Si esa proposición falla, pasa a la segunda prueba, a la derecha. Esta comprueba si la parte fraccionaria de x es cero (es decir, es un entero) y, de ser así, llama a la prodfunción para multiplicar un rango de valores. El prodparámetro 's' también es una proposición, pero en este caso, la prueba se reemplaza por un iterador de bucle que va de 1 a x con incrementos de 1. Si esa proposición es verdadera, lo cual ocurre para todos los valores del bucle, devuelve el índice i. Esto hace que se envíe una serie de valores prodde 1 a x. [ 38 ]
La combinación de estas características permite escribir funciones complejas con tan solo unos pocos comandos. Este tipo de funcionalidad solo se ha popularizado en lenguajes mucho más modernos, que suelen utilizar iteradores o la función map para obtener los mismos resultados. La capacidad de JOSS para combinar decisiones y bucles de forma compacta es desconocida en otros lenguajes de la época, incluyendo derivados como FOCAL.
Comandos
Colocar
El Setcomando asigna los resultados de una expresión a la variable especificada. Equivalente a BASIC LET.
01.30 Establecer p=3.14156. 01.60 Establecer i=l*(r/100)*t.
SetEra opcional cuando se usaba en modo directo, donde se podía escribir x=5.sin el comando Set. Esto no estaba permitido en modo indirecto, a diferencia de BASIC. [ 41 ]
Dejar
Letse utilizó para definir funciones definidas por el usuario. [ 42 ] Equivalente a BASIC DEF FN. [ 33 ]
Sea t(x)=sin(x)/cos(x). Establecer j=t(1.1). Tipo j.
LetTambién se puede utilizar para establecer el valor de una variable mediante una fórmula que consta de una constante:
Sea x=5.
A partir de ese punto, se puede usar de forma idéntica a uno creado con Set. Sin embargo, existe una sutil diferencia: cuando se hace referencia a esta X en el código, el valor se calcula evaluando el lado derecho. A Setse evalúa solo una vez, por lo que es mucho más rápido. [ 43 ]
El sistema generalmente sugería usarlos Letsolo en modo directo, guardándolos para su uso en un programa insertándolos al principio o al final del archivo. Esto evitaba que Letse llamaran varias veces durante la ejecución, ya que solo se llamarían una vez durante el proceso de carga. [ 44 ]
Demanda
Toma Demanduna lista de variables y almacena la entrada del usuario en variables. El ascalificador opcional agregó un mensaje personalizado. Equivalente a BASIC INPUT.
01.01 Escriba "¿Cuál es su edad?". 01.02 Demanda A. 01.03 Escriba "Usted es", A. 01.04 Demanda H como "¿Cuál es tu altura?". 01.05 Tipo H,"? ¿Tan alto?".
Tipo
El Typecomando genera uno o más elementos separados por comas. En su forma básica, es equivalente al comando de BASIC PRINT. Sin embargo, Typeincluye varias formas opcionales que lo sobrecargan considerablemente, realizando diversas tareas de salida no relacionadas. [ 45 ]
Cuando se utiliza para imprimir valores, los parámetros pueden ser variables, cadenas literales entre comillas dobles y el _carácter especial que produce un salto de línea. [ 46 ]Type También admite salida formateada mediante cadenas de formato. Consulte la sección siguiente Formpara obtener más detalles. [ 45 ]
El tipo también se usa como equivalente a LISTla instrucción de BASIC, que escribe el programa. Por ejemplo, Type step 1.1.imprimirá una sola línea de código, mientras que Type part 1.imprimirá la parte completa e Type all.imprimirá el programa completo. [ 45 ]
Además, también se puede usar para imprimir listas de valores internos. Type all values.produce una lista de todas las variables y sus valores, mientras que Type size.imprime el tamaño del programa. Las palabras clave incluyen size, timey users. [ 45 ]
Página
Pageactiva un salto de página en los terminales JOSS especiales. [ 36 ] JOSS normalmente enviaría un salto de página cuando el terminal llegara a la línea 54 del papel, por lo que si uno quisiera asegurarse de que un bloque de datos no se dividiera por la mitad, podría: [ 47 ]
1.10 Página si $>44.
$es una pseudovariable que devuelve el número de línea actual. [ 47 ]
Línea
Lineactiva un salto de línea en los terminales JOSS especiales. [ 36 ]
A
El Tocomando salta la ejecución del programa al número de parte o paso especificado, usando To part 1.o To step 1.1.respectivamente. [ 48 ] Es el equivalente de BASIC GOTO. Contrasta con Go, un comando indirecto utilizado desde la línea de comandos que inicia programas, el equivalente de BASIC RUN.
01.01 Demanda A como "TIPO DE NÚMERO A". 01.05 Al paso 1.01. 01.10 A la parte 1.
Hacer
Does similar a To, pero se ramifica a una subrutina. Al igual que con To, puede Do parto Do step. Si se proporciona un paso, se ejecuta esa única línea y luego regresa a la instrucción después de Do. Si se proporciona una parte, la ejecución comienza en la primera línea del bloque y continúa hasta que se llega al final del bloque o Donese encuentra una instrucción.
01.15 Realice el paso 7.24. 01.16 Realiza la parte 8.
DoTenía una forma abreviada especial para buscar, de acuerdo con que era muy común en la mayoría de los programas. Esto usaba el timesmodificador en lugar de un normal for, en el caso de bucles simples. Por lo tanto, las siguientes líneas son equivalentes: [ 45 ]
Realiza la parte 1 para i=1(1)5. Haz la parte 1, 5 veces.
JOSS mantiene un puntero a la línea que se está ejecutando actualmente, que Docambiaría. Sin embargo, incluía un "do entre paréntesis" especial que podía usarse en modo directo para probar ciertas secciones del código sin cambiar el puntero principal. Por ejemplo, si el programa se detenía debido a un error y no estaba claro qué sección causaba el problema, se podría probar una subrutina en particular con: [ 49 ]
(Realice la parte 2.)
Hecho
El Donecomando regresa de una llamada a subrutina. Como las subrutinas regresan automáticamente cuando se llega al final de la parte, Donesolo es necesario para regresar anticipadamente y a menudo se usa con una condición. Equivalente a BASIC RETURN.
*Rutina para pedirle al usuario un valor positivo y repetir hasta obtener uno. 01.10 Demanda X como "Introduzca un valor positivo mayor que cero". 01.20 Hecho si X>0. 01.30 Al paso 1.1
Detener
El Stopcomando finaliza la ejecución del programa y devuelve el control al entorno de edición. Equivalente a ENDo de BASIC STOP, aunque el de BASIC STOPestá diseñado para permitir CONTretomar la ejecución en la misma ubicación, una característica que no tiene un equivalente directo en el sistema orientado al espacio de trabajo de JOSS.
01.10 Tipo X. 01.20 Parada.
Ir
Disponible solo en modo directo, Goes el equivalente a BASIC RUNy CONT, dependiendo de si un programa está detenido actualmente debido a un error o a Stopque se ha encontrado un comando. [ 50 ]
Cancelar
Otro comando exclusivo del modo directo Cancelse utiliza cuando el programa se ha detenido por un error y el usuario desea reiniciarlo, lo que se hace borrando el contador del programa . Un Goreanudaría la ejecución en la última ubicación, pero emitir un Cancelhace que Gocomience de nuevo desde el principio. [ 51 ] Si el punto de interrupción actual se debió a un paréntesis (Do.), se puede emitir una cancelación de paréntesis, (Cancel.), para detener solo esa subejecución y permitir Goque un continúe en la última línea sin paréntesis. [ 49 ]
Matemáticas
JOSS almacenaba todos los números como punto flotante en base 10. [ 52 ]
JOSS contenía seis operadores matemáticos: [ 52 ]
+para añadir-para resta·para la multiplicación (el punto medio , no el punto)/para división*para exponentes|...|para valor absoluto, con una expresión en el medio, reemplazando los puntos suspensivos.
Las expresiones matemáticas pueden usar () y [] indistintamente en pares coincidentes para establecer precedencia. Por ejemplo:
1.30 Conjunto A=|-10·[5+1]·(1+5)|.
Produciría 360. [ 35 ]
Funciones
El lenguaje contenía las siguientes funciones integradas:
Matemáticas
sin()- Seno de un ángulo dado en radianescos()- Cosenoarg()- Toma los valores X e Y de un punto y devuelve el ángulo entre ese punto y el eje x.log()- Registro naperianoexp()- Base natural para la fuerza del argumentosqrt()- Raíz cuadradasgn()- Signo del argumento, 0 devuelve 0, -ve valores -1, +ve +1ip()- Parte entera del argumento,ip(22026.4658)devuelve 22026fp()- Parte fraccionaria, devuelve 0,4658dp()- Parte digital, devuelve 2.20264658ep()- Parte exponencial, devuelve 4, la posición del decimal.
Booleano
tv()- Valor de verdad, devuelve 1 si la expresión es verdadera, 0 en caso contrario.
Funciones de bucle
JOSS también definió varias funciones que realizaban bucles internamente, para evitar que el programador tuviera que escribir un Forbucle para realizar tareas sencillas como sumar una serie de números. Los parámetros podían ser una lista de expresiones simples separadas por comas o una estructura de rango cuyo comando podía ser cualquier instrucción o llamada a función.
max()- Valor máximo de las expresiones proporcionadasmin()- Mínimosum()- Sumaprod()- Productofirst()- El primer elemento de la lista que coincide con una condición, devuelve ese resultado.
Gestión de archivos
El sistema JOSS utilizaba un disco duro para almacenar programas de usuario en un espacio asignado. Dentro de ese espacio había varios archivos a los que se hacía referencia mediante un nombre de archivo compuesto por un número entero y un nombre de cinco letras entre paréntesis, por ejemplo, 123 (hello). La parte entera es el equivalente a un directorio, y el nombre es el subarchivo dentro de él, mantenido por el propio JOSS. [ 53 ]
Los archivos se escriben File all as item filename.y cargan con Recall item filename.. También se puede leer o guardar solo ciertas partes del espacio de trabajo, por ejemplo, File part 1 as item filename.para guardar una sola rutina en un archivo. [ 54 ] Además, se puede establecer un archivo predeterminado al que se asumen todas las referencias con . Use item filename.Los archivos se pueden eliminar con Discard. [ 54 ]
Programa de ejemplo
1.1 Demanda p,q. 1.2 Detenerse si q<0 o r(q,2)=0. 1.3 Establecer a=1. 1.4 Realiza la parte 2 mientras q>1 y a≠0. 1.5 Escriba a en el formulario 3. 1.6 Detenerse. 2.1 Realiza la parte 20. 2.1 Realice la parte 11 si p<0. 2.2 Realice la parte 12 si p≥q. 2.3 Realice la parte 13 si p=0. 2.4 Hecho si a=0. 2.5 Establecer p=p/4 mientras r(p,4)=0. 2.6 Realice la parte 14 si r(p,2)=0. 2.7 Realiza la parte 20. 2.8 Establezca a=-a si r(p,4)=r(q,4)=3. 2.9 Establezca s=p, p=q, q=s. 2.95 Haz la parte 20. 11.1 Establezca a=-a si r(q,4)=3. 11.2 Establecer p=|p|. 11.3 Realiza la parte 20. 12.1 Establezca p=r(p,q). 12.2 Realiza la parte 20. 13.1 Establezca a=0, p=1, q=1. 14.1 Establezca a=-a si r(q,8)=3 o r(q,8)=5. 14.2 Establezca p=p/2. 20.1 Escriba p, q en la forma 1 si a=1. 20.2 Escriba p, q en la forma 2 si a=-1. Formulario 1: " L(%.0f,%.0f) =" Formulario 2: " -L(%.0f,%.0f) =" Formulario 3: " %.0f\n"
Tenga en cuenta que esta no es una muestra original, sino una obtenida de un simulador moderno. Existen algunas diferencias sintácticas con respecto al lenguaje JOSS original.
Notas
Referencias
Citas
- 1 2 3 4 Bryan 1966 , pág. 2.
- 1 2 3 Marcas 1971 , pág. 1.
- ↑ Norberg, Arthur (10 de julio de 1989). "Una entrevista con Keith Uncapher" (PDF) (Entrevista). pág. 7.
- ↑ Ware 2008 , pág. 62.
- ↑ Marcas 1971 , pág. iii.
- ↑ Shaw 1965 , pág. 3.
- 1 2 Marks 1971 , pág. 2.
- ↑ Smith, JW (agosto de 1967). JOSS: Rutinas de procesamiento central (guía de referencia del usuario). RAND. RM 5270 PR . Recuperado el 16 de abril de 2012 .
- ↑ Shaw 1965 , pág. 14.
- 1 2 Marks 1971 , pág. 3.
- 1 2 3 Marcas 1971 , pág. 9.
- ↑ Marcas 1971 , pág. 4.
- ↑ "JOHNNIAC" . Museo de Historia de la Computación .
- ↑ Ware 2008 , pág. 15, 109.
- ↑ Marcas 1971 , pág. 5.
- 1 2 3 4 Bryan 1966 , pág. 3.
- ↑ Marcas 1971 , pág. 32.
- ↑ Marcas 1971 , pág. 10.
- ↑ Marcas 1971 , pág. 15.
- ↑ Marcas 1971 , pág. 14.
- ↑ Bryan 1966 , pág. 12.
- ↑ Marcas 1971 , pág. 47.
- ↑ Ware 2008 , pág. 65.
- ↑ Ware 2008 , pág. 16.
- ↑ Bryan 1966 , pág. 4.
- 1 2 Bryan 1966 , pág. 5.
- ↑ Marcas 1971 , pág. 26.
- ↑ Marks 1971 , págs. 32–33.
- ↑ Bryan 1966 , pág. 6.
- ↑ Marks 1971 , págs. 35–36, 43.
- ↑ Gimble 1967 , p. v.
- ↑ Gimble 1967 , pág. vi.
- 1 2 Gimble 1967 , pág. 65.
- ↑ Marcas 1971 , pág. 42.
- 1 2 Gimble 1967 , pág. 70.
- 1 2 3 Gimble 1967 , pág. 77.
- ↑ Gimble 1967 , pág. 24, 69.
- 1 2 3 Gimble 1967 , pág. 75.
- ↑ Marcas 1971 , pág. 41.
- ↑ Gimble 1967 , pág. 25.
- ↑ Gimble 1967 , pág. 68.
- ↑ Gimble 1967 , págs. 74-75.
- ↑ Gimble 1967 , pág. 45.
- ↑ Gimble 1967 , pág. 63.
- 1 2 3 4 5 Gimble 1967 , pág. 66.
- ↑ Gimble 1967 , pág. 7.
- 1 2 Gimble 1967 , pág. 49.
- ↑ Gimble 1967 , pág. 67.
- 1 2 Gimble 1967 , pág. 58.
- ↑ Gimble 1967 , pág. 57.
- ↑ Gimble 1967 , pág. 53.
- 1 2 Gimble 1967 , pág. 69.
- ↑ Gimble 1967 , pág. 59.
- 1 2 Gimble 1967 , pág. 61.
Fuentes
- Gimble, EP (mayo de 1967). JOSS: Resolución de problemas para ingenieros (PDF) (Informe técnico). Rand.
- Bryan, GE (4 de noviembre de 1966). JOSS: Introducción a la implementación del sistema . Laboratorio de radiación Lawrence, Berkeley, California: DECUS. pág. 19. Recuperado el 19 de junio de 2019 .
- Marks, Shirley (diciembre de 1971). Los años de JOSS: reflexiones sobre un experimento (PDF) (Informe técnico). Rand . Recuperado el 19 de junio de 2019 .
- Sammet, Jean (1969). Lenguajes de programación : historia y fundamentos . Prentice-Hall . págs. 217–226 . ISBN 0-13-729988-5.
- Shaw, JC (mayo de 1965). JOSS: Experiencia con un servicio informático experimental para usuarios en consolas de máquinas de escribir remotas (PDF) (Informe técnico). Rand.
- Ware, Willis, ed. (2008). RAND y la evolución de la información (PDF) . Rand. ISBN 9780833048165.
Lecturas adicionales
- "Manual de referencia para usuarios de JOSS", RL Clark, Informe R-1555/9, RAND Corp (enero de 1975)
- Entrevista de historia oral con Keith W. Uncapher , del Instituto Charles Babbage de la Universidad de Minnesota. Repaso de los proyectos de la Corporación RAND desde que Keith Uncapher fue contratado en 1950 hasta principios de la década de 1970, como JOHNNIAC , JOSS, una red nacional de supervivencia y algunos trabajos relacionados con ARPANET .
Enlaces externos
- JOSS: Un sistema informático en línea (VPRI-0270) , una película que muestra JOSS, realizada por RAND en marzo de 1964 cuando todavía funcionaba en el JOHNNIAC.
- Familia de lenguajes de programación JOSS
- Lenguajes de programación creados en 1963