ГиперТок
Парадигма | процедурный , управляемый событиями |
---|---|
Разработано | Дэн Винклер |
Разработчик | Эппл Компьютер Инк. |
Впервые появился | 1987 |
Под влиянием | |
Программирование на естественном языке , Паскаль. | |
Под влиянием | |
ActionScript , AppleScript , ECMAScript , JavaScript , Lingo , LiveCode , SenseTalk , SuperTalk |
HyperTalk — высокоуровневый процедурный язык программирования , выпуск которого прекращен, созданный в 1987 году Дэном Винклером совместно с Apple Computer HyperCard гипермедийной программой и используемый Биллом Аткинсоном . Поскольку основной целевой аудиторией HyperTalk были начинающие программисты, программистов HyperTalk обычно называли «авторами», а процесс написания программ называли « написанием сценариев ». Сценарии HyperTalk напоминали письменный английский язык и использовали логическую структуру, аналогичную структуре языка программирования Паскаль .
HyperTalk поддерживал базовые структуры управления процедурных языков : повторение for/ while/until, if/then/else, а также вызовы «обработчиков» функций и сообщений (обработчик функции представлял собой подпрограмму, а обработчик сообщений — процедуру). Типы данных обычно не требовалось указывать программисту; происходило прозрачно в фоновом режиме преобразование между строками и числами . Не было классов или структур данных в традиционном смысле; на их месте были специальные строковые литералы , или «списки» «элементов», разделенные запятыми (в более поздних версиях свойство «itemDelimiter» позволяло выбирать произвольный символ). Выполнение кода обычно начинается в ответ на такое событие, как щелчок мышью по виджету пользовательского интерфейса.
В конце 1980-х годов Apple рассматривала [ 1 ] использование HyperCard HyperTalk компании языка сценариев в качестве стандартного языка для всей компании и в ее классической операционной системе Mac OS , а также для межпроцессного взаимодействия между продуктами Apple и сторонних производителей. Компания не выступала против разработки имитаций вроде SuperCard , но создала комитет по стандартам HyperTalk, чтобы избежать несовместимости между языковыми вариантами. [ 1 ] Язык , нечувствительный к регистру, изначально интерпретировался , но был компилирован по принципу «точно в срок» с помощью HyperCard 2.0. [ 2 ]
Описание
[ редактировать ]Основные операции
[ редактировать ]Для большинства базовых операций, включая математические вычисления, HyperTalk отдавал предпочтение упорядочиванию предикатов на естественном языке по сравнению с порядком, используемым в математической записи. Например, в HyperTalk put
команде присваивания, переменная была помещена в конец оператора:
put 5 * 4 into theResult
тогда как в более традиционном языке программирования BASIC (и большинстве других) то же самое можно было бы сделать, написав:
theResult = 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
инструкции. Свойство script содержало обычный текст и не имело специальных свойств; сценарии можно размещать и запускать из любого текстового контейнера, включая строковые переменные, [ а ] или импортированы из других стеков с помощью start using
команда. Сценарий может даже представлять собой предоставленный пользователем текст, введенный в текстовое поле на экране. Произвольный текст может быть выполнен с использованием do
команда, аналогично Dynamic SQL. [ 3 ]
Обращение к контейнерам
[ редактировать ]Ключевой концепцией HyperTalk был способ обращения к контейнерам через систему навигации, основанную на визуальной иерархии стека. Каждому контейнеру в стеке при создании присваивался уникальный идентификационный номер, а также ему можно было дать необязательное имя. Скрипты могут ссылаться на объекты, используя любой из этих идентификаторов, а также тип объекта, указанный с помощью of
оператор. Этот оператор использовал синтаксис естественного языка, что позволило создать легко читаемый и самодокументируемый код . Например, сценарий, хранящийся в кнопке на карточке, может взять введенный пользователем текст, собранный с помощью текстового поля, и сохранить его в переменной с именем theValue :
put the value of card field "typehere" into theValue
Переводчик может вывести различные контекстуальные аспекты высказываний. Например, в приведенном выше утверждении, поскольку сценарий будет выполняться в контексте кнопки на конкретной карте, карточка- идентификатор понимается как ссылка на карту, с которой взаимодействует пользователь, даже если сама кнопка обычно находится на фон. Кроме того, предполагалось, что « значение » (текст, отправленный пользователем) является основным свойством и целью операций, если не указано иное. Аналогичным образом предполагалось, что « поле карты » является целью команды, а не фоновым полем, так что информацию также можно было опустить. Даже у типов контейнеров были короткие формы, которые программисты могли использовать, чтобы не печатать. Таким образом, приведенный выше код эквивалентен более короткой форме:
put fld "typehere" into theValue
Объектам в данном контексте — например, карточке или фону — также присваивался номер времени выполнения, основанный на их z-порядке на экране. Чтобы помочь использовать их положение для навигации, HyperTalk также включил множество порядковых и кардинальных систем ссылок для дальнейшего упрощения синтаксиса. Предполагая, что поле «typehere» является единственным полем на карточке, приведенный выше код также можно написать:
put the first card field into theValue
или:
put card field 1 into theValue
Выбор стиля адресации оставался за программистом; часто в разных операторах использовались разные стили, чтобы сделать код более читабельным.
HyperTalk включал в себя me
контейнер, который действовал так же, как и self
квалификатор, встречающийся в большинстве объектно-ориентированных языков , обеспечивающий простой доступ к текущему объекту-контейнеру. Менее распространенной была it
переменная, содержащая значение последней операции для некоторых встроенных операторов. Например:
ask "What is the value?"
put it into card field "display"
использует ask
команда для отображения диалогового окна и захвата текста, введенного в соответствующее текстовое поле; когда диалог завершится нажатием Return или нажав OK, значение присваивается it
псевдопеременная. Затем этот код копирует это значение в поле карты, используя метод put
оператор присваивания.
Коллекции
[ редактировать ]Контейнеры данного типа также были доступны в виде коллекций с версией этого типа контейнера во множественном числе в качестве имени — коллекция полей на карточке была card fields
. Эти коллекции сами по себе были контейнерами со своими свойствами. Ключевым среди них было number
свойство, которое широко использовалось во время итераций и подобных задач. Например, если кто-то хочет скрыть все поля на карточке, это можно сделать с помощью этого кода:
repeat with i = 1 to the number of card fields
hide field i
end repeat
Этот код раскрывает еще одну общую особенность 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 была обработка текста. Каждая коллекция текста, будь то литеральная строка в программе или текст, введенный в текстовое поле, сама по себе считалась контейнером с несколькими коллекциями контейнеров внутри него. Это позволило сценариям анализировать текст, используя те же навигационные команды, что и любой другой контейнер. Например, при анализе файла данных, разделенных пробелами, может потребоваться извлечь третий столбец, например:
put the third word of theFilesText into colThree
Этот синтаксис позволял сценарию «проходить» по тексту в поисках определенных данных, как в этом примере:
put the first character of the third word of line 5 of card field "sometext" into theChar
Этот процесс обработки текста как контейнера был известен как «фрагментирование», а функции — как «фрагментные выражения». Подобные выражения использовались для манипуляций с файлами, а также для набора функций управления файлами. Следующий код открывает известный файл, читает из него, извлекает данные, а затем закрывает файл:
on mouseDown
answer file "Please select a text file to open."
if it is empty then exit mouseDown
put it into filePath
if there is a file filePath then
open file filePath
read from file filePath until return
put it into cd fld "some field"
close file filePath
set the textStyle of character 1 to 10 of card field "some field" to bold
end if
end mouseDown
HyperTalk также включил функции для разбиения строк на фрагменты с помощью операции поиска подстроки с помощью in
оператор. Следующий код находит все примеры заданного шаблона, используя метод in
как часть repeat
цикл, в то время как offset
находит расположение этого шаблона в строке:
function replaceStr pattern,newStr,inStr
repeat while pattern is in inStr
put offset(pattern,inStr) into pos
put newStr into character pos to (pos +the length of pattern)-1 of inStr
end repeat
return inStr
end replaceStr
Списки и другие коллекции
[ редактировать ]HyperTalk использовал ту же систему фрагментирования для создания таких структур, как массивы или списки. Такая структура будет создана путем помещения нескольких элементов данных в переменную, разделенных запятыми. Различные типы данных можно импортировать в сценарий HyperTalk, используя строки, которые будут анализироваться по мере необходимости. Например, положение объектов на экране определялось парой чисел, представляющих координаты X и Y относительно левого верхнего угла. Следующий код создает переменную с именем pos , которая содержит пару координат, а затем манипулирует ею, чтобы переместить все кнопки на карточке по диагонали от верхнего левого угла к нижнему правому:
on mouseUp
put "100,100" into pos
repeat with x = 1 to the number of card buttons
set the location of card button x to pos
add 15 to item 1 of pos
end repeat
end mouseUp
The item
Выражение фрагментации изначально основывалось на разделителе -запятой , но более поздние версии HyperCard изменили его на значение itemDelimiter
, предлагая возможность анализировать произвольные списки и структуры.
Сообщения и события
[ редактировать ]HyperTalk использовал объектно-ориентированную концепцию для вызова сценариев, при этом объекты в стеке отправляли «события» в виде сообщений , которые обрабатывались обработчиками , которые заявили о своей заинтересованности в получении событий, используя метод on
синтаксис. Например, большинство контейнеров с графическим интерфейсом отправляют mouseDown
сообщение при нажатии кнопки мыши, а затем mouseUp
сообщение, когда оно было выпущено, пока оно все еще находится поверх этого контейнера, и сценарий может фиксировать эти события следующим образом:
on mouseUp
-- place additional code here
end mouseUp
Сообщения о событиях сначала отправлялись сценарию в объекте, создавшем событие, например, если пользователь нажал кнопку mouseUp
сообщение было сначала отправлено на эту кнопку. Если объект сценария кнопки не имел mouseUp
обработчиком (или вообще без сценария), затем он передавался на карту, фон, стек, любые стеки, сценарии которых были явно импортированы с помощью start using
команду, «домашний стек» (выбираемый пользователем всегда открытый стек HyperCard) и, наконец, само приложение HyperCard.
Для многих простых событий, таких как щелчки мышью по кнопкам, скрипт будет помещен непосредственно внутри рассматриваемого объекта, то есть самой кнопки. Например, можно использовать приведенный выше пример кода в обработчике кнопки следующим образом:
on mouseUp
repeat with i = 1 to the number of card fields
hide field i
end repeat
end mouseUp
В случае, когда код вызывался из нескольких мест или использовался в качестве глобального обработчика события, сценарий мог определить исходного отправителя события, используя метод target
функция. Аналогично, сценарии могут отправлять события в другие контейнеры, используя метод send
команду, а затем с помощью навигационного кода обратиться к контейнеру, содержащему код этого обработчика:
send "mouseUp" to card button "OK" of card "Veracity"
Сочетание обработки строк HyperTalk с do
Команда позволяла создавать интерактивные интерпретаторы путем размещения текстового поля на карточке и последующего размещения этого кода в скрипте поля:
on mouseUp
select the clickLine
put word 2 of the clickLine into linenum
do line linenum of cd fld 1
end mouseUp
clickLine
— это глобальное свойство, которое возвращает имя и номер строки последнего поля, на которое щелкнули мышью, в форме, например line 10 of card field 4
. Этот код сначала выделяет весь текст в выбранной строке, затем извлекает номер строки в локальную переменную, а затем использует do
чтобы запустить текст как сценарий HyperCard.
The 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
команды.
Прощающая семантика
[ редактировать ]Одним из уникальных различий между языком программирования HyperTalk HyperTalk и, казалось бы, похожими языками, такими как AppleScript, было то, что сценарии HyperTalk были более снисходительны в отношении принимаемых входных данных.
Помимо приведенного выше неявного объявления переменных, когда им присваивалось значение, и способа неявного преобразования значений между типами (позволяющего, например, запрашивать character 2 of 1234
), HyperCard также распознает определенные выражения и извлекает из них подзначения.
Например:
put the selectedLine of card field "Listbox" into theSelection -- gives 'line 2 to 3 of card field "Listbox"'
select line 1 of card field "Listbox"
select line (word 2 of theSelection) of card field "Listbox"
select (the selectedLine of card field "Listbox") -- parentheses added for illustrative purposes only
или
play harpsichord c e g
play harpsichord "c e g"
put "c e g" into theMelody
play harpsichord theMelody
Хотя конечный результат показался сценаристам похожим на расширение переменных в сценарии Bash перед синтаксическим анализом, это был синтаксис особого случая и не было ловушек, при которых данные могли бы оцениваться как код. Так, например, все следующее является синтаксическими ошибками в мелодии, а не вызовами функций:
play harpsichord "c e g()"
put "c e() g" into theMelody
play harpsichord theMelody
Расширение HyperTalk
[ редактировать ]Хотя язык HyperTalk зачах, как и сам HyperCard, интерес к нему возродился благодаря протоколу подключаемых модулей, так называемым внешним командам (XCMD) и внешним функциям (XFCN), которые представляли собой контейнеры собственного кода, прикрепленные к стекам (как ресурсы, специфичные для Macintosh ) с помощью одна точка входа и возвращаемое значение. XCMD и XFCN можно было вызывать так же, как обычные обработчики сообщений и функций из сценариев HyperTalk, а также отправлять сообщения обратно в приложение HyperCard. Некоторые авторы XCMD добавили в язык расширенные функции, такие как полноцветная поддержка (ColorizeHC, HyperTint, AddColor), несколько окон специального назначения (Prompt, Tabloid, Textoid, Listoid, ShowDialog, MegaWindows), поддержка перетаскивания и различные аппаратные интерфейсы.
Потомки HyperTalk
[ редактировать ]Различные языки сценариев реализовали расширенный набор HyperTalk (известный под общим названием xTalk ): [ 4 ]
- 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 — язык Plus от Spinnaker Software (первоначально разработанный Format Verlag), который использовался в качестве основы для Oracle Media Objects .
- SenseTalk — язык HyperSense на базе VNC , созданного NeXT, и инструмента тестирования Eggplant .
- SuperTalk — язык SuperCard , первого клона HyperCard, созданного Биллом Эпплтоном. Эпплтон также написал популярный конструктор приключений World Builder и HyperDA.
- Transcript (ранее revTalk и MetaTalk) — язык, реализованный в программной платформе LiveCode (ранее Revolution и MetaCard) и среде разработки. MetaCard была ранним клоном HyperCard, созданным на основе Unix, который работал на Classic Mac OS, Mac OS X, Windows, Linux и Solaris.
- XION — изначально язык клона HyperCard с открытым исходным кодом, который так и не был реализован. Теперь реализован как OpenXION .
- xTalk — после того, как Livecode прекратила разработку общественной версии Livecode, версия с открытым исходным кодом была разделена на то, что сейчас называется OpenXTalk . Этот форк находится в стадии разработки на веб-сайте openxtalk.org .
Эти клоны и диалекты (обычно называемые языками xTalk) добавили к языку различные функции, ожидаемые от современного языка программирования, такие как обработка исключений, определяемые пользователем свойства объектов, таймеры, многопоточность и даже пользовательская обработка исключений. определенные объекты.
Существуют также языки, синтаксис и структура которых демонстрируют влияние HyperTalk, например:
- ActionScript — язык сценариев для Adobe Flash .
- AppleScript — основной язык сценариев классической Mac OS от Apple, до сих пор поддерживаемый в macOS .
- Жаргон . Язык программирования Macromedia Director начинался с синтаксиса, подобного xTalk, хотя более поздние версии пошли в направлении, напоминающем JavaScript.
- JavaScript — язык сценариев, созданный Бренданом Эйхом , который обычно реализуется как часть веб-браузера для создания расширенных пользовательских интерфейсов и динамических веб-сайтов . [ 5 ] Позже он был обобщен и стандартизирован как ECMAScript .
Многие названия методов, впервые популяризированные HyperTalk, были включены в более поздние языки, например onmouseup
обработчик событий в JavaScript. [ 6 ] Хотя Asymetrix ToolBook часто также считают клоном HyperCard, его язык сценариев, по-видимому, мало похож на HyperTalk.
См. также
[ редактировать ]- Inform 7 - язык программирования с синтаксисом, похожим на английский.
Примечания
[ редактировать ]- ^ Которые, в свою очередь, могли загружаться из текстовых файлов.
Ссылки
[ редактировать ]- ^ Перейти обратно: а б Флинн, Лори (27 февраля 1989 г.). «Apple обдумывает стандартизацию HyperTalk» . Инфомир . п. 31.
- ^ Дэйв Келли, «Инструменты торговли: CompileIt! 2.0!» , MacTech , Vol. 7 № 9
- ^ Эрланд Соммарског и Фрэнк Калис, «Проклятие и благословения динамического SQL» , 23 июня 2011 г.
- ^ Роман Кнёлль, Вайдас Гасюнас, Мира Мезини, «Натуралистические типы» , Вперед! 2011: Материалы 10-го симпозиума SIGPLAN «Новые идеи, новые парадигмы и размышления о программировании и программном обеспечении» , стр. 33–48, октябрь 2011 г.
- ^ Эйх, Брендан (1998). «Предисловие». В Гудмане, Дэнни (ред.). Библия JavaScript (3-е изд.). Джон Уайли и сыновья . ISBN 0-7645-3188-3 . LCCN 97078208 . OCLC 38888873 . ОЛ 712205М .
- ^ Брендан Эйх, «Основной доклад Splash 2011, слайд 10»
Внешние ссылки
[ редактировать ]- Страницы Pantechnicon HyperTalk Wiki – справочник по языку HyperTalk (структуры управления, события, встроенные функции и т. д.)