Speakeasy era un entorno interactivo de computación numérica que también presentaba un lenguaje de programación interpretado . Inicialmente fue desarrollado para uso interno en la División de Física del Laboratorio Nacional de Argonne por el físico teórico Stanley Cohen . [4] Finalmente fundó Speakeasy Computing Corporation para que el programa estuviera disponible comercialmente.
Desarrollador (es) | Speakeasy Computing Corporation |
---|---|
Lanzamiento estable | IV Iota / 2006 |
Escrito en | Mortran , FORTRAN , C [ cita requerida ] |
Sistema operativo | Windows , macOS , RedHat Linux , SUSE Linux , Mandrake Linux , Debian , Solaris , HP-UX [1] |
Tipo | Computación técnica |
Licencia | Software de prueba |
Paradigma | imperativo |
---|---|
Diseñada por | Stanley Cohen |
Desarrollador | Speakeasy Computing Corporation |
Apareció por primera vez | 1964 |
Disciplina de mecanografía | dinámica |
Influenciado por | |
APL [2] | |
Influenciado | |
MATLAB [3] |
Speakeasy es un paquete numérico de larga duración. De hecho, la versión original del entorno se construyó alrededor de un repositorio de datos dinámicos central llamado "Almacenamiento con nombre" desarrollado a principios de la década de 1960, [5] [6] mientras que la versión más reciente se lanzó en 2006.
Speakeasy tenía como objetivo facilitar el trabajo computacional de los físicos del Laboratorio Nacional de Argonne. [7] Inicialmente se concibió para trabajar en mainframes (el único tipo de computadoras en ese momento), y posteriormente fue portado a nuevas plataformas ( minicomputadoras , computadoras personales ) a medida que estuvieron disponibles. La portabilidad del mismo código en diferentes plataformas se hizo más fácil mediante el uso de macros de metalenguaje de Mortran para enfrentar las dependencias de los sistemas y las deficiencias y diferencias de los compiladores. [8] Speakeasy está disponible actualmente en varias plataformas: PC con Windows , macOS , Linux , equipos departamentales y estaciones de trabajo que ejecutan varios tipos de Linux, AIX o Solaris .
Speakeasy también estuvo entre los primeros [ cita requerida ] entornos de computación numérica interactiva, habiendo sido implementado de tal manera en un sistema CDC 3600 , y más tarde en máquinas IBM TSO ya que uno estaba en pruebas beta en el Laboratorio Nacional Argonne en ese momento.
Casi desde el principio (cuando la funcionalidad de vinculación dinámica se hizo disponible en los sistemas operativos) Speakeasy presenta la capacidad de expandir su vocabulario operativo utilizando módulos separados, vinculados dinámicamente al procesador central a medida que se necesiten. Por esa razón, dichos módulos se denominaron "linkules" (LINKable-modULES). [9] Son funciones con una interfaz generalizada, que puede ser escrito en FORTRAN o en C . [ cita requerida ] La independencia de cada uno de los nuevos módulos de los demás y del procesador principal es de gran ayuda para mejorar el sistema, especialmente en los viejos tiempos.
Esta forma sencilla de ampliar las funcionalidades del procesador principal a menudo era aprovechada por los usuarios para desarrollar sus propios paquetes especializados. Además de los programas, funciones y subrutinas que el usuario puede escribir en el lenguaje interpretado del propio Speakeasy, los linkules añaden funcionalidades realizadas con las típicas actuaciones de los programas compilados.
Entre los paquetes desarrollados por los usuarios, uno de los más importantes es "Modeleasy", originalmente desarrollado como "FEDeasy" [10] a principios de la década de 1970 en el departamento de investigación de la Junta de Gobernadores de la Reserva Federal en Washington DC. Modeleasy implementa objetos y funciones especiales para la estimación y simulación de grandes modelos econométricos. Su evolución llevó finalmente a su distribución como producto independiente.
Sintaxis
El símbolo : _ (dos puntos + guión bajo) es tanto el logotipo de Speakeasy como el mensaje de la sesión interactiva.
El signo de dólar se utiliza para delimitar comentarios; el ampersand se usa para continuar una declaración en la siguiente línea física, en cuyo caso el indicador se convierte en : & (dos puntos + ampersand); un punto y coma puede separar declaraciones escritas en la misma línea física.
$ suponga que tiene una declaración muy larga, $ puede escribirlo en varias líneas físicas usando "&" $ al final de la línea para continuar:: _ the_return_value = this_is_a_function_with_many_arguments (argument_1, argument_2, &: & argumento_3, argumento_4, argumento_5, argumento_6)$ por otro lado, puede recopilar varios extractos breves $ en una sola línea física usando ";": _ a = 1; b = 2; c = 3; d = 4
Como su propio nombre indica, Speakeasy tenía como objetivo exponer una sintaxis lo más amigable posible para el usuario, y lo más cercana posible al lenguaje hablado. El mejor ejemplo de esto lo da el conjunto de comandos para leer / escribir datos desde / hacia el almacenamiento permanente. Por ejemplo (las palabras clave de los idiomas están en mayúsculas para aclarar el punto):
: _ OBTENGA my_data DE LA BIBLIOTECA my_project: _ MANTENGA my_data COMO un_nuevo_nombre_para_misdatos EN LA BIBLIOTECA otro_proyecto
Las variables (es decir, los objetos Speakeasy) reciben un nombre de hasta 255 caracteres, cuando la opción LONGNAME está activada, hasta 8 caracteres en caso contrario (para compatibilidad con versiones anteriores). Se escriben dinámicamente, según el valor que se les asigne.
: _ a = 1: _ lo que es unA es un ESCALAR REAL.: _ a = "ahora una matriz de caracteres": _ lo que es unA es una matriz de caracteres de 21 elementos.
Por lo general, no es necesario que los argumentos de funciones estén entre paréntesis o separados por comas, siempre que el contexto sea claro e inequívoco. Por ejemplo:
: _ sin (grid (-pi, pi, pi / 32)) $ sintaxis completamente especificada
puede ser escrito :
: _ sin grid (-pi, pi, pi / 32) $ el argumento de la función sin no está entre paréntesis
o incluso
: _ sin grid (-pi pi pi / 32) $ los argumentos de la función grid pueden estar separados por espacios
Son posibles muchas otras simplificaciones de sintaxis; por ejemplo, para definir un objeto llamado 'a' valorado en una matriz de diez elementos de ceros, se puede escribir cualquiera de las siguientes declaraciones:
: _ a = matriz (10: 0,0,0,0,0,0,0,0,0,0): _ a = 0,0,0,0,0,0,0,0,0,0: _ a = 0 0 0 0 0 0 0 0 0 0: _ a = pulgadas (10) * 0: _ a = 10:
Speakeasy es un lenguaje orientado a vectores : al dar un argumento estructurado a una función de un escalar, el resultado suele ser un objeto con la misma estructura del argumento, en el que cada elemento es el resultado de la función aplicada al elemento correspondiente del argumento. En el ejemplo anterior, el resultado de la función sin aplicada a la matriz (llamémosla x ) generada por la función grid es la respuesta de la matriz cuyo elemento respuesta (i) es igual a sin ( x (i)) para cada i de 1 a noels (x) (el número de elementos de x ). En otras palabras, la declaración
: _ a = sin (cuadrícula (-pi pi pi / 32))
es equivalente al siguiente fragmento de programa:
x = grid (-pi pi pi / 32) $ genera una matriz de números reales de -pi a pi, pasando por pi / 32para i = 1, noels (x) $ bucles en los elementos de x a (i) = sin (x (i)) $ evalúa el i-ésimo elemento de unsiguiente i $ incrementar el índice de bucle
Las declaraciones orientadas a vectores evitan escribir programas para tales bucles y son mucho más rápidas que ellos.
Objetos y área de trabajo
Con la primera declaración de la sesión, el usuario puede definir el tamaño del "almacenamiento con nombre" (o "área de trabajo" o "asignador"), que se asigna de una vez por todas al comienzo de la sesión. Dentro de esta área de trabajo de tamaño fijo, el procesador Speakeasy crea y destruye dinámicamente los objetos de trabajo según sea necesario. Se proporciona un mecanismo de recolección de basura ajustable por el usuario [11] para maximizar el tamaño del bloque libre en el área de trabajo, empacando los objetos definidos en el extremo inferior o superior del asignador. En cualquier momento, el usuario puede preguntar sobre el espacio usado o restante en el área de trabajo.
: _ TAMAÑO 100M $ primera declaración: el área de trabajo será de 100 MB: _ SIZE $ devuelve el tamaño del área de trabajo en la sesión actual: _ SPACELEFT $ devuelve la cantidad de espacio de almacenamiento de datos no utilizado actualmente: _ SPACENOW $ devuelve la cantidad de espacio de almacenamiento de datos utilizado actualmente: _ SPACEPEAK $ devuelve la cantidad máxima de espacio de almacenamiento de datos utilizado en la sesión actual
Orientación de objetos sin formato
Dentro de restricciones razonables de conformidad y compatibilidad, los objetos Speakeasy pueden operarse utilizando la misma sintaxis algebraica.
Desde este punto de vista, y considerando la naturaleza dinámica y estructurada de los datos contenidos en el "almacenamiento con nombre", es posible decir que Speakeasy desde el principio implementó una forma muy cruda de sobrecarga de operadores y un enfoque pragmático de algunas características. de lo que más tarde se denominó " Programación Orientada a Objetos ", aunque no evolucionó más en esa dirección.
$ El siguiente ejemplo muestra cómo un objeto Matrix-family y un objeto Array-family$ con la misma estructura y valores se operan de manera diferente aunque se usa el $ mismo operador "*" y "/": en el primer caso usando el álgebra matricial y en el $ segundo caso operando elemento por elemento. | |
: _ a = matriz (2,2: 1,2,3,4); a A (una matriz de 2 por 2 ) 1 2 3 4: _ a * a A * A ( Matriz de 2 por 2 ) 7 10 15 22: _ a / a A / A ( Matriz de 2 por 2 ) 1 0 0 1 | : _ aa = matriz (2,2: 1,2,3,4); Automóvil club británico AA (una matriz de 2 por 2 ) 1 2 3 4: _ aa * aa AA * AA (Una matriz de 2 por 2 ) 1 4 9 16: _ aa / aa AA / AA (una matriz de 2 por 2 ) 1 1 1 1 |
Las familias de objetos
Speakeasy proporciona un montón de "familias" predefinidas de objetos de datos: escalares, matrices (hasta 15 dimensiones), matrices, conjuntos, series de tiempo.
Los datos elementales pueden ser de tipo real (8 bytes), complejo (2x8 bytes), literal de carácter o literal de nombre (los elementos de las matrices pueden ser reales o complejos, los valores de series de tiempo solo pueden ser reales).
Valores faltantes
Para el procesamiento de series de tiempo , se proporcionan cinco tipos de valores perdidos . Se indican por NA (no disponible), NC (no computable), ND (no definido), junto con NB y NE, cuyo significado no está predeterminado y se deja disponible para el desarrollador de linkules. Están representados internamente por valores numéricos específicos (y muy pequeños), que actúan como códigos.
Todas las operaciones de series de tiempo se encargan de la presencia de valores perdidos, propagándolos adecuadamente en los resultados.
Dependiendo de una configuración específica, los valores perdidos se pueden representar con la notación anterior, con un símbolo de interrogación o con un espacio en blanco (útil en las tablas). Cuando se utiliza en la entrada, el signo de interrogación se interpreta como un valor perdido de NA.
: _ b = serie temporal (1, 2, 3, 4: 2010 1 4):_ B B (una serie temporal con 4 componentes) 1 2 3 4: _ b (2010 3) =? : _ showmval qmark:_ B B (una serie temporal con 4 componentes) 1 2? 4: _ 1 / b 1 / B (una serie temporal con 4 componentes) 15 ? .25: _ showmval explicar:_ B B (una serie temporal con 4 componentes) 1 2 NA 4: _ 1 / b 1 / B (una serie temporal con 4 componentes) 1 .5 NC .25
En los objetos numéricos que no son series de tiempo, el concepto de "valores perdidos" no tiene sentido, y las operaciones numéricas sobre ellos utilizan los valores numéricos reales independientemente de que correspondan a "códigos de valores perdidos" o no (aunque se pueden ingresar "códigos de valores perdidos" y mostrado como tal).
: _ 1+? 1+? = 1,00 : _ 1 /? 1 /? = 5.3033E36 : _ 1 *? 1 *? =?
Tenga en cuenta que, en otros contextos, un signo de interrogación puede tener un significado diferente: por ejemplo, cuando se usa como el primer (y posiblemente único) carácter de una línea de comando, significa la solicitud de mostrar más partes de un mensaje de error largo (que termina con un símbolo "+").
: _ a = matriz (10000,10000 :)ARRAY (10000,10000 :) En la línea "A = ARRAY (10000,10000 :)" Demasiados datos. +: _?El tamaño del asignador debe ser de al menos 859387 kilobytes. +: _?Utilice GRATIS para eliminar los datos que ya no necesitaouse CHECKPOINT para guardar el asignador para un reinicio posterior. +: _?Utilice NAMES para ver los nombres definidos actualmente.Utilice SIZE & RESTORE para reiniciar con un asignador más grande.: _?NO HAY MÁS INFORMACIÓN DISPONIBLE.
Valores lógicos
Se proporciona cierto soporte para valores lógicos, operadores relacionales ( se puede usar la sintaxis de Fortran ) y expresiones lógicas.
Los valores lógicos se almacenan en realidad como valores numéricos: 0 significa falso y distinto de cero (1 en la salida) significa verdadero.
: _ a = 1 2 3 4 5: _ b = 1 3 2 5 4: _ a> b A> B (una matriz de 5 componentes) 0 0 1 0 1: _ a <= b A <= B (Una matriz de 5 componentes) 1 1 0 1 0: _ a.eq.b A.EQ.B (una matriz de 5 componentes) 1 0 0 0 0: _ lógico (2) $ esto cambia la forma en que se muestran los valores lógicos: _ a> b; a <= b; a.eq.b A> B (una matriz de 5 componentes) FFTFT A <= B (Una matriz de 5 componentes) TTFTF A.EQ.B (una matriz de 5 componentes) TFFFF
Programación
Se pueden definir objetos especiales como los objetos "PROGRAMA", "SUBRUTINA" y "FUNCIÓN" (denominados colectivamente procedimientos ) para la automatización de operaciones. Otra forma de ejecutar varias instrucciones con un solo comando es almacenarlas en un archivo de uso y hacer que el procesador las lea mediante el comando USE.
Archivos de uso
"UTILIZAR" un archivo de uso es la forma más sencilla de realizar varias instrucciones con una entrada mínima. (Esta operación corresponde aproximadamente al "origen" de un archivo en otros lenguajes de secuencias de comandos).
Un archivo de uso es una fuente de entrada alternativa a la consola estándar y puede contener todos los comandos que un usuario puede ingresar mediante el teclado (por lo tanto, no se permite la construcción de control de flujo de múltiples líneas). El procesador lee y ejecuta los archivos de uso una línea a la vez.
La ejecución del archivo de uso se puede concatenar pero no anidar, es decir, el control no regresa al llamador cuando se completa el archivo de uso llamado.
Procedimientos
La capacidad de programación completa se logra mediante "procedimientos". En realidad son objetos de Speakeasy, que deben definirse en el área de trabajo a ejecutar. Hay una opción disponible para que los procedimientos se recuperen y carguen automáticamente desde el almacenamiento externo a medida que se necesiten.
Los procedimientos pueden contener cualquiera de las construcciones de control de flujo de ejecución disponibles en el lenguaje de programación Speakeasy.
Programas
Un programa se puede ejecutar simplemente invocando su nombre o usándolo como argumento del comando EXECUTE. En el último caso, un argumento adicional puede identificar una etiqueta desde la que comenzará la ejecución. Los programas Speakeasy se diferencian de los demás procedimientos por ser ejecutados en el mismo "nivel" de alcance al que están referenciados, por lo que tienen visibilidad completa de todos los objetos definidos en ese nivel, y todos los objetos creados durante su ejecución se dejarán allí para su posterior usos. Por esa razón, no se necesita una lista de argumentos.
Subrutinas y funciones
Las subrutinas y funciones se ejecutan en un nuevo nivel de alcance, que se elimina cuando finalizan. La comunicación con el nivel de alcance de la llamada se realiza a través de la lista de argumentos (en ambas direcciones). Esto implementa la ocultación de datos, es decir, los objetos creados dentro de una subrutina o una función no son visibles para otras subrutinas y funciones, sino a través de listas de argumentos.
Un nivel global está disponible para almacenar objetos que deben ser visibles desde dentro de cualquier procedimiento, por ejemplo, los procedimientos mismos.
Las Funciones se diferencian de las Subrutinas porque también devuelven un valor funcional; la referencia a ellos puede ser parte de una declaración más compleja y se reemplazan por el valor funcional devuelto al evaluar la declaración.
En cierta medida, las subrutinas y funciones de Speakeasy son muy similares a los procedimientos de Fortran del mismo nombre.
Control de flujo
Una construcción IF-THEN-ELSE está disponible para ejecución condicional y se proporcionan dos formas de construcción FOR-NEXT para bucle.
SI ( expresión-lógica ) ENTONCES bloque verdadero[DEMÁS falso bloque ]TERMINARA SI | FOR index = mínimo , máximo [, paso ] índice SIGUIENTE del bloque de bucle | FOR valor IN conjunto de valores bloque de bucle SIGUIENTE valor |
Se proporciona una instrucción "GO TO label " para saltar, mientras que una instrucción GO TO calculada similar a Fortran se puede utilizar para ramificaciones múltiples.
...IF ( expresión-lógica ) GO TO label...etiqueta :... | $ En la siguiente declaración $ selector debe ser> = 1 y <= NIR A label1 , label2 , ..., labelN : Selector ...label1 :...label2 :......labelN :... |
Un mecanismo ON ERROR, con varias opciones, proporciona un medio para el manejo de errores.
Escritura de Linkule
Los Linkules son funciones generalmente escritas en Fortran (o, sin soporte, en C). Con la ayuda de macros Mortran o C y una biblioteca API, pueden interactuar con el área de trabajo de Speakeasy para recuperar, definir y manipular cualquier objeto de Speakeasy.
La mayor parte del vocabulario operativo de Speakeasy se implementa a través de linkules. Pueden vincularse estáticamente al motor central o cargarse dinámicamente según sea necesario, siempre que estén correctamente compilados como objetos compartidos (unix) o dll (windows).
Notas
- ^ Plataformas compatibles
- ^ Rubinsteyn, Alex (2014). Compilación en tiempo de ejecución de programas Python orientados a matrices (PDF) (Ph.D.). Universidad de Nueva York.
APL inspiró directamente Speakeasy
- ^ "Una entrevista con CLEVE MOLER realizada por Thomas Haigh el 8 y 9 de marzo de 2004 en Santa Bárbara, California" (PDF) . Museo de Historia de la Computación . Consultado el 6 de diciembre de 2016 .
Entonces APL, Speakeasy, LINPACK, EISPACK y PL0 fueron los predecesores de MATLAB.
- ^ "Una introducción a Speakeasy - Informe informal
- ^ "Almacenamiento con nombre: un esquema de asignación de almacenamiento dinámico con rutinas de manipulación", Informe de investigación y desarrollo de AEC - Volumen 7021 ANL (Serie) - Stanley Cohen, División de Física, Comisión de Energía Atómica de Estados Unidos, Laboratorio Nacional Argonne, 1965.
- ^ "Speakeasy - Un sistema evolutivo", S. Cohen, Actas del simposio ACM SIGPLAN sobre lenguajes de muy alto nivel (marzo de 1974)
- ^ Cohen, Stanley (1971). "El sistema Delphi-speakeasy. I. Descripción general". Comunicaciones de Física Informática . 2 : 1–10. doi : 10.1016 / 0010-4655 (71) 90008-7 .
- ^ "Uso de Mortran para traducir programas de Fortran de una máquina a otra" Steven C. Pieper, Laboratorio Nacional Argonne , 1976
- ^ "Linkules Speakeasy - plug software compatible" ACM - Actas de la conferencia anual de 1977
- ^ "Modelos econométricos a través de SPEAKEASY / FEDEASY", James M. Condie, John W. Davison, 1975
- ^ El usuario puede decidir con qué frecuencia ocurren las recolecciones de basura, en términos de la cantidad de objetos creados entre dos de ellos. Esta función (comando SLOSH) está destinada a la depuración de linkules.
enlaces externos
- Sitio web oficial (a través de Wayback Machine )
- El Speakasy Computing Corporation 's canal en YouTube
- El sitio web de Econometric Modeling & Computing Corporation.
- Una interesante conversación con Stan Cohen.