Hiperconversación
HyperTalk es un lenguaje de programación procedimental de alto nivel discontinuado creado en 1987 por Dan Winkler y utilizado junto con el programa hipermedia HyperCard de Apple Computer por Bill Atkinson. Debido a que el público objetivo principal de HyperTalk eran los programadores principiantes, a los programadores de HyperTalk generalmente se les llamaba "autores" y el proceso de escribir programas se conocía como "scripting". Los scripts de HyperTalk se parecían al inglés escrito y usaban una estructura lógica similar a la del lenguaje de programación Pascal.
HyperTalk admitía las estructuras de control básicas de los lenguajes de procedimiento: repetir para/mientras/hasta, si/entonces/si no, así como la función y el mensaje "controlador" llamadas (un controlador de funciones era una subrutina y un controlador de mensajes un procedimiento). Por lo general, el programador no necesitaba especificar los tipos de datos; la conversión ocurrió de forma transparente en segundo plano entre cadenas y números. No había clases ni estructuras de datos en el sentido tradicional; en su lugar había cadenas literales especiales, o "listas" de "artículos" delimitado por comas (en versiones posteriores, la propiedad "itemDelimiter" permitía elegir un carácter arbitrario). La ejecución del código generalmente comenzaba como una respuesta a un evento, como un clic del mouse en un widget de la interfaz de usuario.
A fines de la década de 1980, Apple consideró utilizar el lenguaje de secuencias de comandos HyperTalk de HyperCard como lenguaje estándar en toda la empresa y dentro de su sistema operativo Mac OS clásico, así como para la comunicación entre procesos entre productos de Apple y de otros fabricantes. La empresa no se opuso al desarrollo de imitaciones como SuperCard, pero creó el Comité de Normas de HyperTalk para evitar la incompatibilidad entre variantes lingüísticas. El lenguaje que no distingue entre mayúsculas y minúsculas se interpretó inicialmente, pero obtuvo una compilación justo a tiempo con HyperCard 2.0.
Descripción
Operaciones fundamentales
Para la mayoría de las operaciones básicas, incluidos los cálculos matemáticos, HyperTalk favoreció la ordenación de predicados en lenguaje natural sobre la ordenación utilizada en la notación matemática. Por ejemplo, en el comando de asignación put
de HyperTalk, la variable se colocó al final de la declaración:
# 5 * 4 en Resultado
mientras que en el lenguaje de programación BASIC más tradicional (y en la mayoría de los demás), se lograría lo mismo escribiendo:
Resultado = 5 * 4
El código de HyperTalk tiene el efecto secundario de crear la variable theResult sobre la marcha. Los scripts podían asignar cualquier tipo o valor a una variable mediante el comando put
, lo que hacía que HyperTalk muy estuviera tipificado débilmente. Las conversiones entre tipos de variables eran invisibles y automáticas: la cadena "3" podría multiplicarse por el número 5 para producir el número 15, o el número 5 concatenado en la cadena "3" para producir la cadena "35". HyperTalk no se quejaría a menos que los tipos no pudieran convertirse automáticamente.
El control de flujo y la lógica eran generalmente similares a otros lenguajes comunes, usando una estructura if... then... else... end if
para condicionales y bucles de apoyo basados en un flexible >repetir... fin de repetir
sintaxis. Los comentarios estaban precedidos por dos signos menos: -- this is a comment
.
Objetos, contenedores y scripts
El principal concepto de interfaz de usuario de HyperCard era la tarjeta, un sistema de visualización que emulaba una ficha. Las tarjetas se usaban normalmente para almacenar información, de forma similar a un registro en una base de datos de archivo plano convencional. El diseño gráfico de la tarjeta se creó con el mouse colocando varios elementos en la tarjeta, como campos de texto y botones. Un diseño maestro "tarjeta" conocido como el fondo se mostraba detrás de las áreas transparentes de cada tarjeta. Los objetos colocados en el fondo, como campos y botones, se compartirían como un diseño común entre varias tarjetas, pero con contenido específico de la tarjeta. La colección de tarjetas, fondos y los datos asociados almacenados en ellos se almacenaron en un solo archivo conocido como pila (de tarjetas). En conjunto, todos estos objetos que contienen datos se denominan contenedores.
Las funciones de HyperTalk, o scripts, normalmente se almacenaban dentro de la propiedad script
disponible en muchos de los contenedores de la pila. Los scripts podrían acceder a las propiedades de un contenedor, correspondientes a las variables de instancia, usando las instrucciones get
y set
. La propiedad del script contenía texto sin formato y no tenía propiedades especiales; los scripts pueden colocarse y ejecutarse desde cualquier contenedor de texto, incluidas las variables de cadena, o importarse desde otras pilas mediante el comando empezar a usar
. Un script podría incluso ser texto proporcionado por el usuario escrito en un campo de texto en pantalla. El texto arbitrario podría ejecutarse usando el comando do
, de manera similar a Dynamic SQL.
Refiriéndose a los contenedores
Un concepto clave en HyperTalk era la forma en que se refería a los contenedores a través de un sistema de navegación basado en la jerarquía visual de la pila. A cada contenedor de la pila se le dio un número de identificación único cuando se creó y también se le podía dar un nombre opcional. Los scripts pueden hacer referencia a objetos mediante el uso de cualquiera de estos identificadores, junto con un tipo de objeto especificado mediante el operador of
. Este operador utilizaba una sintaxis de lenguaje natural que creaba un código autodocumentado fácil de leer. Por ejemplo, una secuencia de comandos almacenada en un botón de una tarjeta podría desear tomar el texto proporcionado por el usuario recopilado mediante un campo de texto y almacenar el texto en una variable llamada theValue:
# el valor de tarjeta sobre el terreno "tipo aquí" en el Valor
El intérprete podría inferir varios aspectos contextuales de las declaraciones. En la declaración anterior, por ejemplo, debido a que la secuencia de comandos se ejecutaría en el contexto de un botón en una tarjeta específica, se entendió que el identificador tarjeta se refería a la tarjeta con la que el usuario estaba interactuando, aunque el botón en sí normalmente estaría en el fondo. Además, "el valor" (el texto enviado por el usuario) se supuso que era la propiedad principal y el objetivo de las operaciones si no se especificaba lo contrario. Del mismo modo, "campo de tarjeta" se suponía que era el objetivo del comando, a diferencia del campo de fondo, por lo que también se podía omitir la información. Incluso los tipos de contenedores tenían formas cortas que los programadores podían usar para ahorrar tipeo. Por lo tanto, el código anterior es equivalente a la forma más corta:
# fld "tipo aquí" en el Valor
Los objetos dentro de un contexto determinado (la tarjeta o el fondo, por ejemplo) también recibieron un número de tiempo de ejecución basado en su orden z en la pantalla. Para ayudar a usar su posición para la navegación, HyperTalk también incluyó una variedad de sistemas de referencia ordinales y cardinales para simplificar aún más la sintaxis. Suponiendo que el campo "escriba aquí" es el único campo en la tarjeta, el código anterior también podría escribirse:
# el primero tarjeta sobre el terreno en el Valor
o:
# tarjeta sobre el terreno 1 en el Valor
La elección del estilo de direccionamiento se dejó al programador; a menudo se usaban diferentes estilos en diferentes declaraciones para hacer que el código fuera más legible.
HyperTalk incluía el contenedor me
que actuaba de la misma manera que el calificador self
que se encuentra en la mayoría de los lenguajes orientados a objetos, lo que permite un acceso simple al objeto contenedor actual. Menos común era la variable it
, que contenía el valor de la última operación para ciertos operadores integrados. Por ejemplo:
Pregunta "¿Cuál es el valor?" # es en tarjeta sobre el terreno "display"
usa el comando ask
para mostrar un cuadro de diálogo y capturar el texto escrito en un campo de texto adjunto; cuando el cuadro de diálogo se completa presionando Return o haciendo clic en OK, el valor se asigna al it
pseudo-variable. Este código luego copia ese valor en un campo de tarjeta usando el operador de asignación put
.
Colecciones
Los contenedores de un tipo dado también estaban disponibles como colecciones con una versión pluralizada de ese tipo de contenedor como su nombre: la colección de los campos en una tarjeta era campos de tarjeta
. Estas colecciones eran en sí mismas contenedores con sus propias propiedades. La clave entre ellas fue la propiedad number
, que se usó ampliamente durante las iteraciones y tareas similares. Por ejemplo, si uno quisiera ocultar todos los campos en una tarjeta, esto podría lograrse con este código:
repetición con i = 1 a el Número de tarjeta campos escondido sobre el terreno i final repetición
Este código expone otra característica común de HyperTalk: que una propiedad puede tener varios nombres y operadores. En este caso, el comando hide
y el show
asociado actúan estableciendo el valor de la propiedad visible
del contenedor. Por lo tanto, hide field i
es exactamente equivalente a establecer el visible de campo i a falso . Un ejemplo similar fue el comando
bloquear pantalla
que detuvo la actualización visual, que era una forma abreviada de establecer la pantalla de bloqueo to true
, donde lockscreen
es una propiedad de HyperCard, también un contenedor. Se encontraron muchos ejemplos de este tipo de azúcar sintáctico en HyperTalk, para simplificar la sintaxis y mejorar la legibilidad del código común.
En HyperCard 2.2 y versiones posteriores, la colección de colecciones también estaba disponible como partes
de un contenedor. Esto permitió que un script abordara todos los objetos en un contenedor con un solo iterador.
Manejo de texto
Una característica notable del modelo de contenedor de HyperTalk fue su manejo de texto. Cada colección de texto, ya sea una cadena literal en un programa o texto escrito en un campo de texto, se consideraba un contenedor con múltiples colecciones de contenedores dentro. Esto permitió que los scripts analizaran el texto usando los mismos comandos de navegación que cualquier otro contenedor. Por ejemplo, al analizar un archivo de datos delimitado por espacios, es posible que desee extraer la tercera columna, así:
# el tercero palabra de theFilesText en col Tres.
Esta sintaxis permitía que la secuencia de comandos "caminara" hacia abajo del texto para encontrar datos particulares, como en este ejemplo:
# el primero carácter de el tercero palabra de línea 5 de tarjeta sobre el terreno "algunas palabras" en el Char
Este proceso de tratar el texto como un contenedor se conocía como "fragmentación", y las funciones como "expresiones de fragmentos". Estos mismos tipos de expresiones se usaron para manejar la manipulación de archivos, junto con un conjunto de funciones de administración de archivos. El siguiente código abre un archivo conocido, lo lee, extrae datos y luego cierra el archivo:
on ratón Abajo respuesta archivo "Por favor, seleccione un archivo de texto para abrir." si es es vacío entonces Salida ratón Abajo # es en archivo Camino si allí es a archivo archivo Camino entonces abierto archivo archivo Camino leído desde archivo archivo Camino hasta retorno # es en cd fld "un campo" cerca archivo archivo Camino set el textoEstilo de carácter 1 a 10 de tarjeta sobre el terreno "un campo" a negrita final si final ratón Abajo
HyperTalk también incluía funciones para fragmentar cadenas usando una operación de búsqueda de subcadenas usando el operador in
. El siguiente código encuentra todos los ejemplos de un patrón dado usando in
como parte del bucle repeat
, mientras que offset
encuentra la ubicación de ese patrón dentro la cuerda:
función replaceStr patrón,nuevo Str,inStr repetición mientras patrón está dentro inStr # offset()patrón,inStr) en pos # nuevo Str en carácter pos a ()pos +el longitud de patrón)-1 de inStr final repetición retorno inStr final replaceStr
Listas y otras colecciones
HyperTalk utilizó el mismo sistema de fragmentación para producir estructuras como matrices o listas. Dicha estructura se crearía colocando varios elementos de datos en una variable, separados por comas. Se pueden importar varios tipos de datos a un script de HyperTalk utilizando cadenas que se analizarán según sea necesario. Por ejemplo, la posición de los objetos en la pantalla se definía mediante un par de números que representaban las coordenadas X e Y relativas a la esquina superior izquierda. El siguiente código crea una variable llamada pos que contiene un par de coordenadas y luego lo manipula para volver a colocar todos los botones en una tarjeta en diagonal desde la parte superior izquierda a la parte inferior derecha:
on mouseUp # "100,100" en pos repetición con x = 1 a el Número de tarjeta botones set el ubicación de tarjeta botón x a pos añadir 15 a Tema 1 de pos final repetición final mouseUp
La expresión de fragmentación item
se basaba originalmente en un delimitador de coma, pero las versiones posteriores de HyperCard cambiaron esto al valor de itemDelimiter
, ofreciendo la capacidad de analizar listas arbitrarias y estructuras
Mensajes y eventos
HyperTalk usó un concepto orientado a objetos para invocar secuencias de comandos, con objetos en la pila que enviaban "eventos" como mensajes que serían procesados por controladores que declararon su interés en recibir los eventos utilizando la sintaxis on
. Por ejemplo, la mayoría de los contenedores de GUI enviarían el mensaje mouseDown
cuando se hiciera clic en el botón del mouse, y luego un mensaje mouseUp
cuando se soltara mientras aún estaba en la parte superior de ese contenedor, y un script podría capturar estos eventos así:
on mouseUp - colocar código adicional aquí final mouseUp
Los mensajes para eventos se enviaban primero al script en el objeto que creó el evento, por ejemplo, si el usuario hacía clic en un botón, el mensaje mouseUp
se enviaba primero a ese botón. Si el objeto de secuencia de comandos del botón no tenía un controlador mouseUp
(o no tenía ninguna secuencia de comandos), se pasaba a la tarjeta, el fondo, la pila, cualquier pila cuyas secuencias de comandos se hubieran importado explícitamente usando el comando empezar a usar
, la "pila de inicio" (una pila de HyperCard siempre abierta seleccionada por el usuario), y finalmente a la propia aplicación HyperCard.
Para muchos eventos simples, como hacer clic con el mouse en los botones, la secuencia de comandos se colocaría directamente dentro del objeto en cuestión, el botón en sí. Por ejemplo, uno podría usar el código de ejemplo anterior dentro de un controlador de botón de esta manera:
on mouseUp repetición con i = 1 a el Número de tarjeta campos escondido sobre el terreno i final repetición final mouseUp
En el caso de que el código se llamara desde varias ubicaciones o se utilizara como un controlador global para un evento, la secuencia de comandos podría determinar el remitente original del evento mediante la función target
. Del mismo modo, los scripts podrían enviar eventos a otros contenedores usando el comando send
y luego usando el código de navegación para referirse al contenedor que contiene el código del controlador:
Enviar "MouseUp" a tarjeta botón "OK" de tarjeta "Veracidad"
La combinación del procesamiento de cadenas de HyperTalk con el comando do
permitió la construcción de intérpretes interactivos colocando un campo de texto en una tarjeta y luego colocando este código en el script del campo.:
on mouseUp seleccionar el clickLine # palabra 2 de el clickLine en linenum do línea linenum de cd fld 1 final mouseUp
clickLine
es una propiedad global que devuelve el nombre y el número de línea del último campo en el que se hizo clic, en una forma como línea 10 de tarjeta campo 4
. Este código primero selecciona todo el texto en la línea en la que se hizo clic, luego extrae el número de línea en una variable local y luego usa do
para ejecutar el texto como un script de HyperCard.
El mensaje mouseDown
se envió a un botón cuando el usuario hizo clic en él, y mouseUp
se envió cuando el usuario soltó el mouse dentro de él para activar su acción. De manera similar, HyperCard enviaba mensajes periódicos idle
, mouseEnter
, mouseLeave
,... y varios otros mensajes relacionados con la navegación entre diferentes tarjetas en una pila de HyperCard, así como la entrada del usuario (keyDown
, functionKey
,...) y eventos del sistema. En lo que respecta a los scripters, no hubo bucles de eventos principales como en otros lenguajes de programación de procedimientos.
Control de HyperCard
A diferencia de las plataformas generales de desarrollo rápido de aplicaciones, las pilas de HyperCard siempre se veían como pilas: la barra de menú era de HyperCard y no del programador (de forma predeterminada, las secuencias de comandos podían agregar, eliminar y modificar menús), la única La ventana tenía un tamaño fijo (en versiones anteriores) y, en ciertos casos, los comandos que eran fundamentales para la operación eran parte de la aplicación en sí y no estaban disponibles directamente en HyperTalk.
Un buen ejemplo de esto fue la creación de nuevas tarjetas, que formaban parte de la aplicación, no accesibles directamente desde el propio lenguaje HyperTalk. Solo se puede crear una nueva tarjeta usando el elemento de menú Nueva tarjeta, que se puede simular en código usando doMenu "Nueva tarjeta"
. Mientras que HyperTalk llamó a los comandos de menú, los comandos de menú también invocaron controladores en HyperTalk. Para ejecutar código personalizado cuando se seleccionó el elemento del menú Copiar, se colocaría una secuencia de comandos en la pila utilizando el controlador on doMenu itemName
y luego examinaría itemName
para ver si era "Copiar".
HyperTalk también proporcionó control de secuencias de comandos sobre las herramientas de dibujo integradas, simplemente escribiendo los cambios necesarios en las herramientas de pintura y simulando los movimientos del mouse usando el arrastrar desde inicio hasta final
y los comandos click at position
.
Semántica indulgente
Una distinción única entre el lenguaje de programación HyperTalk de HyperCard y lenguajes aparentemente similares como AppleScript era que los scripts de HyperTalk eran más indulgentes con respecto a las entradas que aceptaban.
Aparte de la declaración implícita anterior de variables cuando se les asignó un valor, y la forma en que los valores se convirtieron implícitamente entre tipos (permitiéndole, por ejemplo, solicitar carácter 2 de 1234
), HyperCard también reconocer ciertas expresiones y extraer subvalores de ellas.
Por ejemplo:
# el seleccionada de tarjeta sobre el terreno "Listbox" en laSelección -- da la línea 2 a 3 del campo de la tarjeta "Listbox"seleccionar línea 1 de tarjeta sobre el terreno "Listbox"seleccionar línea ()palabra 2 de laSelección) de tarjeta sobre el terreno "Listbox"seleccionar ()el seleccionada de tarjeta sobre el terreno "Listbox") -- paréntesis agregadas para fines ilustrativos únicamente
o
Jugar harpsichord c e gJugar harpsichord "c e g"# "c e g" en la melodíaJugar harpsichord la melodía
Si bien el resultado final se sintió similar a los scripters como la expansión de variables de un script Bash antes del análisis, esta era una sintaxis de caso especial y no tenía las trampas en las que los datos se evaluarían como código. Entonces, por ejemplo, todos los siguientes son errores de sintaxis en la melodía, no llamadas a funciones:
Jugar harpsichord "c e g()"# "c e() g" en la melodíaJugar harpsichord la melodía
Ampliación de HyperTalk
Aunque el lenguaje HyperTalk languideció al igual que HyperCard, recibió una segunda oportunidad de vida a través de su protocolo de complemento, los llamados Comandos externos (XCMD) y Funciones externas (XFCN), que eran contenedores de código nativo adjuntos a pilas (como recursos específicos de Macintosh) con un único punto de entrada y valor de retorno. Los XCMD y los XFCN se podían llamar como controladores de funciones y mensajes normales desde los scripts de HyperTalk, y también podían enviar mensajes a la aplicación HyperCard. Algunos autores emprendedores de XCMD agregaron características avanzadas como soporte a todo color (ColorizeHC, HyperTint, AddColor), múltiples ventanas especiales (Prompt, Tabloid, Textoid, Listoid, ShowDialog, MegaWindows), soporte para arrastrar y soltar y varias interfaces de hardware para el lenguaje.
Descendientes de HyperTalk
Varios lenguajes de secuencias de comandos han implementado un superconjunto de HyperTalk (conocidos colectivamente como xTalk):
- CompileIt!-Talk – A Hyper Apilación de tarjetas y XCMD de Tom Pittman que permitieron compilar código de máquina nativo 68000 (por ejemplo para XCMDs y XFCNs) de código HyperTalk, y llamar a las rutinas de la caja de herramientas Macintosh nativa. Compilación Fue arrancado, es decir, versiones posteriores fueron compiladas usando versiones anteriores de sí mismo.
- Double-XX-Talk – Double-XX fue un clon HyperCard ligero que envió como adición a CompileIt! y permitió ejecutar XCMDs y XFCNs sin HyperCard, e incluso incluyó un pequeño intérprete de HyperTalk.
- MediaTalk – El lenguaje de Oracle Media Objects, un descendiente de Plus, y el primer clon de HyperCard multiplataforma. Además, el único que era verdaderamente modular.
- PlusTalk – El lenguaje de Plus, de Spinnaker Software (desarrollado originalmente por Format Verlag), que se utilizó como base para Oracle Media Objects.
- SenseTalk – El lenguaje de la HyperSense de origen NeXT y la herramienta de pruebas VNC Eggplant.
- SuperTalk – El lenguaje de SuperCard, el primer clon HyperCard, de Bill Appleton. Appleton también escribió el popular kit de construcción de aventuras World Builder.
- Transcripción (antes revTalk y MetaTalk) – El lenguaje implementado en la plataforma de software y desarrollo LiveCode (antes Revolución y MetaCard). MetaCard fue un clon de HyperCard de origen Unix que corrió en Classic Mac OS, Mac OS X, Windows, Linux y Solaris.
- XION - Originalmente el lenguaje de un clon HyperCard de código abierto que nunca se materializó. Ahora implementado como OpenXION.
Estos clones y dialectos (comúnmente denominados bajo el apodo de xTalk-languages) agregaron varias características al lenguaje que se esperan de un lenguaje de programación moderno, como manejo de excepciones, propiedades de objetos definidas por el usuario, temporizadores, subprocesamiento múltiple y incluso objetos definidos por el usuario.
También hay lenguajes cuya sintaxis y estructura muestran influencias de HyperTalk, como:
- ActionScript – El lenguaje de scripting para Adobe Flash.
- AppleScript – El lenguaje principal de scripting del sistema operativo Mac clásico de Apple, y todavía soportado en macOS.
- Lingo – El lenguaje de programación de Macromedia Director comenzó con una sintaxis similar a xTalk, aunque versiones posteriores fueron en una dirección que parecía JavaScript.
- JavaScript – Un lenguaje de scripting creado por Brendan Eich que se implementa comúnmente como parte de un navegador web para crear interfaces de usuario mejoradas y sitios web dinámicos. Posteriormente se generalizó y estandarizó como ECMAScript.
Muchos nombres de métodos popularizados por primera vez por HyperTalk llegaron a lenguajes posteriores, como el controlador de eventos onmouseup
en JavaScript. Aunque Asymetrix ToolBook a menudo también se considera un clon de HyperCard, su lenguaje de secuencias de comandos aparentemente se parece poco a HyperTalk.
Contenido relacionado
Ashton Tate
IBM 632
Singular (software)