TTM (język programowania) - TTM (programming language)

TTM
Paradygmat makro preprocesora
Zaprojektowany przez Steven M. Kent Caine E. Gordon
Po raz pierwszy pojawiły się 1968
Wersja stabilna
1.0 /
Licencja MIT
Ważniejsze realizacje
UniData TTM
Wpływem
TRAC

TTM jest ciągiem zorientowany, makro przetwarzania ogólnego przeznaczenia, język programowania opracowany w 1968 roku przez Stevena Caine i E. Kent Gordon w California Institute of Technology .

Opis

Poniższy opis pochodzi z oryginalnego podręcznika TTM i późniejsze rozszerzenie przetwarzania wsadowego.

TTM to rekurencyjny, język interpretacji przeznaczone głównie do manipulacji ciąg, edycji tekstu, makro definicji i ekspansji, i inne aplikacje zazwyczaj klasyfikowane jako programowania systemów. Pochodzi głównie z GAP i GPM.

Początkowo TTM została zaplanowana jako makro przetwarzania części asemblera dla Systemu / 360 IBM i, jako taki, został zaprojektowany w celu przezwyciężenia ograniczeń i niespójności, które istniały w standardowych monterów dla tego systemu.

Ponadto, został zaprojektowany, aby wszystkie siły posiadanej przez wcześniejsze ogólnych monterów makro, ale z niefortunnych składniowych i semantycznych trudności usunięte.

Podczas rozwoju TTM, okazało się, że aplikacje inne niż przetwarzanie asembler makro były możliwe. Należą edycji danych, manipulacji tekstu, wyraz kompilacji i makro dla przetwórców językowych innych niż monterów.

Wstępna wersja TTM został wdrożony do pracy w sposób konwersacji w ramach Systemu Udostępniania Caltech Podstawowe czas dla IBM System / 360, model 50 . Inne wersje zostały napisane do uruchomienia w środowisku przetwarzania wsadowego OS / 360 i do pracy przed lub w połączeniu z różnymi procesorami językowych.

Składnia i semantyka

Realizacja odniesienia zakłada, że TTM otrzymuje plik tekstowy zawierający pewną kombinację zwykłych wywołań funkcji tekst i TTM (tj wywołania). Tekst jest skanowany znak po znaku. Każdy zwykły tekst jest przekazywany do wyjścia niezmienionej (z wyjątkiem ucieczek ). Jeśli funkcja TTM napotkano, to jest zbierany i stracony.

Ogólna postać wywołania funkcji TTM wygląda następująco

#<functionname;arg1;arg2;...;argn>

gdzie nazwa funkcji i argumenty są dowolne ciągi znaków nie zawierające znaków znaczeniu: „#”, „<”, „>” i „;”. Funkcja jest wywoływana z określonymi argumentami i otrzymany tekst zostanie wstawiony do oryginalnego tekstu w miejscu wywołania funkcji. Jeśli wywołanie funkcji został poprzedzony pojedynczego znaku „#”, a następnie skanowanie zostanie wznowione po prostu przed wstawionego tekstu z wywołania funkcji.

Jest to tak zwany aktywny inwokacja.

Jeśli wywołanie funkcji został poprzedzony przez dwa znaki „#”, a następnie wznawia skanowanie tylko po wstawionego tekstu. Jest to tak zwany pasywny inwokacja.

Podczas zbierania wywołania funkcji, dodatkowe wywołania funkcji można spotkać na przykład ten.

#<functionname;arg1;#<f2;arg;...>;...;argn>

Zagnieżdżona wywołanie funkcji zostanie wywołany gdy napotkał a wynik wstawiony do tekstu zewnętrznego wywołania funkcji i skanowania zewnętrznego wywołania funkcji wznawia się w miejscu wskazanym przez liczbę „#” znaków poprzedzających zagnieżdżonego połączenia.

Jeśli funkcja przyjmuje, na przykład, 2 argumenty, wszelkie dodatki są ignorowane. Dla funkcji zdefiniowanych przez użytkownika, jeśli zbyt mało argumentów są przewidziane dodatkowe dodaje jeden z wartością ciąg pusty ( „”). Funkcja może mieć maksymalnie 62 argumentów.

Podobnie jak w innych językach programowania aplikacyjnych , funkcja TTM może być rekurencyjne i mogą być zdefiniowane jako wynik wezwaniem sekwencji innych wywołań funkcji.

Funkcje są albo wbudowane lub zdefiniowane przez użytkownika . Duża ilość wbudowanych funkcji istnieją i są określone w podręczniku TTM

definicja funkcji

Funkcje zdefiniowane przez użytkownika są tworzone przy użyciu dwóch wbudowanych funkcji.

  • # <DS; nazwisko; text>
  • # <Ss; nazwisko; text1; text2 ...; textn>

Pierwszą funkcją, DS dla „zdefiniować ciąg” definiuje nazwie ciąg w słowniku TTM. Nazwa jest „nazwa” i jego wartość jest „tekst”. Wywoływanie tej nazwie ciąg spowoduje jej wywołanie być zastąpione przez wartości (czyli „tekst”).

Druga funkcja, ss dla „string segment”, skanuje tekst uprzednio zdefiniowany ciąg zdarzeń szuka jej argumenty, text1 Text2, ... textn. Kiedy zdarzenie zostanie znaleziony, to zastąpiono znakiem segmentu . Wszystkie wystąpienia każdego argumentu są zastępowane przez tego samego znaku segmentu.

Kiedy łańcuch jest wywoływany na segmenty, każdy argument do rozmowy jest podstawiona przez odpowiednie oznaczenie segmentu. Rozważmy następujący przykład.

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

Ciąg F jest określona (linia 1) i jej ciało „abcxxdefyy” jest podzielony na dwa ciągi „XX” i „YY” (line2). Po wywołaniu (linia 3), zwróci wartość „abc11def22”. W efekcie mamy zdefiniowany przez użytkownika funkcja F z dwoma argumentami.

uciekając

Jest możliwe, aby uciec jeden lub więcej znaków za pomocą jednego z dwóch konwencjach.

  1. <...> - uciec wiele znaków.
  2. @ - uciec pojedynczego znaku

Jeśli ciąg jest zamknięty w <...>, to jest skanowany ale nie interpretowane przez TTM. W trakcie skanowania zewnętrzne <i>, wsporniki są usuwane. Jeśli są zagnieżdżone wystąpienia <...>, a następnie są one skanowane ale <i> nie są usuwane. Wsporniki muszą równoważyć: liczbę „<” znaków musi być równa liczbie znaków „>”.

Znakiem „@” konwencja ucieczka powoduje interpreter przekazać jak jest postać po „@”. Wiodącym „@” jest pozostawiony jeśli w <...> sekwencji ucieczki, w przeciwnym razie jest on usuwany. Jednym z zastosowań jest umożliwienie niesymetryczne wystąpienia znaków „<” lub „>”.

Przykłady

Przykład 1: Definicja funkcji

Najbardziej podstawowym przykładem obejmuje definiowanie funkcji, które są przydatne do określenia dodatkowych funkcji. Funkcja „meta” nazywa def . Jest napisany jako:

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

Możemy na przykład użyć def zdefiniować ciąg XX jako 12345, a następnie na 34 segmentów XX pisząc to.

#<def;XX;34;12345>

Telefon

#<XX;0000>

następnie wytwarzają ciąg „1200005”.

Def funkcja działa poprzez wywoływanie ds zdefiniować nazwę funkcji i początkowy tekst w TTM słownika - XX w naszym przykładzie.

Następnie tekst słowniku wpisu XX jest podzielony w odniesieniu do wszelkich podanych argumentów: „34” w tej sprawie.

Gdy X X jest wywoływana jego argument zastępować oznaczenia segmentów.

Przykład 2: czynnikowa

Funkcja silnia można zdefiniować (z użyciem ponad ## <pok> funkcji) w następujący sposób.

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

Zauważ, że wewnętrzna obliczeń (# <ul ...) jest uciekł więc będzie ocenić dopiero po # <lt ... funkcji jest wykonywany i zwraca zagnieżdżony obliczenia jej wyniku.

Przykładem połączenia będzie wyglądać następująco.

#<n!;3>

i zwróci ciąg 6.

Zobacz też

Dokładna relacja między TTM i TRAC jest nieznany. Dokumentacja TTM wskazuje, że została ona pochodzić z GAP i GPM. W każdym razie, opis cech TRAC stosuje się również do TTM. Jednak poprzez usunięcie składniowej rozróżnienie wbudowanych i funkcji zdefiniowanych przez użytkownika, TTM wydaje się być znacznie bardziej przejrzysty język.

Uwagi

Referencje

  • Greenwald, ID i Kane, M, udział 709 System: Programowanie i modyfikacji. JACM 6 nr 2 (1959). ss. 128-133.
  • Greenwald, ID, Handling Macro instrukcje. CACM 2, nr 11 (1959), 21-22.
  • Remington Rand UNIVAC Division, UNIVAC Programowanie uogólnione. Philadelphia, 1957.
  • McIlroy, MD, korzystanie z SAP Macro instrukcje do manipulowania symbolicznych wyrażeń. Bell Telephone Laboratories Centrum Obliczeniowe (1960).

Linki zewnętrzne