Введение

Язык программирования HyperTalk — это устаревший высокоуровневый процедурный язык программирования, созданный в 1987 году Дэном Винклером и использовавшийся Биллом Аткинсоном совместно с гипермедийной программой HyperCard от Apple Computer. Поскольку основной аудиторией HyperTalk были начинающие программисты, разработчиков на HyperTalk обычно называли "авторами", а процесс написания программ — "скриптингом". Скрипты HyperTalk были близки к естественному английскому языку и использовали логическую структуру, схожую с языком программирования Pascal. HyperTalk поддерживал базовые управляющие структуры процедурных языков: циклы for/while/until, условные операторы if/then/else, а также вызовы "обработчиков" функций и сообщений (обработчик функции представлял собой подпрограмму, а обработчик сообщения — процедуру). Обычно программисту не требовалось явно указывать типы данных; преобразование между строками и числами происходило прозрачно в фоновом режиме. Классы и структуры данных в традиционном понимании отсутствовали; вместо них использовались специальные строковые литералы или "списки" "элементов", разделенных запятыми (в более поздних версиях свойство "itemDelimiter" позволяло выбирать произвольный разделитель). Выполнение кода обычно начиналось в ответ на событие, например, щелчок мыши по элементу пользовательского интерфейса. В конце 1980-х годов компания Apple рассматривала возможность использования языка, нечувствительного к регистру, который изначально интерпретировался, но получил компиляцию "точно в срок" (JIT) с HyperCard 2.0.

Объекты, контейнеры и скрипты

Основной концепцией пользовательского интерфейса HyperCard была карта – система отображения, имитирующая индексную карточку. Карты обычно использовались для хранения информации, подобно записи в обычной плоской файловой базе данных. Графическая компоновка карты создавалась с помощью мыши путем размещения на ней различных элементов, таких как текстовые поля и кнопки. За прозрачными областями каждой карты отображалась основная "карта" – фон. Объекты, размещенные на фоне, такие как поля и кнопки, использовались в качестве общего макета для нескольких карт, но с уникальным содержимым для каждой карты. Коллекция карт, фонов и связанных с ними данных хранилась в одном файле, известном как стек (карт). Все эти объекты, содержащие данные, в совокупности называются контейнерами. Функции HyperTalk, или скрипты, обычно хранились в свойстве "скрипт", доступном во многих контейнерах стека. Скрипты могли обращаться к свойствам контейнера, соответствующим переменным экземпляра, с помощью команд get и set. Свойство "скрипт" содержало обычный текст и не имело специальных свойств; скрипты можно было помещать и запускать из любого текстового контейнера, включая строковые переменные, или импортировать из других стеков с помощью команды start using. Скрипт мог быть даже текстом, введенным пользователем в текстовое поле на экране. Произвольный текст можно было выполнить с помощью команды do, аналогично Dynamic SQL.

Управление HyperCard

В отличие от универсальных платформ быстрой разработки приложений, стеки HyperCard всегда выглядели как стеки: панель меню принадлежала HyperCard, а не программисту (по умолчанию, хотя scripting позволял добавлять, удалять и изменять пункты меню), одно окно имело фиксированный размер (в ранних версиях), а в некоторых случаях команды, критически важные для работы, были встроены непосредственно в приложение и не были доступны из HyperTalk. Яркий пример – создание новых карточек, которое осуществлялось как часть приложения, а не напрямую из языка HyperTalk. Новую карточку можно было создать только через пункт меню "Новая карточка", который можно было эмулировать в коде с помощью команды `doMenu "Новая карточка"`. HyperTalk вызывал команды меню, но и команды меню, в свою очередь, могли вызывать обработчики в HyperTalk. Чтобы выполнить пользовательский код при выборе пункта меню "Копировать", нужно было поместить скрипт в стек, используя обработчик `on doMenu itemName`, а затем проверить значение `itemName` на соответствие строке "Копировать". HyperTalk также предоставлял возможность управления встроенными инструментами рисования через scripting, изменяя параметры инструментов и имитируя движения мыши командами "перетащить от начала до конца" и "кликнуть в позиции".

Расширение HyperTalk

Хотя язык HyperTalk, как и сама HyperCard, пришел в упадок, интерес к нему возродился благодаря протоколу плагинов, так называемым внешним командам (XCMD) и внешним функциям (XFCN), которые представляли собой контейнеры для нативного кода, подключаемые к стекам (в виде ресурсов, специфичных для Macintosh) с единственной точкой входа и возвращаемым значением. XCMD и XFCN можно было вызывать из скриптов HyperTalk как обычные обработчики сообщений и функций, а также они могли отправлять сообщения обратно в приложение HyperCard. Некоторые авторы XCMD добавили расширенные возможности, такие как поддержка полноценной цветовой палитры (ColorizeHC, HyperTint, AddColor), множество специализированных окон (Prompt, Tabloid, Textoid, Listoid, ShowDialog, MegaWindows), поддержку перетаскивания и различные аппаратные интерфейсы для языка.