Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

TTM - это строковый язык программирования общего назначения для обработки макросов, разработанный в 1968 году Стивеном Кейном и Э. Кентом Гордоном из Калифорнийского технологического института .

Описание [ править ]

Следующее описание взято из исходного справочного руководства TTM [1] и последующего расширения пакетной обработки. [2]

TTM - это рекурсивный интерпретирующий язык, разработанный в первую очередь для обработки строк, редактирования текста, определения и расширения макросов и других приложений, обычно классифицируемых как системное программирование. Это происходит, прежде всего, из GAP [3] и GPM. [4]

Первоначально TTM планировалась как часть обработки макросов ассемблера для IBM System / 360 и, как таковая, была разработана для преодоления ограничений и несоответствий, которые существовали в стандартных ассемблерах для этой системы. [5] [6]

Кроме того, он был разработан, чтобы иметь все возможности, которыми обладали более ранние общие макроассемблеры, но с устранением прискорбных синтаксических и семантических трудностей. [7] [8] [9] [10]

Во время разработки TTM стало очевидно, что возможны приложения, отличные от обработки макросов на ассемблере. К ним относятся редактирование данных, манипуляции с текстом, компиляция выражений и обработка макросов для языковых процессоров, отличных от ассемблеров.

Первоначальная версия TTM была реализована для работы в диалоговом режиме в базовой системе разделения времени Caltech для IBM System / 360 Model 50 . [11] Другие версии были написаны для работы в среде пакетной обработки OS / 360 и для работы перед процессорами различных языков или совместно с ними.

Синтаксис и семантика [ править ]

Эталонная реализация предполагает, что TTM предоставляется текстовый файл, содержащий некоторую комбинацию обычного текста и вызовов функций TTM (т. Е. Вызовов). Текст сканируется посимвольно. Любой обычный текст передается на вывод без изменений (кроме escape-символов ). Если встречается функция TTM, она собирается и выполняется.

Общая форма вызова функции TTM выглядит так

# <имя функции; аргумент1; аргумент2; ...; аргумент>

где имя функции и аргументы представляют собой произвольные символьные строки, не содержащие значимых символов: '#', '<', '>' и ';'. Функция вызывается с указанными аргументами, и полученный текст вставляется в исходный текст вместо вызова функции. Если перед вызовом функции стоит один символ «#», сканирование возобновится непосредственно перед вставленным текстом из вызова функции.

Это называется активным вызовом.

Если перед вызовом функции стояли два символа «#», сканирование возобновляется сразу после вставленного текста. Это называется пассивным обращением.

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

# <имя функции; аргумент1; # <f2; аргумент; ...>; ...; аргумент>

Вызов вложенной функции будет вызван при обнаружении, и результат будет вставлен в текст вызова внешней функции, и сканирование вызова внешней функции возобновится в месте, указанном числом символов '#', предшествующих вложенному вызову.

Если функция принимает, например, 2 аргумента, любые дополнения игнорируются. Для пользовательских функций, если предоставлено слишком мало аргументов, добавляется дополнительный со значением пустой строки (""). Функция может иметь максимум 62 аргумента.

Как и в других прикладных языках программирования , функция TTM может быть рекурсивной и может быть определена как результат вызова последовательности других вызовов функций.

Функции могут быть встроенными или определяемыми пользователем . Существует большое количество встроенных функций, которые описаны в справочном руководстве TTM [1].

Определение функции [ править ]

Пользовательские функции создаются с использованием следующих двух встроенных функций.

  • # <ds; имя; текст>
  • # <ss; имя; текст1; текст2 ...; текстn>

Первая функция, ds для «определения строки», определяет именованную строку в словаре TTM. Имя - «имя», а его значение - «текст». Вызов этой именованной строки приведет к тому, что ее вызов будет заменен значением (то есть «текстом»).

Вторая функция, ss для "строки сегмента", просматривает текст ранее определенной строки в поисках вхождений ее аргументов: text1, text2, ... textn. Когда вхождение найдено, оно заменяется меткой сегмента . Все вхождения каждого аргумента заменяются одной и той же меткой сегмента.

Когда вызывается сегментированная строка, каждый аргумент вызова заменяется соответствующей меткой сегмента. Рассмотрим этот пример.

[01] # <ds; F; abcxxdefyy>[02] # <ss; F; xx; yy>[03] # <F; 11; 22>

Строка F определена (строка 1), а ее тело «abcxxdefyy» сегментировано на две строки «xx» и «yy» (строка2). При вызове (строка 3) он вернет значение «abc11def22». По сути, у нас есть определяемая пользователем функция F с двумя аргументами.

Побег [ править ]

Можно экранировать один или несколько символов, используя одно из двух соглашений.

  1. <...> - экранировать несколько символов.
  2. @ - экранировать одиночный символ

Если строка заключена в <...>, то она просматривается, но не интерпретируется TTM. В процессе сканирования внешние скобки <и> удаляются. Если есть вложенные вхождения <...>, то они сканируются, но <и> не удаляются. Скобки должны быть сбалансированы: количество символов «<» должно равняться количеству символов «>».

Соглашение об экранировании '@' заставляет интерпретатор передавать как есть символ после '@'. Ведущий '@' остается, если он находится в escape-последовательности <...>, в противном случае он удаляется. Одно из применений - разрешить несбалансированное вхождение символов «<» или «>».

Примеры [ править ]

Пример 1: Определение функции [ править ]

Самый простой пример включает определение функции, которая полезна для определения дополнительных функций. Эта «мета» функция называется def . Он записывается как:

# <ds; def; <## <ds; name; <text>>; ## <ss; name; subs >>># <ss; def; name; subs; text>

Мы можем, например, использовать def, чтобы определить строку XX как 12345, а затем сегмент XX на 34, записав это.

# <def; XX; 34; 12345>

Звонок

# <XX; 0000>

тогда будет получена строка «1200005».

Функция def работает путем вызова ds для определения имени функции и начального текста в словаре TTM - XX в нашем примере.

Затем текст словарной статьи XX сегментируется по любым указанным аргументам: в данном случае «34».

Когда вызывается XX, его аргумент заменяется меткой сегмента.

Пример 2: Факториал [ править ]

Факториальную функцию можно определить (используя указанную выше функцию ## <def> ) следующим образом.

# <def; n!; N; <# <lt; N; 2; 1; <# <mu; N; # <n!; # <su; N; 1 >>>>>>>

Обратите внимание, что внутреннее вычисление (# <mu ...) экранировано, поэтому оно будет оцениваться только после того, как функции # <lt ... будут выполнены и вернут это вложенное вычисление в качестве результата.

Пример вызова мог бы выглядеть так.

# <п!; 3>

и вернет строку 6.

См. Также [ править ]

Точная связь между TTM и TRAC неизвестна. В документации TTM указано, что он был получен из GAP [3] и GPM. [4] В любом случае описание характеристик TRAC применимо и к TTM. Однако, удалив синтаксическое различие между встроенной и определяемой пользователем функцией, TTM станет гораздо более чистым языком.

Заметки [ править ]

  1. ^ a b Каин, SH; Гордон, EK (1968). «TTM: экспериментальный интерпретирующий язык» (PDF) . Калифорнийский технологический институт, вычислительный центр Уиллиса Х. Бут, Отчет о программировании № 7.
  2. ^ Каин, SH; Гордон, EK (май 1969). «TTM: макроязык для пакетной обработки» (PDF) . Калифорнийский технологический институт, Вычислительный центр Уиллиса Х. Бут, Отчет о программировании № 8.
  3. ^ a b Фарбер, DJ, Система сборки 635 - GAP. Вычислительный центр Bell Telephone Laboratories (1964).
  4. ^ a b Стрейчи, К., Генератор макросов общего назначения. Comput J 8, 3 (1965), стр. 225-241.
  5. ^ IBM, Язык ассемблера System / 360, C28-6514-4, (1967).
  6. Caine, SH и др., Отчет Комитета по системным целям и требованиям, SHARE, 1965, стр. 29-40.
  7. ^ Иствуд, DE и Макилрой, доктор медицины , Macro Compiler Modification of SAP. Компьютерный центр Bell Telephone Laboratories, 1959.
  8. ^ МакКлюр, RM, описание CODAPT Assembler, 1960.
  9. ^ Caine, SH, Справочное руководство для экспериментальной программы сборки макросов CIT 7090/7040 (XMAP). Калифорнийский технологический институт, вычислительный центр Уиллиса Х. Бут (1964).
  10. ^ Макилрой, доктор медицины , Макро-инструкции расширений языков компилятора. CACM 3, No. 4 (1960), 214-220.
  11. ^ Caine, SH и др., Операционная среда для исследования программирования. Калифорнийский технологический институт, Отчет о программировании вычислительного центра Уиллиса Х. Бута № 1, 1967.

Ссылки [ править ]

  • Гринвальд, И.Д. и Кейн, М., Система Share 709: программирование и модификация. JACM 6 № 2 (1959). С. 128–133.
  • Гринвальд, И. Д., Обработка макросов. CACM 2, No. 11 (1959), 21-22.
  • Ремингтон Рэнд Отделение UNIVAC, Универсальное программирование UNIVAC. Филадельфия, 1957 год.
  • Макилрой, доктор медицины , Использование макросов SAP для управления символьными выражениями. Вычислительный центр Bell Telephone Laboratories (1960).

Внешние ссылки [ править ]

  • Эталонная реализация языка программирования TTM на GitHub .