HyperTalk является прекращено на высоком уровне, процедурный язык программирования создан в 1987 году Дэн Winkler и используется в сочетании с Apple Computer «s HyperCard программы гипермедиа по Билл Аткинсон . Поскольку основной целевой аудиторией HyperTalk были начинающие программисты, программистов HyperTalk обычно называли «авторами», а процесс написания программ - « написанием сценариев ». Скрипты HyperTalk напоминали письменный английский и использовали логическую структуру, аналогичную структуре языка программирования Паскаль .
Парадигма | процедурный , событийный |
---|---|
Разработано | Дэн Винклер |
Разработчик | Apple Computer Inc. |
Впервые появился | 1987 г. |
Под влиянием | |
Естественный язык , Паскаль | |
Под влиянием | |
ActionScript , AppleScript , ECMAScript , JavaScript , Lingo , LiveCode , SenseTalk , SuperTalk |
HyperTalk поддерживает основные управляющие структуры процедурных языков : повторение для / while / до, if / then / else, а также вызовы «обработчиков» функций и сообщений (обработчик функции был подпрограммой, а обработчик сообщения - процедурой). Типы данных обычно не нужно указывать программисту; преобразование происходило прозрачно в фоновом режиме между строками и числами. Не было классов или структур данных в традиционном смысле; на их место были специальные строковые литералы , или «списки» «элементов», разделенные запятыми (в более поздних версиях свойство «itemDelimiter» позволяло выбирать произвольный символ). Выполнение кода обычно начиналось как реакция на событие, такое как щелчок мышью по виджету пользовательского интерфейса.
В конце 1980-х годов Apple рассматривала [1] использование скриптового языка HyperCard HyperTalk в качестве стандартного языка для всей компании и в своей классической операционной системе Mac OS , а также для межпроцессного взаимодействия между продуктами Apple и других производителей. Компания не возражала против разработки имитаций вроде SuperCard , но создала комитет по стандартам HyperTalk, чтобы избежать несовместимости между языковыми вариантами. [1] регистронезависимый язык был изначально интерпретирован , но получил только в сроке компиляции с HyperCard 2.0. [2]
Описание
Фундаментальные операции
Для большинства основных операций, включая математические вычисления, HyperTalk отдает предпочтение упорядочению предикатов на естественном языке по сравнению с порядком, используемым в математической нотации. Например, в put
команде присвоения HyperTalk переменная была помещена в конец оператора:
поместите 5 * 4 в Результат
тогда как в более традиционном языке программирования BASIC (и большинстве других) то же самое можно сделать, написав:
результат = 5 * 4
Побочный эффект кода HyperTalk заключается в создании переменной theResult на лету. Сценарии могут назначать любой тип или значение переменной с помощью put
команды, что делает HyperTalk очень слабо типизированным . Преобразования между типами переменных были невидимыми и автоматически: строка «3» может быть умножен на число 5 , чтобы получить номер 15, или число 5 каскадного на строку «3» , чтобы произвести строку «35». HyperTalk не будет жаловаться, если типы не могут быть автоматически преобразованы.
Управление потоком и логика в целом были похожи на другие распространенные языки, используя if ... then ... else ... end if
структуру для условных выражений и поддерживающие циклы, основанные на гибком repeat ... end repeat
синтаксисе. Комментарии были предваряется двумя минусами: -- this is a comment
.
Объекты, контейнеры и скрипты
Основной концепцией пользовательского интерфейса HyperCard была карта , система отображения, имитирующая учетную карточку . Карты обычно использовались для хранения информации, подобной записи в обычной базе данных с плоскими файлами . Графический макет карточки был создан с помощью мыши путем размещения на карточке различных элементов, таких как текстовые поля и кнопки. «Карточка» основного макета, известная как фон, была показана за прозрачными областями каждой карточки. Объекты, размещенные на заднем плане, такие как поля и кнопки, будут совместно использоваться несколькими карточками как общий макет, но с содержанием, специфичным для карточек. Коллекция карточек, фонов и связанных данных, хранящихся в них, хранилась в одном файле, известном как стопка (карточек). В совокупности все эти объекты, содержащие данные, называются контейнерами .
Функции или сценарии HyperTalk обычно хранятся в script
свойствах, доступных во многих контейнерах стека. Сценарии могли получить доступ к свойствам контейнера, соответствующие переменные экземпляра , используя get
и set
инструкции. Свойство скрипта содержало простой текст и не имело специальных свойств; сценарии могут быть помещены и запущены из любого текстового контейнера, включая строковые переменные, [a] или импортированы из других стеков с помощью start using
команды. Сценарий может даже представлять собой предоставленный пользователем текст, введенный в текстовое поле на экране. Произвольный текст может быть выполнен с помощью do
команды аналогично динамическому SQL. [3]
Ссылаясь на контейнеры
Ключевым понятием в HyperTalk было то, как он относился к контейнерам через систему навигации, основанную на визуальной иерархии стека. Каждому контейнеру в стеке при создании был присвоен уникальный идентификационный номер, а также может быть присвоено дополнительное имя. Сценарии могут ссылаться на объекты, используя любой из этих идентификаторов, а также тип объекта, указанный с помощью of
оператора. Этот оператор использовал синтаксис естественного языка для создания легко читаемого самодокументируемого кода . Например, сценарий, хранящийся в кнопке на карточке, может захотеть взять введенный пользователем текст, собранный с использованием текстового поля, и сохранить этот текст в переменной с именем theValue :
поместить в значение из карты поля «typehere» в theValue
Интерпретатор может сделать вывод о различных контекстных аспектах утверждений. В приведенном выше утверждении, например, поскольку сценарий будет выполняться в контексте кнопки на определенной карточке, считалось, что карточка идентификатора относится к карточке, с которой взаимодействовал пользователь, даже если сама кнопка обычно находится на фон. Кроме того, предполагалось , что « значение » (текст, представленный пользователем) является основным свойством и целью операций, если не указано иное. Аналогичным образом предполагалось, что целью команды является « поле карты », в отличие от фонового поля, так что эту информацию также можно было опустить. Даже у контейнерных типов были короткие формы, которые программисты могли использовать для экономии ввода. Таким образом, приведенный выше код эквивалентен более короткой форме:
поместите поле "typehere" в значение
Объектам в заданном контексте - например, карте или фону - также был присвоен номер времени выполнения, основанный на их z-порядке на экране. Чтобы помочь в использовании их положения для навигации, HyperTalk также включил множество порядковых и кардинальных систем ссылок для дальнейшего упрощения синтаксиса. Предполагая, что поле "typehere" - единственное поле на карточке, можно также записать приведенный выше код:
поместить в первой карте поле в theValue
или же:
поместите поле карты 1 в значение
Выбор стиля адресации оставался за программистом; часто в разных операторах использовались разные стили, чтобы сделать код более читабельным.
HyperTalk включает me
контейнер, который действует так же, как self
квалификатор в большинстве объектно-ориентированных языков , обеспечивая простой доступ к текущему объекту контейнера. Менее распространенной была it
переменная, которая содержала значение последней операции для некоторых встроенных операторов. Например:
спросите "Какая ценность?" поместите его в поле карточки "отображение"
использует ask
команду для отображения диалогового окна и ввода текста, введенного в сопроводительное текстовое поле; когда диалог завершается нажатием Returnили щелчком OK, значение присваивается it
псевдопеременной. Затем этот код копирует это значение в поле карты с помощью put
оператора присваивания.
Коллекции
Контейнеры данного типа также были доступны как коллекции с версией во множественном числе этого типа контейнера в качестве имени - была коллекция полей на карточке card fields
. Эти коллекции сами по себе были контейнерами со своими собственными свойствами. Ключевым среди них было number
свойство, которое широко использовалось во время итераций и подобных задач. Например, если кто-то хочет скрыть все поля на карточке, это можно сделать с помощью этого кода:
повторите с I = 1 к с номером из карты полей скрыть поле я закончить повторение
Этот код раскрывает еще одну общую особенность HyperTalk: свойство может иметь несколько имен и операторов. В этом случае hide
команда и связанные с ней show
действуют, устанавливая значение visible
свойства контейнера . Таким образом, hide field i
это в точности эквивалентно set the visible of field i to false
. Похожим примером была lock screen
команда, останавливающая визуальное обновление, которая была сокращенной формой для set the lockscreen to true
, где lockscreen
является свойством самой HyperCard, а также контейнером. Многие примеры такого рода синтаксического сахара были найдены в HyperTalk, чтобы упростить синтаксис и улучшить читаемость общего кода.
В HyperCard 2.2 и более поздних версиях коллекция коллекций также была доступна в виде контейнера parts
. Это позволило сценарию обращаться ко всем объектам в контейнере с помощью одного итератора.
Обработка текста
Примечательной особенностью модели контейнера HyperTalk была обработка текста. Каждый набор текста, будь то буквальная строка в программе или текст, введенный в текстовое поле, сам по себе считался контейнером с несколькими коллекциями контейнеров внутри него. Это позволяло сценариям анализировать текст, используя те же навигационные команды, что и любой другой контейнер. Например, при анализе файла данных с разделителями-пробелами может потребоваться извлечь третий столбец, например:
поставил на третье слово из theFilesText в colThree
Этот синтаксис позволил сценарию «пройтись» по тексту в поисках конкретных данных, как в этом примере:
положил на первый символ из в третье слове из строки 5 из карты поля «SOMETEXT» в theChar
Этот процесс обработки текста как контейнера был известен как «разбиение на части», а функции - как «выражения фрагментов». Эти же виды выражений использовались для обработки файловых манипуляций вместе с набором функций управления файлами. Следующий код открывает известный файл, читает из него, извлекает данные, а затем закрывает файл:
в файле ответов mouseDown «Выберите текстовый файл для открытия». если он является пустым , то выйти из MouseDown поместить его в Filepath если есть это файл Filepath затем открыт файл Filepath чтения из файла Filepath до возвращения не положил его в кд FLD «некоторое поле» близко файл Filepath установлен в TextStyle от характера 1 до 10 из карты поля «какое - то поле» до смелого конца , если конец MouseDown
HyperTalk также включает функции для разбиения строк на части с помощью операции поиска подстроки с использованием in
оператора. Следующий код находит все примеры данного шаблона, используя in
как часть repeat
цикла, а также offset
находит расположение этого шаблона в строке:
Функция replaceStr узор , NewStr , INSTR повтор в то время как шаблон в Instr положить смещение ( шаблон , INSTR ) в позы поместить NewStr в символьные позы , чтобы ( позы + длины по шаблону ) - 1 из Instr конца повторного возврата Instr конца replaceStr
Списки и другие коллекции
HyperTalk использовал ту же систему фрагментов для создания таких структур, как массивы или списки. Такая структура может быть создана путем помещения нескольких элементов данных в переменную, разделенных запятыми. В сценарий HyperTalk можно импортировать различные типы данных, используя строки, которые будут анализироваться по мере необходимости. Например, положение объектов на экране определялось парой чисел, представляющих координаты X и Y относительно верхнего левого угла. Следующий код создает переменную с именем pos, которая содержит пару координат, а затем манипулирует ею, чтобы переставить все кнопки на карточке по диагонали от верхнего левого угла к нижнему правому:
на MouseUp поставила «100100» в пос повторить с й = 1 к с номером из карты кнопок установить на месте в картах кнопки х в позы добавить 15 к пункту 1 из поз конца повтора конца MouseUp
item
Отрывы выражение первоначально было основано на запятую разделителе , но более поздние версии HyperCard изменили это к стоимости itemDelimiter
, предлагая возможность анализировать произвольные списки и структуру.
Сообщения и события
HyperTalk использует объектно-ориентированную концепцию для вызова сценариев, при этом объекты в стеке отправляют «события» в виде сообщений , которые будут обрабатываться обработчиками , заявившими о своей заинтересованности в получении событий с использованием on
синтаксиса. Например, большинство контейнеров с графическим интерфейсом будут отправлять mouseDown
сообщение, когда кнопка мыши была нажата, а затем mouseUp
сообщение, когда она была отпущена, когда она все еще находилась наверху этого контейнера, и сценарий может захватывать эти события следующим образом:
на mouseUp - разместите дополнительный код здесь end mouseUp
Сообщения о событиях сначала отправлялись сценарию в объекте, создавшем событие, например, если пользователь нажимал кнопку, mouseUp
сообщение было сначала отправлено на эту кнопку. Если объект сценария кнопки не имеет mouseUp
обработчика (или вообще не имеет сценария), он затем передается карте, фону, стеку, любым стекам, сценарии которых были явно импортированы с помощью start using
команды, «домашний стек» ( выбираемый пользователем всегда открытый стек HyperCard), и, наконец, само приложение HyperCard.
Для многих простых событий, таких как щелчки мышью по кнопкам, сценарий будет размещен непосредственно в рассматриваемом объекте, в самой кнопке. Например, можно использовать приведенный выше пример кода в обработчике кнопки следующим образом:
на MouseUp повторе с я = 1 , чтобы в ряд из карты поля скрыть поле я конец повтора конца MouseUp
В случае, когда код вызывается из нескольких мест или используется в качестве глобального обработчика события, сценарий может определить исходного отправителя события с помощью target
функции. Точно так же сценарии могут отправлять события в другие контейнеры с помощью send
команды, а затем с помощью кода навигации для обращения к контейнеру, содержащему код этого обработчика:
послать «MouseUp» на карту кнопку «OK» на карте «Достоверность»
Объединение обработки строк в HyperTalk с do
командой позволило создавать интерактивные интерпретаторы, помещая текстовое поле на карточку и затем помещая этот код в сценарий поля:
на MouseUp выберите в clickLine пут слово 2 из в clickLine в - строки сделать строки LINENUM из компакт - диска FLD 1 конец MouseUp
clickLine
- это глобальное свойство, которое возвращает имя и номер строки последнего нажатого поля в виде «строка 10 поля 4 карточки». Этот код сначала выбирает весь текст в строке, по которой щелкнули мышью, затем извлекает номер строки в локальную переменную, а затем использует do
для запуска текста в качестве сценария HyperCard.
mouseDown
Сообщение было отправлено на кнопку , когда пользователь нажал ее, и mouseUp
был послан , когда пользователь отпустит кнопку мыши внутри него , чтобы вызвать его действие. Точно так же, HyperCard послал периодические idle
сообщения, mouseEnter
, mouseLeave
, ... и другие различные сообщения , относящиеся к навигации между различными картами в стеке HyperCard, а также пользовательского ввода ( keyDown
, functionKey
, ...), и системные события. Что касается сценаристов, то здесь не было циклов основных событий, как в других процедурных языках программирования.
Управление HyperCard
В отличие от обычных платформ быстрой разработки приложений , стеки HyperCard всегда выглядели как стеки - строка меню принадлежала HyperCard, а не программисту (по умолчанию - сценарии могли добавлять, удалять и изменять меню), единое окно было фиксированного размера (в ранних версиях), а в некоторых случаях команды, которые были центральными для операции, были частью самого приложения и не были напрямую доступны в самом HyperTalk.
Хорошим примером этого было создание новых карточек, которые были частью приложения, не доступными напрямую из самого языка HyperTalk. Новую карту можно было создать только с помощью пункта меню «Новая карта», который можно было смоделировать с помощью кода doMenu "New Card"
. В то время как HyperTalk вызывал команды меню, команды меню также вызывали обработчики в HyperTalk. Чтобы запустить пользовательский код, когда был выбран пункт меню «Копировать», нужно поместить сценарий в стек с помощью on doMenu itemName
обработчика, а затем проверить, itemName
был ли он «Копировать».
HyperTalk также обеспечивал управление сценариями над встроенными инструментами рисования, просто создавая сценарии необходимых изменений в инструментах рисования и имитируя движения мыши с помощью команд и.drag from start to end
click at position
Прощающая семантика
Одно уникальное различие между языком программирования HyperCard HyperTalk и, казалось бы, похожими языками, такими как AppleScript, заключалось в том, что сценарии HyperTalk были более снисходительны в том, какой ввод они принимали.
Помимо вышеупомянутого неявного объявления переменных, когда им было присвоено значение, и способа неявного преобразования значений между типами (что позволяет, например, запрашивать character 2 of 1234
), HyperCard также распознает определенные выражения и извлекает из них подзначения.
Например:
поместить в selectedLine из карты поля «Listbox» в theSelection - дает «линию 2 до 3 поля карты„Listbox“» выберите линию 1 из карты поля «Listbox» выберите строку ( слово 2 из theSelection ) из карты поля «Listbox» выбери ( selectedLine из карты поля «Listbox» ) - круглые скобки добавлен только для иллюстрации
или же
играть на клавесине c e g играть на клавесине "ce g" вставить "ce g" в мелодию играть на клавесине мелодию
Хотя конечный результат был похож на сценарии, как расширение переменных сценария Bash перед синтаксическим анализом, это был синтаксис особого случая и не имел подводных камней, при которых данные оценивались бы как код. Так, например, все перечисленное ниже является синтаксическими ошибками мелодии, а не вызовами функций:
сыграть на клавесине "ceg ()" вставить "ce () g" в мелодию сыграть на клавесине мелодию
Расширение HyperTalk
Хотя язык HyperTalk утомился, как и сама HyperCard, он получил вторую жизнь благодаря протоколу подключаемых модулей, так называемым внешним командам (XCMD) и внешним функциям (XFCN), которые были контейнерами собственного кода, прикрепленными к стекам (как для Macintosh). ресурсы ) с единственной точкой входа и возвращаемым значением. XCMD и XFCN могли вызываться точно так же, как обычные обработчики сообщений и функций из сценариев HyperTalk, а также могли отправлять сообщения обратно в приложение HyperCard. Некоторые предприимчивые авторы XCMD добавили в язык расширенные функции, такие как поддержка полного цвета (ColorizeHC, HyperTint, AddColor), несколько окон специального назначения (Prompt, Tabloid, Textoid, Listoid, ShowDialog, MegaWindows), поддержку перетаскивания и различные аппаратные интерфейсы.
Потомки HyperTalk
Различные языки сценариев реализовали расширенный набор HyperTalk:
- CompileIt! -Talk - Стек HyperCard и XCMD от Тома Питтмана, который позволял компилировать собственный машинный код 68000 (например, для XCMD и XFCN) из кода HyperTalk и вызывать собственные процедуры набора инструментов Macintosh. CompileIt был загрузочным , то есть более поздние версии были скомпилированы с использованием более ранних версий самого себя.
- Double-XX-Talk (?) - Double-XX был легким клоном HyperCard, который поставлялся как дополнение к CompileIt! и позволял запускать XCMD и XFCN без HyperCard и даже включал небольшой интерпретатор HyperTalk.
- MediaTalk - язык Oracle Media Objects , потомка Plus и первого кроссплатформенного клона HyperCard. Более того, единственный действительно модульный.
- PlusTalk (?) - Spinnaker Plus (первоначально немецкого Format Verlag), который использовался в качестве основы для Oracle Media Objects .
- SenseTalk - Язык Следующего возник HyperSense и инструмент тестирования VNC на основе баклажанов .
- SuperTalk - язык SuperCard , первого клона HyperCard, созданного Биллом Эпплтоном. Appleton также написал популярный конструктор приключений World Builder .
- Transcript (ранее revTalk и MetaTalk) - язык, реализованный в программной платформе и среде разработки LiveCode (ранее Revolution и MetaCard). MetaCard была ранним клоном HyperCard из Unix, который работал в классической Mac OS, Mac OS X, Windows, Linux и Solaris.
- XION - изначально язык клона HyperCard с открытым исходным кодом, который так и не материализовался. Теперь реализовано как OpenXION .
Эти клоны и диалекты (обычно называемые xTalk -языками) добавляли к языку различные функции, которые ожидаются от современного языка программирования, такие как обработка исключений, определяемые пользователем свойства объектов, таймеры, многопоточность и даже пользовательские функции. определенные объекты.
Существуют также языки, синтаксис и структура которых не могут опровергать влияния HyperTalk, например:
- ActionScript - язык сценариев для Adobe Flash
- AppleScript - основной язык сценариев Mac OS от Apple.
- Lingo - язык программирования Macromedia Director начался с синтаксиса, подобного xTalk, хотя текущие версии пошли в направлении, больше похожем на JavaScript.
- JavaScript - язык сценариев, созданный Бренданом Эйхом, который обычно реализуется как часть веб-браузера для создания расширенных пользовательских интерфейсов и динамических веб-сайтов . [4] Позже он был обобщен и стандартизирован как ECMAScript .
Многие имена методов, впервые популяризированные HyperTalk, вошли в более поздние языки, например, onmouseup
обработчик событий в JavaScript. [5] Хотя Asymetrix ToolBook часто также считается клоном HyperCard, его язык сценариев явно мало похож на HyperTalk.
Смотрите также
- Inform 7 - язык программирования с синтаксисом, похожим на английский
Заметки
- ^ Которая, в свою очередь, могла быть загружена из текстовых файлов.
Рекомендации
- ^ a b Флинн, Лори (27 февраля 1989). «Apple обдумывает стандартизацию HyperTalk» . InfoWorld . п. 31.
- ^ Дэйв Келли, "Профессиональные инструменты: CompileIt! 2.0!" , MacTech , Vol. 7 No. 9
- ^ Erland Sommarskog и Фрэнк Калис, «Проклятие и Благословения Dynamic SQL» , 23 июня 2011
- ^ Эйх, Брендан (1998). «Предисловие». В Гудмане, Дэнни (ред.). Библия JavaScript (3-е изд.). Джон Вили и сыновья . ISBN 0-7645-3188-3. LCCN 97078208 . OCLC 38888873 . ПР 712205М .
- ↑ Брендан Эйх, «Всплеск лейтмотив 2011, слайд 10»
Внешние ссылки
- Страницы Pantechnicon HyperTalk Wiki - справочник по языку HyperTalk (управляющие структуры, события, встроенные функции и т. Д.)