MAD (język programowania)

SZALONY
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:

  1. 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 .
  2. 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.
  3. 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

Wyjście drukarki wierszowej po błędzie kompilatora MAD na komputerze IBM 704 na Uniwersytecie Michigan, ok. 1960

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.
Lista operatorów, instrukcji i funkcji

Operatorzy

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