stringtranslate.com

ГиперТок

HyperTalk — высокоуровневый процедурный язык программирования , выпуск которого прекращен, созданный в 1987 году Дэном Винклером и используемый Биллом Аткинсоном совместно с гипермедийной программой Apple Computer HyperCard . Поскольку основной целевой аудиторией HyperTalk были начинающие программисты, программистов HyperTalk обычно называли «авторами», а процесс написания программ называли « написанием сценариев ». Сценарии HyperTalk напоминали письменный английский язык и использовали логическую структуру, аналогичную структуре языка программирования Паскаль .

HyperTalk поддерживал базовые структуры управления процедурных языков : повторение для/пока/пока, если/то/иначе, а также вызовы «обработчиков» функций и сообщений (обработчик функции представлял собой подпрограмму, а обработчик сообщений — процедуру). Типы данных обычно не требовалось указывать программисту; преобразование между строками и числами происходило прозрачно в фоновом режиме . Не было классов или структур данных в традиционном смысле; на их месте были специальные строковые литералы , или «списки» «элементов», разделенные запятыми (в более поздних версиях свойство «itemDelimiter» позволяло выбирать произвольный символ). Выполнение кода обычно начинается в ответ на такое событие, как щелчок мышью по виджету пользовательского интерфейса.

В конце 1980-х годов Apple рассматривала [1] использование языка сценариев HyperTalk компании HyperCard в качестве стандартного языка для всей компании и в своей классической операционной системе 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. Свойство script содержало обычный текст и не имело специальных свойств; сценарии можно размещать и запускать из любого текстового контейнера, включая строковые переменные, [a] или импортировать из других стеков с помощью этой start usingкоманды. Сценарий может даже представлять собой предоставленный пользователем текст, введенный в текстовое поле на экране. С помощью этой команды можно выполнить произвольный текст do, аналогично динамическому SQL. [3]

Обращение к контейнерам

Ключевой концепцией HyperTalk был способ обращения к контейнерам через систему навигации, основанную на визуальной иерархии стека. Каждому контейнеру в стеке при создании присваивался уникальный идентификационный номер, а также ему можно было дать необязательное имя. Скрипты могут ссылаться на объекты, используя любой из этих идентификаторов, а также тип объекта , указанный с помощью ofоператора. Этот оператор использовал синтаксис естественного языка, что позволило создать легко читаемый и самодокументируемый код . Например, сценарий, хранящийся в кнопке на карточке, может взять введенный пользователем текст, собранный с помощью текстового поля, и сохранить его в переменной с именем theValue :

 поместите  значение  поля  карты « typehere  » в значение    

Переводчик может вывести различные контекстуальные аспекты высказываний. Например, в приведенном выше утверждении, поскольку сценарий будет выполняться в контексте кнопки на конкретной карте, карточка-идентификатор понималась как ссылка на карту, с которой взаимодействовал пользователь, даже если сама кнопка обычно была нажата. фон. Кроме того, « значение » (текст, отправленный пользователем) считалось основным свойством и целью операций, если не указано иное. Аналогично, предполагалось, что целью команды является « поле карты », а не фоновое поле, так что информацию также можно было опустить. Даже у типов контейнеров были короткие формы, которые программисты могли использовать, чтобы не печатать. Таким образом, приведенный выше код эквивалентен более короткой форме:

 поместите  fld  «typehere»  в  значение

Объектам в данном контексте — например, карточке или фону — также присваивался номер времени выполнения, основанный на их z-порядке на экране. Чтобы помочь использовать их положение для навигации, HyperTalk также включил множество порядковых и кардинальных систем ссылок для дальнейшего упрощения синтаксиса. Предполагая, что поле «typehere» является единственным полем на карточке, приведенный выше код также можно написать:

 поместите  первое  поле карты в значение    

или:

 поместите  поле карты  1 в значение   

Выбор стиля адресации оставался за программистом; часто в разных операторах использовались разные стили, чтобы сделать код более читабельным.

HyperTalk включал meконтейнер, который действовал так же, как selfквалификатор в большинстве объектно-ориентированных языков , обеспечивая простой доступ к текущему объекту-контейнеру. Менее распространенной была itпеременная, которая хранила значение последней операции для некоторых встроенных операторов. Например:

 спросите  : «Какова ценность?»  поместите  его  в  поле карточки  «отображение» 

использует askкоманду для отображения диалогового окна и захвата текста, введенного в соответствующее текстовое поле; когда диалоговое окно завершается нажатием Returnили нажатием , псевдопеременной присваивается значение . Затем этот код копирует это значение в поле карточки с помощью оператора присваивания.OKitput

Коллекции

Контейнеры определенного типа также были доступны в виде коллекций с версией этого типа контейнера во множественном числе в качестве имени — коллекция полей на карточке была card fields. Эти коллекции сами по себе были контейнерами со своими свойствами. Ключевым среди них было numberсвойство, которое широко использовалось во время итераций и подобных задач. Например, если кто-то хочет скрыть все поля на карточке, это можно сделать с помощью этого кода:

 повторить  с  i  =  1  до  количества  полей карточки скрыть поле i завершить повтор        

Этот код демонстрирует еще одну общую особенность HyperTalk: свойство может иметь несколько имен и операторов. В этом случае hideкоманда и связанный с ней объект showдействуют, устанавливая значение свойства контейнера visible. Таким образом hide field i, в точности эквивалентно . Аналогичным примером была команда, останавливающая визуальное обновление, которая представляла собой короткую форму для , где — свойство самой HyperCard — также контейнера. В HyperTalk было найдено множество примеров такого рода синтаксического сахара , предназначенного для упрощения синтаксиса и улучшения читаемости общего кода.set the visible of field i to falselock screenset the lockscreen to truelockscreen

В HyperCard 2.2 и более поздних версиях коллекция коллекций также была доступна в виде контейнера parts. Это позволило сценарию обращаться ко всем объектам в контейнере с помощью одного итератора.

Обработка текста

Примечательной особенностью модели контейнера HyperTalk была обработка текста. Каждая коллекция текста, будь то литеральная строка в программе или текст, введенный в текстовое поле, сама по себе считалась контейнером с несколькими коллекциями контейнеров внутри него. Это позволило сценариям анализировать текст, используя те же навигационные команды, что и любой другой контейнер. Например, при анализе файла данных, разделенных пробелами, может потребоваться извлечь третий столбец, например:

 поместите  третье  слово FilesText в colThree     

Этот синтаксис позволял сценарию «проходить» по тексту в поисках определенных данных, как в этом примере:

 поместите  первый  символ третьего слова строки 5 поля карты « sometext » в theChar              

Этот процесс обработки текста как контейнера был известен как «фрагментирование», а функции — как «фрагментные выражения». Эти же выражения использовались для манипулирования файлами, а также для набора функций управления файлами. Следующий код открывает известный файл, читает из него, извлекает данные, а затем закрывает файл:

 в  файле ответов mouseDown  «Пожалуйста, выберите текстовый файл для открытия». если он пуст , выйдите из mouseDown , поместите его в filePath , если есть файл FilePath , затем откройте файл FilePath , прочитанный из файла FilePath до возврата , поместите его в cd fld « какое - то поле» закройте файл FilePath , установите textStyle символов от 1 до 10 поля карты «некоторое поле» выделено жирным шрифтом , если заканчивается mouseDown                                                        

HyperTalk также включил функции для разделения строк с помощью операции поиска подстроки с использованием inоператора. Следующий код находит все примеры заданного шаблона, используя as inчасть цикла repeat, а также offsetнаходит расположение этого шаблона в строке:

 функция  replaceStr  шаблон , newStr , inStr  повторять  , пока  шаблон  находится в  inStr,  помещать  смещение ( шаблон , inStr )  в  позицию,  помещать newStr  в  позицию  символа ,  чтобы ( поз. + длина шаблона ) - 1 из inStr, конец повтора , возврат inStr , конец replaceStr              

Списки и другие коллекции

HyperTalk использовал ту же систему фрагментирования для создания таких структур, как массивы или списки. Такая структура будет создана путем помещения нескольких элементов данных в переменную, разделенных запятыми. Различные типы данных можно было импортировать в сценарий HyperTalk, используя строки, которые будут анализироваться по мере необходимости. Например, положение объектов на экране определялось парой чисел, представляющих координаты X и Y относительно левого верхнего угла. Следующий код создает переменную с именем pos , которая содержит пару координат, а затем манипулирует ею, чтобы переместить все кнопки на карточке по диагонали от верхнего левого угла к нижнему правому:

 в  mouseUp  поместите  « 100,100  » в  позицию  повторения  с  x  =  1  к  количеству  кнопок  карты  установите расположение кнопки карты x в позицию добавьте  15 к элементу 1 позиции конец повтора конец mouseUp                    

Выражение фрагментации itemизначально было основано на разделителе-запятой , но более поздние версии HyperCard изменили его на значение itemDelimiter, предлагая возможность анализировать произвольные списки и структуры.

Сообщения и события

HyperTalk использовал объектно-ориентированную концепцию для вызова сценариев, при этом объекты в стеке отправляли «события» в виде сообщений , которые обрабатывались обработчиками , заявлявшими о своей заинтересованности в получении событий с использованием onсинтаксиса. Например, большинство контейнеров с графическим интерфейсом отправляют mouseDownсообщение при нажатии кнопки мыши, а затем сообщение, mouseUpкогда она отпускается, находясь поверх этого контейнера, и сценарий может фиксировать эти события следующим образом:

 on  mouseUp  — поместите сюда дополнительный код,  конец  mouseUp

Сообщения о событиях сначала отправлялись сценарию в объекте, создавшем событие, например, если пользователь нажимал кнопку, сообщение mouseUpсначала отправлялось на эту кнопку. Если у объекта сценария кнопки не было mouseUpобработчика (или вообще не было сценария), он затем передавался на карту, фон, стек, любые стеки, сценарии которых были явно импортированы с помощью команды start using, «домашний стек» ( всегда открытый стек HyperCard, выбранный пользователем), и, наконец, к самому приложению HyperCard.

Для многих простых событий, таких как щелчки мышью по кнопкам, скрипт будет помещен непосредственно внутри рассматриваемого объекта, то есть самой кнопки. Например, можно использовать приведенный выше пример кода в обработчике кнопки следующим образом:

 при  mouseUp  повторить  с  i  =  1  до  количества  полей карточки скрыть поле i end повторить end mouseUp          

В случае, когда код вызывался из нескольких мест или использовался в качестве глобального обработчика события, сценарий мог определить исходного отправителя события с помощью этой targetфункции. Аналогично, сценарии могут отправлять события в другие контейнеры с помощью sendкоманды, а затем с помощью кода навигации обращаться к контейнеру, содержащему код этого обработчика:

 отправить  «mouseUp»  на кнопку  карты «  ОК» карты «Правдивость»    

Сочетание обработки строк HyperTalk с doкомандой позволило создать интерактивные интерпретаторы путем размещения текстового поля на карточке, а затем размещения этого кода в сценарии поля:

 при  mouseUp  выберите  строку  clickLine  , поместите  слово  2  строки  clickLine  в linenum , сделайте строку linenum из cd fld 1 , завершите mouseUp           

clickLine— это глобальное свойство, которое возвращает имя и номер строки последнего поля, на которое щелкнули мышью, в форме типа . Этот код сначала выделяет весь текст в выбранной строке, затем извлекает номер строки в локальную переменную, а затем использует текст для запуска в качестве сценария HyperCard.line 10 of card field 4do

Сообщение 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 endclick at position

Прощающая семантика

Одним из уникальных различий между языком программирования HyperTalk HyperTalk и, казалось бы, похожими языками, такими как AppleScript, было то, что сценарии HyperTalk были более снисходительны в отношении принимаемых входных данных.

Помимо приведенного выше неявного объявления переменных, когда им присваивалось значение, и способа неявного преобразования значений между типами (что позволяет, например, запрашивать character 2 of 1234), HyperCard также распознает определенные выражения и извлекает из них подзначения.

Например:

поместите  выбранную  строку  поля  карты  « Listbox» в поле «  Выбор» - дает «строки 2–3 поля карты «Listbox»» выберите строку 1 поля карты «Listbox» выберите строку ( слово 2 в поле « Выбор ») поля карты « Listbox» выберите ( поле выбранной строки карты «Listbox» ) — круглые скобки добавлены только в иллюстративных целях .                         

или

сыграй  на клавесине  c  e  g сыграй  на клавесине  "ce g" вставь  "ce g"  в  theMelody сыграй  на клавесине  theMelody

Хотя конечный результат показался сценаристам похожим на расширение переменных в сценарии Bash перед синтаксическим анализом, это был синтаксис особого случая и не было ловушек, при которых данные могли бы оцениваться как код. Так, например, все следующее является синтаксическими ошибками в мелодии, а не вызовами функций:

сыграй  на клавесине  "ceg()" вставь  "ce() g"  в  theMelody сыграй  на клавесине  theMelody

Расширение HyperTalk

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

Потомки HyperTalk

Various scripting languages have implemented a superset of HyperTalk (collectively known as xTalk):[4]

These clones and dialects (commonly referred to under the moniker of xTalk-languages) added various features to the language that are expected from a modern programming language, like exception handling, user-defined object properties, timers, multi-threading and even user-defined objects.

There are also languages whose syntax and structure show influences from HyperTalk, such as:

Многие имена методов, впервые популяризированные HyperTalk, были включены в более поздние языки, например, onmouseupобработчик событий в JavaScript. [6] Хотя Asymetrix ToolBook часто считают клоном HyperCard, его язык сценариев, очевидно, мало похож на HyperTalk.

Смотрите также

Примечания

  1. ^ Которые, в свою очередь, могли загружаться из текстовых файлов.

Рекомендации

  1. ^ Аб Флинн, Лори (27 февраля 1989 г.). «Apple обдумывает стандартизацию HyperTalk». Инфомир . п. 31.
  2. ^ Дэйв Келли, «Инструменты торговли: CompileIt! 2.0!», MacTech , Vol. 7 № 9
  3. ^ Эрланд Соммарског и Фрэнк Калис, «Проклятие и благословения динамического SQL», 23 июня 2011 г.
  4. ^ Роман Кнёлль, Вайдас Гасюнас, Мира Мезини, «Натуралистические типы», Вперед! 2011: Материалы 10-го симпозиума SIGPLAN «Новые идеи, новые парадигмы и размышления о программировании и программном обеспечении» , стр. 33–48, октябрь 2011 г.
  5. ^ Эйх, Брендан (1998). «Предисловие». В Гудмане, Дэнни (ред.). Библия JavaScript (3-е изд.). Джон Уайли и сыновья . ISBN 0-7645-3188-3. LCCN  97078208. OCLC  38888873. ОЛ  712205М.
  6. ^ Брендан Эйх, «Основной доклад Splash 2011, слайд 10»

Внешние ссылки