Articulo de referencia

SAIL (lenguaje de programación)

Robert Sproull"},"developer":{"wt":"[[Stanford University]]"},"released":{"wt":"{{Start date and age|1969}}"},"latest release version":{"wt":""},"latest release date":{"wt":""},...

SAIL , el lenguaje de inteligencia artificial de Stanford , fue desarrollado por Dan Swinehart y Bob Sproull del Laboratorio de IA de Stanford . Originalmente era un lenguaje extenso similar a ALGOL 60 para las computadoras PDP-10 y DECSYSTEM-20 . El lenguaje combinaba el compilador GOGOL , un lenguaje anterior para PDP-6 /-10 (esencialmente una versión de ALGOL que solo manejaba enteros ), con la memoria asociativa del lenguaje LEAP . Su primera versión se lanzó en noviembre de 1969 y continuó desarrollándose durante la década de 1980, incluyendo una versión comercial, MAINSAIL .

La principal característica de SAIL es un sistema de datos simbólicos basado en un almacén asociativo derivado de LEAP, desarrollado por Jerry Feldman y Paul Rovner. Los elementos pueden almacenarse como conjuntos no ordenados o como asociaciones (triples). Otras características incluyen procesos, variables de procedimiento, eventos e interrupciones, contextos, retroceso y recolección de basura de registros . También cuenta con macros estructuradas en bloques, una funcionalidad de corrutinas y nuevos tipos de datos destinados a la construcción de árboles de búsqueda y listas de asociaciones.

Historia

El compilador GOGOL fue escrito originalmente por Bill McKeeman en el PDP-1 . Era esencialmente una versión de ALGOL-60 que solo manejaba enteros , con varias adiciones para proporcionar acceso directo a la memoria y otros componentes de hardware, lo que permitía su uso como lenguaje de programación de sistemas . Redujo los arreglos a una sola dimensión, eliminó la capacidad de realizar asignaciones dinámicas de memoria, pero añadió algunas funcionalidades adicionales para cadenas de caracteres. Una versión muy actualizada, GOGOL II, escrita por John Sauter, se desarrolló como parte de una adaptación del sistema operativo subyacente de ODIN a THOR. Cuando el Laboratorio de IA de Stanford recibió su PDP-6 , Sauter, Pettit y (principalmente) Dan Swinehart escribieron GOGOL III para la nueva máquina. [ 1 ]

Swinehart, junto con Robert Sproull, fusionó la sintaxis de GOGOL con añadidos de las versiones contemporáneas del lenguaje LEAP para producir la primera versión de SAIL en noviembre de 1969. La característica principal de LEAP como lenguaje era su uso de almacenamiento asociativo, más conocido hoy en día como mapa o diccionario. En LEAP, se podía establecer el valor de un campo en un tipo mediante una tripleta, donde la primera entrada era el nombre de la variable, la segunda el nombre del campo y la tercera el valor. [ 2 ]

Russell Taylor, Jim Low y Hana Samet añadieron mejoras adicionales, como procesos, variables de procedimiento, interrupciones, contexto, procedimientos coincidentes, un nuevo sistema de macros y otras características. Posteriormente, el desarrollo pasó a manos de Taylor, John Reiser y Robert Smith, quienes añadieron un depurador , una instrucción de impresión a nivel de sistema, registros y realizaron la conversión del SUAI de Standard a TENEX . Más tarde , también se adaptó al TOPS-10 de DEC, mientras que la versión original de TENEX funcionó sin modificaciones en TOPS-20 . [ 2 ]

Descripción

Estructura básica y enunciados

Al igual que muchos sistemas ALGOL, y el posterior Pascal , la estructura básica de SAIL se basa en el bloque , que se denota por el código entre las palabras clave BEGINy END. Dentro de un bloque hay más estructura, con las declaraciones de variables locales en la parte superior, si las hay, y el código, o sentencias , a continuación. A diferencia de la mayoría de los dialectos, SAIL permitía colocar una cadena después de BEGIN, como BEGIN "program", y luego terminar el bloque con END "program". El compilador usaría estos, si se ingresaban, para verificar el corcheteado correcto. [ 3 ] SAIL no incluía el equivalente de un PROGRAMbloque como en Pascal, ni un maincomo en C, la ejecución comenzaba con la primera línea de código en el bloque más externo. [ 4 ]

Las declaraciones estándar incluían IF...THEN...ELSE, [ 5 ]FOR...STEP...UNTIL...DO , [ 6 ]WHILE...DO para bucles probados en la parte superior, WHILE...UNTILpara bucles probados en la parte inferior, y GOTOque utilizaban una etiqueta. [ 7 ] Era CASEsimilar a switchen C, pero normalmente utilizaba una sintaxis algo diferente, como CASE i OF ("Zero","One","Two");, que devuelve la cadena apropiada según el valor de i. [ 5 ] Si se querían probar valores explícitos en el CASE, los valores debían estar entre corchetes:

CASO I DE INICIO [ 0 ] 10 ; [ 4 ] 25 ; [ 6 ][ 7 ] 50 FIN ;

Este código ignorará valores como del 1 al 3 y solo devolverá un valor para los valores indicados. Tenga en cuenta que el último elemento no puede ir seguido de un punto y coma. [ 8 ]

DONESalía de un bloque, normalmente utilizado en bucles, y CONTINUEvolvía al principio del bloque. Un bucle infinito se implementaba normalmente con WHILE TRUE DO.... [ 9 ]

Declaraciones de procedimiento

Los procedimientos se implementaron de forma similar al lenguaje de programación C , con el tipo de retorno, si lo hubiera, delante del nombre, por ejemplo, . Nótese el uso poco común del punto y coma aquí, mientras que Pascal lo seguiría inmediatamente con un bloque, normalmente un . [ 10 ]STRINGPROCEDUREtoUpper(STRINGoriginalStr);BEGIN...BEGIN

Para mejorar el rendimiento, SAIL añadió dos calificadores de procedimiento, SIMPLEy RECURSIVE. RECURSIVEle indicaba al compilador que el procedimiento podría llamarse a sí mismo, y por lo tanto sus variables locales debían escribirse en la pila, no solo la información de retorno de la subrutina. SIMPLEhacía lo contrario, exigiendo que el procedimiento no tuviera ninguna variable local, no permitiendo GOTOsalir de la función y no podía referirse a las variables del procedimiento contenedor. Estas directivas podían evitar el requisito de completar un registro de activación completo , mejorando así el rendimiento. [ 11 ] Esto también tuvo el efecto secundario de significar que las variables declaradas dentro de un procedimiento que no estaba marcado RECURSIVEno se restablecerían entre llamadas, [ 11 ]static actuando de manera similar a . de C.

SAIL también incluía el FORWARDcalificador, utilizado para insertar declaraciones anticipadas , normalmente cuando dos procedimientos se llaman entre sí. [ 10 ]RETURN funcionaba como en C, saliendo del procedimiento y volviendo al llamador, además de devolver opcionalmente un valor si el procedimiento utilizaba uno. [ 12 ] Los parámetros pasados ​​a los procedimientos podían ser por VALUEo REFERENCE, este último permitiendo que se devolvieran valores. [ 13 ]

Tipos de datos y operadores básicos

Los tipos de variables básicos en SAIL son enteros , reales (punto flotante), booleanos y cadenas . [ 14 ] Las conversiones de tipo eran automáticas, por lo que convertiría el valor 5 a un double, ya que eso es lo que requiere SQRT, y luego convertiría el resultado a un entero. [ 3 ] Cualquiera de estos tipos puede convertirse en una matriz agregando el calificador y colocando los límites de la matriz entre corchetes, por ejemplo, . SAIL admitía matrices de 1 y 2 dimensiones. [ 15 ]INTEGERi;iSQRT(5);ARRAYREALARRAYweeks[1:52]);

El lenguaje utilizaba la flecha izquierda para la asignación, o el guion bajo en plataformas que no tenían Stanford ASCII . [ 16 ] Incluía varias funciones estándar como la raíz cuadrada , todos los operadores matemáticos comunes y, por lo demás, era similar a la mayoría de los derivados de ALGOL para la programación normal. [ 17 ]

Las cadenas se manipulaban usando segmentación de matrices , aStr[i TO j]devolviendo la subcadena con caracteres de i a j, o aStr[i FOR j]que devolvía la subcadena que comenzaba en i y continuaba para j caracteres. [ 18 ] La INFpalabra clave (inity) representaba el final de la cadena, por lo que se podía aStr[i TO INF]devolver todo desde i en adelante. [ 3 ] Las funciones y operadores de cadena incluían EQUpara probar si dos cadenas eran iguales, [ 5 ] el ampersand para concatenación, LENGTHy LOPque elimina el primer carácter de la cadena. [ 18 ] No había forma de comparar cadenas aparte de EQU, los operadores como <estaban definidos solo para números. [ 4 ]

Registros y punteros

El concepto de registros como tipo de datos se había introducido recientemente cuando se estaba escribiendo SAIL. Esta característica muestra, por lo tanto, signos de haber sido "añadida" a la sintaxis del lenguaje. Por ejemplo, una estructura de registro se definía mediante la RECORD!CLASSinstrucción: . Esta instrucción funcionaba de manera similar a la instrucción en Pascal, definiendo la plantilla para el registro. Para crear un registro, se utilizaba la instrucción, que devolvía un . Los punteros tenían un tipo y podían tener más de un tipo; por ejemplo, define rp, un puntero a un registro de persona o universidad. [ 19 ] Los punteros también podían declararse para apuntar a . [ 20 ] El acceso a los datos en un registro era igualmente idiosincrásico; para imprimir el archivo de nombres de una persona, por ejemplo, la sintaxis era . [ 20 ]RECORD!CLASSperson(STRINGname,address;INTEGERaccountnum;REALbalance)RECORDNEW!RECORDRECORD!POINTERRECORDPOINTER(person,university)rp;ANY!CLASSPRINT(person:name[rp]);

Escáner de cadenas

Además de la funcionalidad básica de cadenas, SAIL incluía un sistema de escaneo de cadenas como parte del lenguaje básico. SCANtrabajaba con variables de cadena, mientras que el otro, similar en lo demás, INPUTse utilizaba para escanear cadenas que se leían desde un archivo. Ambos utilizaban un sistema conocido como "tabla de saltos", que consistía en un conjunto de caracteres que representaban lugares donde detener la lectura; por ejemplo, saltos de línea, varios espacios en blanco y signos de puntuación. Estas tablas se almacenaban en estructuras especiales, y el sistema solo permitía 54 de ellas, un número que no se explica en la documentación. [ 21 ]

Para construir una nueva tabla, primero se llamó a una función GETBREAKque devolvía el siguiente espacio libre en la tabla, o "número de tabla". A esto le seguía una función SETBREAKque tomaba el número de tabla, una cadena con los caracteres de salto, otra cadena de "caracteres omitidos" que simplemente se ignoraban durante la lectura (como si no estuvieran en la cadena) y finalmente los "modos", indicadores que señalaban cómo debía funcionar el sistema. Una vez configurado, el programa podía llamar repetidamente SCANa o INPUTy recibir cadenas completas. [ 22 ] Esto incluía un parámetro de referencia, normalmente brkchar, que contenía el carácter que causaba el salto, lo que permitía comprobar, por ejemplo, los caracteres de fin de archivo. El sistema es conceptualmente similar a strtokla funcionalidad de C, que forma parte de stdlib [ 23 ] a diferencia de SAIL, donde forma parte del propio lenguaje.

Entrada/Salida

El sistema de entrada/salida de SAIL se basaba en la idea de "canales" numerados, de forma similar a las entradas del escáner. Para abrir un archivo, primero se llamaba a la función GETCHANpara devolver el valor de un canal libre y luego OPENse le añadían varios parámetros para describir el archivo y los modos de operación. RELEASEera equivalente a cerrar. Una vez abierto, el archivo podía leerse, sujeto a las reglas de escaneo mencionadas anteriormente, llamando a la función INPUTy buscando el final del archivo. Los archivos no tenían nombres como parte de la función OPEN; en su lugar, LOOKUPse podía usar para apuntar un canal a un archivo determinado, ENTERcrear un nuevo archivo asociado a un canal y RENAMEpermitir cambiar el nombre de un archivo existente. [ 24 ] Se puede abrir un archivo existente para escritura usando GETCHAN... OPEN... LOOKUP... ENTER. [ 25 ]

Durante la E/S se utilizaban numerosos manejadores y variables especiales. Por ejemplo, la INCHWLfunción era una ENTRADA cableada al terminal de usuario y siempre abierta, y devolvía su carácter de interrupción en la variable del sistema !SKIP!. [ 26 ] La PRINTfunción normalmente enviaba la salida al mismo canal del terminal, pero también podía dirigirse a cualquier otro canal abierto. [ 27 ]

Directivas del compilador

Como lenguaje de programación de sistemas, el rendimiento era importante y, para ayudar con esto, SAIL incluyó una DEFINEfunción que utilizaba la sustitución de cadenas de forma similar a #definelas macros de C. [ 28 ] Una diferencia era que los delimitadores alrededor de la sustitución debían definirse, por ejemplo REQUIRE "[][]" DELIMITERS;DEFINE maxSize=[100];, . Un uso común de estas macros era definir constantes de caracteres como CRLF, ya que estas no formaban parte del lenguaje básico. [ 28 ] Otro uso era redefinir la COMMENTinstrucción a la más corta !. [ 29 ]

El sistema también incluía un sistema de compilación condicional que utilizaba sentencias, a diferencia de las directivas del preprocesador que se encuentran en C. IFCRcompilaría los bloques entre los correspondientes THENCy ELSECo ENDC. La condición en el IFCR debe conocerse en tiempo de compilación, por lo que, como en C, normalmente era un DEFINEvalor d. [ 30 ]

Datos LEAP

La principal diferencia entre SAIL y otros lenguajes derivados de ALGOL radicaba en la inclusión del almacén asociativo del lenguaje LEAP. Este sistema permitía colocar datos en estructuras similares a registros y, posteriormente, guardarlos, recuperarlos y buscarlos. En este sentido, era similar a las funcionalidades de manejo de datos de COBOL . La base del almacén era la asociación o tripleta , que permitía asociar un valor de datos con una ranura con nombre en un registro. Por ejemplo, se podía crear un registro del tipo Family_Membercon Name"Tom" y establecer el Fathercampo en "Harry". Esto resultaba en una tripleta de la forma (Padre, Tom, Harry). Las bibliotecas asociadas podían entonces encontrar todos los Family_Memberregistros con "Harry" como la ranura Father, devolviendo posiblemente "Tom" y "Alice". [ 31 ]

Ejemplo

El siguiente código, que se encuentra en el Tutorial, convierte una cadena de entrada a mayúsculas. [ 10 ]

PROCEDIMIENTO DE CADENA superior(CADENA cadena sin procesar); COMIENZA "superior" CADENA tmp; CARACTER ENTERO; tmp←NULL; MIENTRAS LONGITUD(rawstring) HACER COMENZAR char←LOP(rawstring); COMENTARIO LOP devuelve el primer carácter y mueve el puntero más allá de él. tmp←tmp&(SI "a" LEQ char LEQ "z" ENTONCES char-'40 SINO char); FIN; DEVOLVER(tmp); FIN "superior"; 

Usos

En SAIL se codificaron varios sistemas de software interesantes, incluyendo algunas versiones tempranas de FTP y TeX , un sistema de formato de documentos llamado PUB, [ 32 ] y BRIGHT, un proyecto de base de datos clínica patrocinado por los Institutos Nacionales de Salud . [ 33 ] [ 34 ] [ 35 ] [ 36 ] [ 37 ] [ 38 ] [ 39 ] [ 40 ] [ 41 ]

En 1978, existían media docena de sistemas operativos diferentes para el PDP-10: ITS (MIT), WAITS (Stanford), TOPS-10 (DEC), CMU TOPS-10 (Carnegie Mellon), TENEX ( BBN ), Tymcom-X (Tymshare) y TOPS-20 (DEC, basado en TENEX).

SAIL se adaptó de WAITS a ITS para que los investigadores del MIT pudieran utilizar el software desarrollado en la Universidad de Stanford . Cada adaptación generalmente requería la reescritura del código de E/S en cada aplicación. [ 42 ]

A finales de la década de 1970 se desarrolló una versión de SAIL independiente de la máquina, llamada MAINSAIL, que se utilizó para desarrollar muchas herramientas de diseño eCAD durante la década de 1980. MAINSAIL era fácilmente portable a nuevos procesadores y sistemas operativos, y todavía se utilizaba de forma limitada en 2005..

Véase también

Referencias

  1. Slimick 1971 , pág. 22.
  2. 1 2 Reiser 1976 , pág. iii.
  3. 1 2 3 Smith 1976 , pág. 13.
  4. 1 2 Smith 1976 , pág. 48.
  5. 1 2 3 Smith 1976 , pág. 11.
  6. Smith 1976 , pág. 15.
  7. Smith 1976 , pág. 17.
  8. Smith 1976 , pág. 19.
  9. Smith 1976 , pág. 18.
  10. 1 2 3 Smith 1976 , pág. 21.
  11. 1 2 Smith 1976 , pág. 22.
  12. Smith 1976 , pág. 23.
  13. Smith 1976 , pág. 24.
  14. Smith 1976 , pág. 2.
  15. Smith 1976 , pág. 4.
  16. Smith 1976 , pág. 5.
  17. Smith 1976 , pág. 6.
  18. 1 2 Smith 1976 , pág. 12.
  19. Smith 1976 , pág. 40.
  20. 1 2 Smith 1976 , pág. 41.
  21. Smith 1976 , pág. 27.
  22. Smith 1976 , pág. 28.
  23. "Funciones strtok() y strtok_r() en C con ejemplos" . 24 de diciembre de 2016.
  24. Smith 1976 , pág. 32.
  25. Smith 1976 , pág. 33.
  26. Smith 1976 , pág. 30.
  27. Smith 1976 , págs. 2, 38.
  28. 1 2 Smith 1976 , pág. 25.
  29. Smith 1976 , pág. 26.
  30. Smith 1976 , pág. 44.
  31. Reiser 1976 , pág. 83.
  32. "Manual de PUB" . Nomodes.com . Archivado del original el 5 de febrero de 2005. Consultado el 30 de diciembre de 2017 .
  33. Rodbard, D.; Cole, BR; Munson, PJ (1983). "Desarrollo de un paquete estadístico interactivo, autodidáctico y fácil de usar para el análisis de datos de investigación clínica: BRIGHT STAT-PACK" . Proc Annu Symp Comput Appl Med Care . 8 (3): 701– 704. doi : 10.1007/BF02224505 . PMC 2578281. PMID 6384409 .  
  34. Stetten, DeWitt (10 de mayo de 2014). NIH: Un relato de la investigación en sus laboratorios y clínicas . Academic Press. ISBN 9781483277554 vía Google Libros.
  35. "STANFORD UNIVERSITY MEDICAL EXPERIMENTAL COMPUTER RESOURCE : RR - 00785 : ANNUAL REPORT - YEAR 05" . Profiles.nlm.nih.gov . Archivado del original el 16 de agosto de 2016 . Consultado el 30 de diciembre de 2017 .  
  36. "Informe anual : Institutos Nacionales de Salud. División de Investigación y Tecnología Informática" . Archive.org . Bethesda, Maryland. 1985. Consultado el 30 de diciembre de 2017 . 
  37. Zhulin, Denis Larionov y Alexander. "Lea el libro electrónico Informe anual : Institutos Nacionales de Salud. División de Investigación y Tecnología Informática (Volumen 1981-83) de los Institutos Nacionales de Salud (EE. UU.). División de en línea de forma gratuita (página 4 de 56)" . Ebooksread.com . Recuperado el 30 de diciembre de 2017 . 
  38. "PROYECTO PUFF/VM : Sección 4.1.6" . Profiles.nlm.nih.gov . Archivado del original el 12 de octubre de 2008. Consultado el 30 de diciembre de 2017 . 
  39. "Sección 9.2.6 : Proyecto PUFF/WI" . Profiles.nlm.nih.gov . Archivado del original el 16 de agosto de 2016. Consultado el 30 de diciembre de 2017 . 
  40. "Sección 4.1.7 : Proyecto PUFF/VM" . Profiles.nlm.nih.gov . Archivado del original el 16 de agosto de 2016. Consultado el 30 de diciembre de 2017 . 
  41. "STANFORD UNIVERSITY MEDICAL EXPERIMENTAL COMPUTER RESOURCE : RR - 00785 : ANNUAL REPORT -YEAR 05" (PDF) . Profiles.nlm.nih.gov . Archivado del original (PDF) el 5 de noviembre de 2004 . Consultado el 30 de diciembre de 2017 .  
  42. Este artículo se basa en material tomado de Stanford+Artificial+Intelligence+Language en el Free On-line Dictionary of Computing antes del 1 de noviembre de 2008 e incorporado bajo los términos de "relicencia" de la GFDL , versión 1.3 o posterior.

Bibliografía

  • Reiser, John (agosto de 1976). SAIL (PDF) (Informe técnico). Laboratorio de Inteligencia Artificial de Stanford.
  • Smith, Nancy (octubre de 1976). Tutorial de SAIL (PDF) (Informe técnico). Laboratorio de Inteligencia Artificial de Stanford.
  • Slimick, John (octubre de 1971). "Lenguajes de implementación de sistemas actuales: la perspectiva de un usuario" (PDF) . ACM SIGPLAN Notices . 6 (9): 20– 28. doi : 10.1145/942596.807056 .

Lecturas adicionales

  • Beebe, Nelson HF (2005). "Actas de la Conferencia Práctica TEX 2005: El diseño de TEX y METAFONT: Una retrospectiva" (PDF) . TUGboat . 26 (1). Salt Lake City, Utah, EE. UU.: Universidad de Utah , Departamento de Matemáticas: 39–40 . Recuperado el 7 de marzo de 2017. El operador de guion bajo en las asignaciones del código fuente de SAIL se imprimía como una flecha izquierda en la variante Stanford de ASCII, pero los sitios PDP-10 en otros lugares simplemente lo veían como un guion bajo simple. Sin embargo, su uso como operador de asignación significaba que no podía usarse como una letra extendida para hacer que los nombres compuestos fueran más legibles, como ahora es común en muchos otros lenguajes de programación. La flecha izquierda en la variante Stanford de ASCII no era el único carácter inusual.
  • Documentación para MAINSAIL.
  • Un tutorial de SAIL a partir de las cintas de la biblioteca DECUS PDP-10.
  • Memorando del Laboratorio de Inteligencia Artificial de Stanford AIM-289/SAILON 57.4: Manual SAIL, agosto de 1976