HyperTalk es un alto nivel descontinuado, procedimiento lenguaje de programación creado en 1987 por Dan Winkler y se utiliza junto con Apple Computer 's Hypercard programa hipermedia por Bill Atkinson . Debido a que el público objetivo principal de HyperTalk eran los programadores principiantes, los programadores de HyperTalk generalmente se llamaban "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 .
Paradigma | procedimental , impulsado por eventos |
---|---|
Diseñada por | Dan Winkler |
Desarrollador | Apple Computer Inc. |
Apareció por primera vez | 1987 |
Influenciado por | |
Lenguaje natural , Pascal | |
Influenciado | |
ActionScript , AppleScript , ECMAScript , JavaScript , Lingo , LiveCode , SenseTalk , SuperTalk |
HyperTalk soportaba las estructuras de control básicas de los lenguajes procedimentales : repetir para / mientras / hasta, si / entonces / si no, así como llamadas de "manejador" de funciones y mensajes (un manejador de funciones era una subrutina y un manejador 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 literales de cadena especiales , o "listas" de "elementos" delimitados por comas (en versiones posteriores, la propiedad "itemDelimiter" permitía elegir un carácter arbitrario). La ejecución del código generalmente comenzó como una respuesta a un evento, como un clic del mouse en un widget de IU.
A finales de la década de 1980, Apple consideró [1] utilizar el lenguaje de scripting HyperTalk de HyperCard como lenguaje estándar en toda la empresa y dentro de su sistema operativo clásico Mac OS , así como para la comunicación entre procesos entre productos Apple y de otros fabricantes. La empresa no se opuso al desarrollo de imitaciones como SuperCard , pero creó el Comité de Estándares HyperTalk para evitar la incompatibilidad entre las variantes del idioma. [1] 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. [2]
Descripción
Operaciones fundamentales
Para la mayoría de las operaciones básicas, incluidos los cálculos matemáticos, HyperTalk favoreció el ordenamiento de predicados en lenguaje natural sobre el ordenamiento utilizado en la notación matemática. Por ejemplo, en el put
comando de asignación de HyperTalk , la variable se colocó al final de la declaración:
poner 5 * 4 en el resultado
mientras que en el lenguaje de programación BASIC más tradicional (y la mayoría de los demás), se lograría lo mismo escribiendo:
theResult = 5 * 4
El código HyperTalk tiene el efecto secundario de crear la variable theResult sobre la marcha. Los scripts pueden asignar cualquier tipo o valor a una variable usando el put
comando, lo que hace que HyperTalk se escriba muy débilmente . Las conversiones entre tipos de variables eran invisibles y automáticas: la cadena "3" podí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 se pudieran convertir automáticamente.
El control de flujo y la lógica eran generalmente similares a otros lenguajes comunes, utilizando una if ... then ... else ... end if
estructura para condicionales y bucles de soporte basados en una repeat ... end repeat
sintaxis flexible . Comentarios fueron precedidos por dos signos menos: -- this is a comment
.
Objetos, contenedores y scripts
El concepto de interfaz de usuario principal de HyperCard era la tarjeta , un sistema de visualización que emulaba una tarjeta de índice . Las tarjetas se usaban normalmente para almacenar información, similar a un registro en una base de datos convencional de archivos planos . El diseño gráfico de la tarjeta se creó usando el mouse colocando varios elementos en la tarjeta, como campos de texto y botones. Una "tarjeta" de diseño maestro conocida como fondo se mostró 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 script
propiedad disponible en muchos de los contenedores de la pila. Los scripts pueden acceder a las propiedades de un contenedor, correspondientes a las variables de instancia , utilizando 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, [a] o importarse de otras pilas mediante el start using
comando. Una secuencia de comandos incluso podría ser texto proporcionado por el usuario escrito en un campo de texto en pantalla. El texto arbitrario se puede ejecutar usando el do
comando, de manera similar a SQL dinámico. [3]
Refiriéndose a 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 podría dar un nombre opcional. Los scripts pueden hacer referencia a objetos mediante cualquiera de estos identificadores, junto con un tipo de objeto especificado mediante el of
operador. Este operador utilizó una sintaxis de lenguaje natural para facilitar la lectura de un código autodocumentado . Por ejemplo, una secuencia de comandos almacenada en un botón de una tarjeta puede desear tomar el texto proporcionado por el usuario recopilado mediante un campo de texto y almacenar el texto en una variable llamada Valor :
poner el valor del campo de la tarjeta "escriba 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 la tarjeta de identificación se refería a la tarjeta con la que el usuario estaba interactuando, aunque el botón en sí normalmente estaría encendido el fondo. Además, se asumió que " el valor " (el texto enviado por el usuario) era la propiedad principal y el objetivo de las operaciones si no se especificaba lo contrario. Asimismo, se asumió que el " campo de la tarjeta " era el objetivo del comando, a diferencia del campo de fondo, por lo que la información también podría omitirse. Incluso los tipos de contenedor tenían formularios cortos que los programadores podían usar para ahorrar tipeo. Por lo tanto, el código anterior es equivalente a la forma más corta:
poner fld "typehere" en el valor
A los objetos dentro de un contexto dado, la tarjeta o el fondo, por ejemplo, también se les dio 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 de la tarjeta, el código anterior también podría escribirse:
poner el primer campo de la tarjeta en el valor
o:
poner el campo de la tarjeta 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 el código más legible.
HyperTalk incluyó el me
contenedor que actuó de la misma manera que el self
calificador que se encuentra en la mayoría de los lenguajes orientados a objetos , permitiendo un acceso simple al objeto contenedor actual. Menos común fue la it
variable, que contenía el valor de la última operación para ciertos operadores integrados. Por ejemplo:
pregunte "¿Cuál es el valor?" puesto que en la tarjeta de campo "pantalla"
usa el ask
comando para mostrar un cuadro de diálogo y capturar el texto escrito en un campo de texto adjunto; cuando el diálogo se completa Returnpresionando o haciendo clic OK, el valor se asigna a la it
pseudovariable. Este código luego copia ese valor en un campo de tarjeta usando el put
operador de asignación.
Colecciones
Los contenedores de un tipo determinado 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 lo estaba card fields
. Estas colecciones eran en sí mismas contenedores con sus propias propiedades. Entre ellas, la clave fue la number
propiedad que se utilizó 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 la número de tarjeta de campos ocultar campo i termino 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 hide
comando y el asociado show
actúan estableciendo el valor de la visible
propiedad del contenedor . Por hide field i
lo tanto, es exactamente equivalente a set the visible of field i to false
. Un ejemplo similar fue el lock screen
comando que detuvo la actualización visual, que era una forma abreviada de set the lockscreen 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, con el fin de simplificar la sintaxis y mejorar la legibilidad del código común.
En HyperCard 2.2 y posteriores, la colección de colecciones también estaba disponible como contenedor parts
. Esto permitió que un script se dirigiera a todos los objetos en un contenedor con un solo iterador.
Manejo de texto
Una característica notable del modelo de contenedor 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 en sí misma un contenedor con múltiples colecciones de contenedores dentro. Esto permitió a los scripts analizar el texto utilizando 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í:
poner la tercera palabra de theFilesText en colThree
Esta sintaxis permitió que el script "recorra" el texto para encontrar datos particulares, como en este ejemplo:
poner el primer carácter de la tercera palabra de la línea 5 del campo de la tarjeta "algún texto" en el Char
Este proceso de tratar el texto como un contenedor se conocía como "fragmentación" y las funciones como "expresiones fragmentadas". Estos mismos tipos de expresiones se utilizaron 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:
en el archivo de respuesta mouseDown "Seleccione un archivo de texto para abrir". Si se está vacía luego salir mouseDown puesto que en rutaArchivo si no es un archivo de rutaArchivo entonces abierta archivo rutaArchivo leer desde el archivo rutaArchivo hasta el retorno puso que en cd FLD "algún campo" estrecha archivo rutaArchivo establece el estilo de texto de caracteres 1 a 10 de la tarjeta de campo "algún campo" al final en negrita si end mouseDown
HyperTalk también incluyó funciones para fragmentar cadenas usando una operación de búsqueda de subcadenas usando el in
operador. El siguiente código encuentra todos los ejemplos de un patrón dado usando in
como parte del repeat
bucle, mientras offset
busca la ubicación de ese patrón dentro de la cadena:
función replaceStr patrón , newStr , inStr repetir mientras el patrón está en inStr poner offset ( patrón , inStr ) en pos poner newStr en el carácter pos to ( pos + la longitud del patrón ) - 1 de inStr end repeat return inStr end replaceStr
Listas y otras colecciones
HyperTalk utilizó el mismo sistema de fragmentación para producir estructuras como matrices o listas. Esta 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ían según sea necesario. Por ejemplo, la posición de los objetos en la pantalla se definió mediante un par de números que representan las coordenadas X e Y en relación con la esquina superior izquierda. El siguiente código crea una variable llamada pos que contiene un par de coordenadas, y luego lo manipula para reposicionar todos los botones en una tarjeta en una diagonal de arriba a la izquierda a abajo a la derecha:
en mouseUp poner "100,100" en pos. repetir con x = 1 para el número de botones de la tarjeta establecer la ubicación del botón de la tarjeta x para pos agregar 15 al elemento 1 de pos end repeat end mouseUp
La item
expresión de fragmentación se basó originalmente en un delimitador de coma , pero las versiones posteriores de HyperCard cambiaron esto por el valor de itemDelimiter
, ofreciendo la capacidad de analizar listas y estructuras arbitrarias.
Mensajes y eventos
HyperTalk usó un concepto orientado a objetos para llamar scripts, con objetos en la pila enviando "eventos" como mensajes que serían procesados por manejadores que declararon su interés en recibir los eventos usando la on
sintaxis. Por ejemplo, la mayoría de los contenedores GUI enviarían el mouseDown
mensaje cuando se hizo clic en el botón del mouse, y luego un mouseUp
mensaje cuando se soltó mientras todavía estaba encima de ese contenedor, y un script podría capturar estos eventos como este:
en mouseUp : coloque el código adicional aquí end mouseUp
Los mensajes de eventos se enviaron primero al script en el objeto que creó el evento, por ejemplo, si el usuario hacía clic en un botón, el mouseUp
mensaje se enviaba primero a ese botón. Si el objeto de secuencia de comandos del botón no tenía un mouseUp
controlador (o no tenía ninguna secuencia de comandos), se pasaba a la tarjeta, el fondo, la pila, cualquier pila cuyas secuencias de comandos se habían importado explícitamente mediante el start using
comando, la "pila de inicio" ( una pila HyperCard siempre abierta seleccionada por el usuario) y, finalmente, a la propia aplicación HyperCard.
Para muchos eventos simples, como los clics del mouse en los botones, el script 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 botones de esta manera:
en mouseUp repita con i = 1 hasta el número de campos de la tarjeta ocultar campo i end repetir end mouseUp
En el caso de que se llamara al código desde varias ubicaciones o se utilizara como un controlador global para un evento, el script podría determinar el remitente original del evento mediante la target
función. Del mismo modo, los scripts podrían enviar eventos a otros contenedores usando el send
comando y luego usando el código de navegación para referirse al contenedor que contiene el código de ese controlador:
enviar "mouseUp" al botón de la tarjeta "Aceptar" de la tarjeta "Veracidad"
La combinación del procesamiento de cadenas de HyperTalk con el do
comando 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:
en mouseUp seleccione el ClickLine poner la palabra 2 de la ClickLine en linenum hacer línea de 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 un formato como "línea 10 del campo de tarjeta 4". Este código primero selecciona todo el texto en la línea en la que se hace clic, luego extrae el número de línea en una variable local y luego se usa do
para ejecutar el texto como un script HyperCard.
El mouseDown
mensaje 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. Del mismo modo, HyperCard envió periódicas idle
mensaje, mouseEnter
, mouseLeave
, ... y varios otros mensajes relacionados con la navegación entre las diferentes tarjetas en una pila HyperCard, así como de entrada del usuario ( keyDown
, functionKey
eventos, ...), y del sistema. En lo que respecta a los scripters, no hubo bucles de eventos principales como en otros lenguajes de programación procedimental.
Controlar HyperCard
A diferencia de las plataformas generales de desarrollo rápido de aplicaciones , las pilas de HyperCard siempre parecían 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 ventana única tenía un tamaño fijo (en las primeras versiones), y en ciertos casos, los comandos que eran fundamentales para la operación eran parte de la propia aplicación y no estaban disponibles directamente en HyperTalk.
Un buen ejemplo de esto fue la creación de nuevas tarjetas, que formaba parte de la aplicación, a las que no se podía acceder directamente desde el propio lenguaje HyperTalk. Una nueva tarjeta solo se puede crear usando el elemento del menú Nueva tarjeta, que se puede simular en código usando doMenu "New Card"
. Mientras HyperTalk llamaba a los comandos de menú, los comandos de menú también invocaban controladores en HyperTalk. Para ejecutar código personalizado cuando se seleccionó el elemento de menú Copiar, se colocaría un script en la pila usando el on doMenu itemName
controlador y luego se examinaría itemName
para ver si era "Copiar".
HyperTalk también proporcionó control de secuencia de comandos sobre las herramientas de dibujo integradas, simplemente mediante la secuencia de comandos de los cambios necesarios en las herramientas de pintura y la simulación de los movimientos del mouse utilizando los comandos y.drag from start to end
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 en cuanto a la entrada que aceptaban.
Aparte de la declaración implícita de variables anterior cuando se les asignó un valor, y la forma en que los valores se convirtieron implícitamente entre tipos (lo que le permite, por ejemplo, solicitar character 2 of 1234
), HyperCard también reconocería ciertas expresiones y extraería subvalores de ellas.
Por ejemplo:
coloque la línea seleccionada del campo de tarjeta "Listbox" en la Selección - da 'línea 2 a 3 del campo de tarjeta "Listbox"' seleccione la línea 1 del campo de tarjeta "Listbox" seleccione la línea ( palabra 2 de la Selección ) del campo de tarjeta "Listbox" seleccione ( la línea seleccionada del campo de tarjeta "Cuadro de lista" ) - se agregaron paréntesis solo con fines ilustrativos
o
tocar el clavicordio c e g tocar el clavicémbalo "ce g" poner "ce g" en la Melodía tocar el clavicémbalo 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, se trataba de una sintaxis de caso especial y no tenía los inconvenientes de que los datos se evaluaran como código. Entonces, por ejemplo, todos los siguientes son errores de sintaxis en la melodía, no llamadas a funciones:
tocar el clavicordio "ceg ()" poner "ce () g" en la Melodía tocar el clavicémbalo 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 específicos de Macintosh). recursos ) con un único punto de entrada y valor de retorno. Los XCMD y XFCN se podían llamar como controladores normales de mensajes y funciones 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 para propósitos especiales (Prompt, Tabloid, Textoid, Listoid, ShowDialog, MegaWindows), soporte para arrastrar y soltar y varias interfaces de hardware al idioma.
Descendientes de HyperTalk
Varios lenguajes de secuencias de comandos han implementado un superconjunto de HyperTalk:
- CompileIt! -Talk - Una pila HyperCard y XCMD de Tom Pittman que permitió compilar código de máquina nativo 68000 (por ejemplo, para XCMD y XFCN) a partir del código HyperTalk y llamar a las rutinas nativas de la caja de herramientas de Macintosh. CompileIt fue bootstrap , es decir, las versiones posteriores se compilaron utilizando versiones anteriores de sí mismo.
- Double-XX-Talk (?) - Double-XX fue un clon ligero de HyperCard que se envió como una adición a CompileIt! y permitió ejecutar XCMD y XFCN sin HyperCard, e incluso incluyó un pequeño intérprete 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 (?) - de Spinnaker Plus (originalmente del formato alemán Verlag), que se utilizó como base para Oracle Media Objects .
- SenseTalk : el lenguaje de HyperSense originado en NeXT y la herramienta de prueba Eggplant basada en VNC .
- SuperTalk : el lenguaje de SuperCard , el primer clon de HyperCard, de Bill Appleton. Appleton también escribió el popular kit de construcción de aventuras World Builder .
- Transcript (anteriormente revTalk y MetaTalk): el lenguaje implementado en el entorno de desarrollo y plataforma de software LiveCode (anteriormente Revolution y MetaCard). MetaCard fue uno de los primeros clones de HyperCard originado en Unix que se ejecutaba en Classic Mac OS, Mac OS X, Windows, Linux y Solaris.
- XION: originalmente el lenguaje de un clon de HyperCard de código abierto que nunca se materializó. Ahora implementado como OpenXION .
Estos clones y dialectos (comúnmente denominados bajo el nombre 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 definidos por el usuario, temporizadores, subprocesos múltiples e incluso objetos definidos.
También hay lenguajes cuya sintaxis y estructura no pueden contradecir las influencias de HyperTalk, como:
- ActionScript : el lenguaje de secuencias de comandos para Adobe Flash
- AppleScript : el principal lenguaje de secuencias de comandos del Mac OS de Apple.
- Lingo : el lenguaje de programación de Macromedia Director comenzó con una sintaxis similar a xTalk, aunque las versiones actuales tomaron una dirección más parecida a JavaScript.
- JavaScript : un lenguaje de secuencias de comandos 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 . [4] Posteriormente se generalizó y estandarizó como ECMAScript .
Muchos nombres de métodos que HyperTalk popularizó por primera vez se convirtieron en lenguajes posteriores, como el onmouseup
controlador de eventos en JavaScript. [5] 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.
Ver también
- Inform 7 : un lenguaje de programación con una sintaxis similar al inglés
Notas
- ^ Que, a su vez, podría cargarse desde archivos de texto.
Referencias
- ↑ a b Flynn, Laurie (27 de febrero de 1989). "Apple reflexiona sobre la estandarización de HyperTalk" . InfoWorld . pag. 31.
- ^ Dave Kelly, "Herramientas del oficio: CompileIt! 2.0!" , MacTech , vol. 7 No. 9
- ^ Erland Sommarskog y Frank Kalis, "La maldición y las bendiciones del SQL dinámico" , 23 de junio de 2011
- ^ Eich, Brendan (1998). "Prefacio". En Goodman, Danny (ed.). Biblia JavaScript (3ª ed.). John Wiley e hijos . ISBN 0-7645-3188-3. LCCN 97078208 . OCLC 38888873 . OL 712205M .
- ^ Brendan Eich, "Splash keynote 2011, diapositiva 10"
enlaces externos
- Páginas Wiki de HyperTalk de Pantechnicon : referencia del lenguaje HyperTalk (estructuras de control, eventos, funciones integradas, etc.)