Jump to content

ГиперТок

(Перенаправлено с XCMD )
ГиперТок
Парадигма процедурный , управляемый событиями
Разработано Дэн Винклер
Разработчик Эппл Компьютер Инк.
Впервые появился 1987  ( 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, например:

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

См. также

[ редактировать ]
  • Inform 7 - язык программирования с синтаксисом, похожим на английский.

Примечания

[ редактировать ]
  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»
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: bd89b31ec9a9cb4e9e2a4e0e55647a51__1722036480
URL1:https://arc.ask3.ru/arc/aa/bd/51/bd89b31ec9a9cb4e9e2a4e0e55647a51.html
Заголовок, (Title) документа по адресу, URL1:
HyperTalk - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)