MAD (język programowania)
Paradygmat | Pilny |
---|---|
Deweloper | Gallera, Ardena i Grahama |
Po raz pierwszy pojawiły się | 1959 |
system operacyjny | UMES , MTS , CTSS , inne |
Główne implementacje | |
IBM 704 , IBM 7090 , UNIVAC 1108 , Philco 210-211, IBM S/360 i IBM S/370 | |
Dialekty | |
MAD, MAD/I, GOM | |
Pod wpływem | |
IAL , ALGOL 58 |
MAD ( Michigan Algorithm Decoder ) to język programowania i kompilator dla IBM 704 , a później IBM 709 , IBM 7090 , IBM 7040 , UNIVAC 1107 , UNIVAC 1108 , Philco 210-211 i ostatecznie IBM S/370 komputery typu mainframe. Opracowany w 1959 roku na Uniwersytecie Michigan przez Bernarda Gallera , Bruce'a Ardena i Roberta M. Grahama , MAD jest odmianą języka ALGOL . Był powszechnie używany do nauczania programowania na uczelniach wyższych w latach 60. XX wieku i odegrał niewielką rolę w rozwoju komputerowych systemów operacyjnych CTSS , Multics i Michigan Terminal System . Oryginalna wersja chatbota ELIZA została napisana w MAD-SLIP .
Archiwa w Bibliotece Historycznej Bentley na Uniwersytecie Michigan zawierają materiały referencyjne dotyczące rozwoju MAD i MAD/I, w tym trzy stopy liniowych wydruków z odręcznymi notatkami i oryginalnymi drukowanymi podręcznikami.
MAD, MAD/I i GOM
Istnieją trzy kompilatory MAD:
- Oryginalny MAD , kompilator opracowany w 1959 roku na Uniwersytecie Michigan dla komputerów mainframe IBM 704 , a później IBM 709 i IBM 7090 z systemem operacyjnym University of Michigan Executive System (UMES) i kompatybilnym systemem podziału czasu (CTSS) . W połowie lat sześćdziesiątych MAD został przeniesiony na University of Maryland do UNIVAC 1108 . Wersje MAD były również dostępne dla Philco 210-211 i UNIVAC 1107 .
- MAD / I , „rozszerzona” wersja MAD dla serii komputerów IBM System / 360 działających pod systemem Michigan Terminal System (MTS). Prace nad nowym kompilatorem rozpoczęły się w 1965 roku w ramach sponsorowanego przez ARPA projektu CONCOMP na Uniwersytecie Michigan. W miarę postępu prac stopniowo stawało się jasne, że MAD/I był nowym językiem niezależnym od oryginalnej wersji MAD 7090.
- GOM ( Good Old M AD), reimplementacja oryginalnego 7090 MAD dla serii komputerów mainframe IBM System / 370 z systemem Michigan Terminal System (MTS) . GOM został stworzony na początku lat 80. przez Dona Boettnera z University of Michigan Computing Center.
Historia
Chociaż MAD był motywowany przez ALGOL 58 , nie przypomina ALGOL 58 w żaden znaczący sposób.
Programy napisane w MAD obejmowały MAIL, RUNOFF , jeden z pierwszych systemów przetwarzania tekstu i kilka innych narzędzi, wszystkie w ramach kompatybilnego systemu podziału czasu (CTSS). Wykonano prace nad projektem kompilatora MAD dla Multics , ale nigdy nie został on wdrożony.
Poniżej znajduje się interesujący cytat z Wywiadu z Brianem Kernighanem , kiedy zapytano go „Co cię wciągnęło w programowanie?”:
- Myślę, że największą frajdę z programowania miałem podczas letniej pracy w Project MAC na MIT w lecie 1966 roku, gdzie pracowałem nad programem, który stworzył taśmę pracy dla nowiutkiego GE 645 w pierwszych dniach Multics. Pisałem w MAD, co było o wiele łatwiejsze i przyjemniejsze niż FORTRAN i COBOL, które pisałem wcześniej, i korzystałem z CTSS, pierwszego systemu podziału czasu, który był nieskończenie łatwiejszy i przyjemniejszy niż karty perforowane.
MAD był dość szybki w porównaniu z niektórymi innymi kompilatorami swoich czasów. Ponieważ wiele osób było zainteresowanych używaniem FORTRAN , a jednocześnie chciało uzyskać szybkość kompilatora MAD, powstał system o nazwie MADTRAN (napisany w MAD). MADTRAN był po prostu tłumaczem z języka FORTRAN na MAD, który następnie tworzył kod maszynowy. MADTRAN był dystrybuowany za pośrednictwem SHARE .
MAD/I ma strukturę syntaktyczną podobną do ALGOL 60 wraz z ważnymi cechami oryginalnego MAD i PL/I . MAD/I został zaprojektowany jako rozszerzalny język. Był dostępny do użytku w ramach MTS i dostarczył wielu nowych pomysłów, które przedostały się do innych języków, ale kompilacje MAD / I były powolne, a MAD / I nigdy nie rozszerzył się do powszechnego użytku w porównaniu z oryginalnym 7090 MAD.
GOM jest zasadniczo zmodyfikowanym i rozszerzonym językiem MAD 7090 dla architektury 360/370 z pewnymi rozsądnymi dostosowaniami, aby lepiej pasowały do obecnych praktyk i problemów programistycznych. System MTS został napisany w GOM.
MAD, MAD Magazine i Alfreda E. Neumana
W przedpremierowej wersji oryginalnego MAD, jako odniesienie do imiennika MAD, magazynu MAD , gdy program zawierał zbyt wiele błędów czasu kompilacji, kompilator drukował całostronicowe zdjęcie Alfreda E. Neumana przy użyciu grafiki ASCII . Podpis brzmiał: „Zobacz tego człowieka o swoim programie - może chcieć go opublikować. Nigdy się nie martwi - ale sądząc po wyglądzie twojego programu, powinieneś”. Ta funkcja nie została uwzględniona w ostatecznej oficjalnej wersji. Został on jednak uwzględniony w wersji produkcyjnej dla IBM 7040.
A Bernie Galler wspomina:
- Kiedy zaprojektowaliśmy język, który uznaliśmy za warty zrobienia i dla którego moglibyśmy stworzyć kompilator, nie mogliśmy już nazywać go Algolem; naprawdę było inaczej. To wtedy przyjęliśmy nazwę MAD dla dekodera algorytmu Michigan. Mieliśmy zabawną interakcję z ludźmi z Mad Magazine, kiedy poprosiliśmy o pozwolenie na użycie nazwy MAD. W bardzo zabawnym liście powiedzieli nam, że podają nas do sądu i tak dalej, ale zakończyli groźbę PS na dole - „Jasne, śmiało”. Niestety list ten zaginął.
Przykład „Witaj, świecie”.
„ witaj, świecie ” wypisuje ciąg „Witaj, świecie” na terminalu lub ekranie.
FORMAT WYDRUKOWANIA HELLOW WARTOŚCI WEKTOROWE HELLOW=$13h0Witaj, świecie*$ KONIEC PROGRAMU
Pierwszy znak linii jest traktowany jako logiczna kontrola karetki , w tym przykładzie znak "0", który powoduje wydrukowanie linii z podwójnymi odstępami.
Alternatywnie można użyć skrótów, a kompilator rozwinie je na liście:
P'T HELLOW V'S HELLOW=$13h0Witaj, świecie*$ E'M
Elementy językowe
MAD i GOM, ale nie MAD/I, składają się z następujących elementów:
Format wejściowy
Programy MAD to seria instrukcji zapisywanych na kartach perforowanych, zwykle po jednej instrukcji na kartę, chociaż instrukcja może być kontynuowana na wielu kartach. Kolumny 1-10 zawierają opcjonalną etykietę instrukcji, komentarze lub uwagi są oznaczone literą „R” w kolumnie 11, a kolumny 73-80 są nieużywane i mogą zawierać identyfikator sekwencji. Spacje nie są znaczące nigdzie poza stałymi znakowymi. W przypadku GOM wejście jest dowolne, bez pola sekwencji, a linie mogą mieć długość do 255 znaków; wiersze zaczynające się od gwiazdki (*) to komentarze; a linie zaczynające się od znaku plus (+) to linie kontynuacji.
Nazwy
Nazwy zmiennych, nazwy funkcji i etykiety instrukcji mają tę samą postać — litera, po której następuje zero do pięciu liter lub cyfr. Nazwy funkcji kończą się kropką. Wszystkie nazwy mogą mieć indeks dolny (nazwa poprzedzona nawiasami, z wieloma indeksami dolnymi oddzielonymi przecinkami). W przypadku GOM nazwy mogą mieć długość do 24 znaków i mogą zawierać znak podkreślenia (_).
Niewiele słów kluczowych w tym języku to słowa zastrzeżone, ponieważ większość z nich jest dłuższa niż sześć liter lub jest otoczona kropkami. Istnieje standardowy zestaw skrótów, którymi można zastąpić dłuższe słowa. Składają się one z pierwszej i ostatniej litery słowa kluczowego z apostrofem między nimi, na przykład W'R dla KIEDYKOLWIEK i D'N dla WYMIAR.
Typy danych
MAD używa terminu „tryb” dla swoich typów danych. Obsługiwanych jest pięć podstawowych trybów:
- Liczba całkowita zapisana ze współczynnikiem skali lub bez (1, +1, -1, 1K10, 1K) lub jako stałe ósemkowe (do 7777777777777K);
- Zmiennoprzecinkowe zapisywane z wykładnikiem lub bez (0., 1.5, -0.05, +100.4, -4., .05E-2, -.05E2, 5E02, 5.E2);
- Boolean (1B dla prawdy i 0B dla fałszu);
- Etykieta oświadczenia , i
- Nazwa funkcji zapisana jako nazwa, po której następuje kropka (SQRT.).
Tryb stałej można ponownie zdefiniować, dodając znak M, po którym następuje pojedyncza cyfra na końcu stałej, gdzie 0 oznacza liczbę zmiennoprzecinkową, 1 liczbę całkowitą, 2 wartość logiczną, 3 nazwę funkcji i 4 etykietę instrukcji.
Do GOM dodano sześć dodatkowych trybów: CHARACTER, SHORT INTEGER, BYTE INTEGER, LONG INTEGER, POINTER i DYNAMIC RECORD.
Stałe alfabetyczne lub znakowe są przechowywane jako liczby całkowite i zapisywane przy użyciu znaku dolara jako separatora ($ABCDEF$) z podwójnymi znakami dolara używanymi do wprowadzenia prawdziwego znaku dolara ($$$.56$ to 56 centów). Łańcuchy dłuższe niż sześć znaków są reprezentowane za pomocą tablic.
Tablice i macierze
- Nie ma ograniczeń co do liczby wymiarów.
- Dozwolone są indeksy dolne ujemne i zerowe oraz zmiennoprzecinkowe.
- Macierze są umieszczane w kolejnych lokalizacjach pamięci w kolejności określonej przez zmianę pierwszego indeksu dolnego znajdującego się najbardziej na prawo.
- Do macierzy można odwoływać się za pomocą indeksu dolnego dla każdego wymiaru, NAZWA(s 1 ,s 2 ,s 3 ) lub za pomocą pojedynczego indeksu dolnego, NAZWA(y 1 ).
- Listy wejścia-wyjścia, instrukcje VECTOR VALUES i niektóre podprogramy pozwalają na użycie notacji blokowej, która ma postać A,...,B lub A...B, która jest odniesieniem do całego obszaru od A do B. włącznie. Jeśli chodzi o wektor, A(1)...A(N) to A(1), A(2), A(3), ..., A(N).
- Istnieją udogodnienia, które umożliwiają zmianę wymiarów w czasie wykonywania; umożliwienie programiście zmiany położenia elementu początkowego w tablicy w ramach całego bloku, który został zarezerwowany dla tablicy; oraz umożliwienie określenia dowolnego mapowania pamięci.
Operatorzy
Operatory arytmetyczne
Operatory wskaźników (tylko GOM)
|
Operatorzy relacyjni
Operatory logiczne
Operatory bitowe (tylko GOM)
|
Deklaracje
Zmienne mogą być deklarowane jawnie lub niejawnie. Domyślnie zakłada się, że wszystkie niejawnie zadeklarowane zmienne są zmiennoprzecinkowe. Do zmiany tego ustawienia domyślnego można użyć instrukcji NORMAL MODE IS.
|
|
Instrukcje wykonywalne
|
|
Instrukcje wejścia i wyjścia
|
|
Funkcje
Nazwy funkcji kończą się kropką. Obsługiwane są funkcje wewnętrzne i zewnętrzne. Funkcje wewnętrzne są kompilowane jako część programu, w którym są używane i współdzielą deklaracje i zmienne z programem głównym. Funkcje zewnętrzne są kompilowane oddzielnie i nie współdzielą deklaracji ani zmiennych. Dozwolona jest jednozdaniowa definicja funkcji wewnętrznych. Funkcje rekurencyjne są dozwolone, chociaż funkcja musi sama wykonać część wymaganej pracy związanej z zapisywaniem i odtwarzaniem.
|
|
Definicja i redefinicja operatora
Jedną z najciekawszych funkcji MAD jest możliwość rozbudowy języka poprzez redefinicję istniejących operatorów, definiowanie nowych operatorów, czy definiowanie nowych typów danych (trybów). Definicje są tworzone przy użyciu instrukcji deklaracji MAD i mnemoników języka asemblerowego zawartych po deklaracji aż do pseudoinstrukcji END, które realizują operację.
- ZDEFINIUJ OPERATOR BINARNY zdefiniowany-op , PRECEDENCE rank istniejący-op TRYB STRUKTURA tryb-opcje
- ZDEFINIUJ JEDNORAZOWY OPERATOR zdefiniowany-op , PRECEDENCE rank istniejący-op TRYB STRUKTURA tryb-opcje
- STRUKTURA TRYBÓW tryb-no = tryb-no istniejący tryb -op
- STRUKTURA TRYBÓW tryb-no = tryb-nie istniejący- tryb-operacyjny-nie TAKA SEKWENCJA JAK tryb-nie istniejący- tryb- operacyjny
Gdzie:
- ranga to TAKA SAMA JAKA, NIŻSZA NIŻ lub WYŻSZA NIŻ; I
- opcje-modu to opcje pojawiające się w instrukcji MODE STRUCTURE.
Trzy predefiniowane pakiety definicji (MATRIX, DOUBLE PRECISION i COMPLEX) są dostępne do włączenia do programów źródłowych MAD za pomocą instrukcji INCLUDE.
- ZAWIERA pakiet
Zobacz też
Notatki
- Skrócony opis języka kompilatora MAD , Fernando J. Corbató , Jerome H. Saltzer , Neil Barta i Thomas N. Hastings, MIT Computation Center Memorandum CC-213, czerwiec 1963.
- CLSYS, program ułatwiający korzystanie z translatora MAD dla dużych partii (wielkości klasy) , Jerome H. Saltzer, MIT Computation Center Memorandum CC-204. luty 1963.
- Komputerowy elementarz dla szalonego języka , Elliott Irving Organick , 1961.
- Organizacja wewnętrzna tłumacza MAD , Arden, BW, Galler, BA i Graham, RM, s. 28–31, CACM tom 4 nr 1 (styczeń 1961)
- Wprowadzenie do metod algorytmicznych z wykorzystaniem języka MAD , Alan B. Marcovitz i Earl J. Schweppe, Macmillan, 1966.
- Wprowadzenie do komputerów cyfrowych i języka MAD , Brice Carnahan, University of Michigan.
- Język komputerów , Bernard A. Galler, University of Michigan, McGraw-Hill, 1962.
- MAD w Michigan: jego funkcja i funkcje , Arden, BW, Galler, BA i Graham, RM, pp27–28, Datamation, tom 7 nr 12 (grudzień 1961)
- Schematy blokowe dekodera algorytmu Michigan , autorstwa GB Smith, SHARE General Program Library, SHARE Distribution Number 1327 PA, 1961
Linki zewnętrzne
- Retrokompilator Erica Raymonda dla MAD
- Trywialny przykład programu MAD
- Obsługa IBM 7094 Dave'a Pittsa - ma środowisko CTSS, które obejmuje wersję MAD MIT.