ТТМ (язык программирования)
![]() | Тон или стиль этой статьи могут не отражать энциклопедический тон , используемый в Википедии . ( декабрь 2012 г. ) |
Парадигма | макропроцессор общего назначения |
---|---|
Разработано | Стивен М. Кейн и Э. Кент Гордон |
Впервые появился | 1968 |
Стабильная версия | 1.0
|
Лицензия | С |
Основные реализации | |
Юнидата ТТМ | |
Под влиянием | |
ГАП, ГПМ, ПРОФ |
TTM — это строковый общего назначения для обработки макросов, язык программирования разработанный в 1968 году Стивеном Кейном и Э. Кентом Гордоном в Калифорнийском технологическом институте .
Описание
[ редактировать ]Следующее описание взято из оригинального справочного руководства TTM. [1] и последующее расширение пакетной обработки. [2]
TTM — это рекурсивный интерпретирующий язык, предназначенный в первую очередь для манипулирования строками, редактирования текста, определения и расширения макросов, а также для других приложений, обычно классифицируемых как системное программирование. Это производное от GAP [3] и ГПМ. [4]
Первоначально TTM планировался как часть ассемблера для обработки макросов для IBM System/360 и был разработан для преодоления ограничений и несоответствий, существовавших в стандартных ассемблерах для этой системы. [5] [6]
TTM был разработан, чтобы обладать всеми возможностями, которыми обладали более ранние общие макроассемблеры, но с устранением досадных синтаксических и семантических трудностей. [7] [8] [9] [10]
Во время разработки TTM стало очевидно, что возможны и другие приложения, помимо обработки макросов на ассемблере. К ним относятся редактирование данных, манипулирование текстом, компиляция выражений и обработка макросов для языковых процессоров, отличных от ассемблеров.
Первоначальная версия TTM была реализована для работы в диалоговом режиме в рамках базовой системы разделения времени Калифорнийского технологического института для IBM System/360 Model 50 . [11] Другие версии были написаны для работы в среде пакетной обработки OS/360 и для работы совместно с различными языковыми процессорами.
Синтаксис и семантика
[ редактировать ]Эталонная реализация предполагает, что TTM предоставляется текстовый файл, содержащий некоторую комбинацию обычного текста и вызовов функций TTM (т. е. вызовов). Текст сканируется посимвольно. Любой обычный текст передается на вывод без изменений (за исключением escape-символов ). Если встречается функция TTM, она собирается и выполняется.
Общая форма вызова функции TTM выглядит следующим образом:
#<functionname;arg1;arg2;...;argn>
где имя функции и аргументы представляют собой произвольные строки символов, не содержащие значимых символов: '#', '<', '>' и ';'. Функция вызывается с указанными аргументами, и полученный текст вставляется в исходный текст вместо вызова функции. Если перед вызовом функции был одиночный символ «#», сканирование возобновится непосредственно перед вставленным текстом из вызова функции.
Это называется активным вызовом.
Если перед вызовом функции стояли два символа «#», сканирование возобновляется сразу после вставленного текста. Это называется пассивным вызовом.
При сборе вызова функции могут встретиться дополнительные вызовы функций, например такой:
#<functionname;arg1;#<f2;arg;...>;...;argn>
Вызов вложенной функции будет вызван при обнаружении, и результат будет вставлен в текст вызова внешней функции, а сканирование вызова внешней функции продолжится в месте, указанном количеством символов «#», предшествующих вложенному вызову.
Если функция принимает, например, 2 аргумента, любые дополнительные аргументы игнорируются. Для пользовательских функций, если предоставлено слишком мало аргументов, добавляется дополнительный со значением пустой строки (""). Функция может иметь максимум 62 аргумента.
Как и в других прикладных языках программирования , функция TTM может быть рекурсивной и может определяться как результат вызова последовательности вызовов других функций.
Функции могут быть встроенными или определяемыми пользователем . Существует большое количество встроенных функций, которые определены в справочном руководстве TTM. [1]
Определение функции
[ редактировать ]Пользовательские функции создаются с использованием следующих двух встроенных функции.
- #<ds;имя;текст>
- #<сс;имя;текст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 с двумя аргументами.
Побег
[ редактировать ]Можно экранировать один или несколько символов, используя любой из двух конвенции.
- <...> – экранирование нескольких символов.
- @ – экранировать один символ
Если строка заключена в <...>, то она сканируется, но не интерпретируется 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... выполняется и возвращает это вложенное вычисление в качестве результата.
Пример вызова будет выглядеть так.
#<n!;3>
и вернет строку 6.
См. также
[ редактировать ]Точная связь между TTM и TRAC неизвестна. В документации TTM указано, что она была получена на основе GAP. [3] и ГПМ. [4] В любом случае описание характеристик ПРОФ относится и к ТТМ. Однако если убрать синтаксическое различие между встроенными и определяемыми пользователем функциями, TTM окажется гораздо более чистым языком.
Примечания
[ редактировать ]- ^ Jump up to: Перейти обратно: а б Кейн, Ш.; Гордон, ЭК (1968). «ТТМ: экспериментальный язык интерпретации» (PDF) . Калифорнийский технологический институт, Вычислительный центр Уиллиса Х. Бута, Отчет о программировании № 7.
В данную статью включен текст из этого источника, находящегося в свободном доступе .
- ^ Кейн, Ш.; Гордон, EK (май 1969 г.). «TTM: язык макросов для пакетной обработки» (PDF) . Калифорнийский технологический институт, Вычислительный центр Уиллиса Х. Бута, Отчет о программировании № 8.
В данную статью включен текст из этого источника, находящегося в свободном доступе .
- ^ Jump up to: Перейти обратно: а б Фарбер, DJ, Система сборки 635 — GAP. Вычислительный центр Bell Telephone Laboratories (1964).
- ^ Jump up to: Перейти обратно: а б Стрейчи, К., Макрогенератор общего назначения. Comput J 8, 3 (1965), стр. 225–241.
- ^ IBM, Язык ассемблера System/360, C28-6514-4, (1967).
- ^ Кейн, С.Х. и др., Отчет Комитета по системным целям и требованиям, SHARE, 1965, стр. 29-40.
- ^ Иствуд, DE и Макилрой, доктор медицинских наук , Модификация макрокомпилятора SAP. Вычислительный центр Bell Telephone Laboratories, 1959 год.
- ^ МакКлюр, Р.М., Описание ассемблера CODAPT, 1960.
- ^ Кейн, С.Х., Справочное руководство для программы экспериментальной сборки макросов CIT 7090/7040 (XMAP). Калифорнийский технологический институт, Вычислительный центр Уиллиса Х. Бута (1964).
- ^ Макилрой, доктор медицинских наук , Расширения макроинструкций языков компилятора. CACM 3, № 4 (1960), 214–220.
- ^ Кейн, С.Х. и др., Операционная среда для исследований в области программирования. Калифорнийский технологический институт, Отчет о программировании вычислительного центра Уиллиса Х. Бута № 1, 1967 г.
Ссылки
[ редактировать ]- Гринвальд, И.Д. и Кейн, М., Система Share 709: программирование и модификация. JACM 6 № 2 (1959). стр. 128–133.
- Гринвальд, И.Д., Обработка макроинструкций. CACM 2, № 11 (1959), 21–22.
- Подразделение Remington Rand UNIVAC, Универсальное программирование UNIVAC. Филадельфия, 1957 год.
- Макилрой, доктор медицинских наук , Использование макросов SAP для управления символическими выражениями. Вычислительный центр Bell Telephone Laboratories (1960).