PL/M (akronim od ang.ProgrammingLanguage forMicroprocessors lubProgrammingLanguage forMicrocomputers) –kompilowany,strukturalnyjęzyk programowaniawysokiego poziomu stworzony przezGary'ego Kildalla w 1973 roku.[1] Jest klasyfikowany zwykle jakoasemblerowy język wysokiego poziomu ze względu na wysoki współczynnik przełożenia najęzyk asemblera.
Został stworzony jako język mający ułatwić tworzenieoprogramowania systemowego[2]. Stosowany był do tworzenia m.in.systemów operacyjnych (CP/M[1]) ikompilatorów.
Ważnąimplementacją była wersja opracowana przez firmęIntel dlaprocesorów serii8080/8085, stosowana m.in. w systemieISIS-II oraz PL/M-86 opracowana głównie dla potrzeb programowania procesów wsystemach czasu rzeczywistegoiRMX.
Składnia języka jest wzorowana na językuPL/I.
Pierwsza wersja języka powstała mikroprocesoraIntel 8008 w 1973 roku. Jej autorem byłGary Kildall, który pracował wówczas (dodatkowo) dlaIntela jako konsultant.Kompilator PL/M został zaimplementowany w językuFORTRAN IV na komputerzePDP-10.[1][2]
W kolejnych latach powstały wersje kompilatorów języka dla innych procesorów (w szczególności dlaIntel 8080), które wykorzystywane były w implementacjisystemowych programów narzędziowych, kompilatorów oraz systemów operacyjnych.
Najbardziej znanym systemem, który powstał w PL/M, był CP/M[a], pierwszy szeroko wykorzystywany system operacyjny dlamikrokomputerów, którego pierwsza wersja powstała w 1974 roku.[1]
/* HELLO WORLD dla systemów operacyjnych ISIS-II i CP/M */HELLO: DO; DECLARE REP ADDRESS; WRITE: PROCEDURE (A,B,C,D) EXTERNAL; DECLARE (A,B,C,D) ADDRESS; END; CALL WRITE(0,.('Hello, world!'),13,.REP);END HELLO;Język PL/M jest językiem umożliwiającym programowaniemodularne, przy czym ważną cechą była możliwość tworzenia przemieszczalnych modułów i możliwośćprogramowania hybrydowego (PL/M +asembler).
Język PL/M (jego implementacja PL/M-80) jest tak zaprojektowany, że istnieje bezpośrednie odwzorowanie konstrukcji tegojęzyka najęzyk maszynowyprocesora Intel 8080/8085.Kompilator ten posiada opcję umożliwiającą translacjęprogramu źródłowego w PL/M na program w asemblerze.
Program w języku PL/M składa się z niezależniekompilowanych modułów. Moduł źródłowy (najmniejsza kompilowalna jednostka) jestinstrukcją strukturalną o postaci:
nazwa: DO;deklaracje i definicje [instrukcje] ENDnazwa;
Jeżeli moduł zawiera co najmniej jednąinstrukcję, to stanowi moduł główny i od niego rozpoczyna się wykonywanie programu; przy kilku takich modułach wyróżnienie modułu głównego następuje na etapie konsolidacji. Pozostałe moduły mogą zawierać jedyniedeklaracje i definicje.
W języku PL/Mzmienne posiadają określane w deklaracjachatrybuty:
Późniejszewersje języka, jak PL/M 386 dla systemuiRMX, wprowadziły nowetypy, znane z innych języków programowania, takie jakcałkowity,rzeczywisty,znakowy, umożliwiające programowanie na wyższym poziomie abstrakcji, choć oczywiście nadal jest możliwe programowanie bliskie sprzętowi, w tym korzystanie z ww. danych bajtowych i słowowych.
Pozostałeatrybuty określają inne cechy zmiennych:
W deklaracjach (podobnie jak w PL/I) można grupować identyfikatory:
DECLARE (A,B) (3) ADDRESS;
Deklaracja i definicjaprocedury ma postać:
nazwa: PROCEDURE(parametry) [typ_wartości] [atrybuty]; DECLAREdeklaracje parametrów,deklaracje zmiennych;instrukcje ENDnazwa;
W przypadku procedur zewnętrznych stosować należy deklarację o postaci jak wyżej z pominięciemdeklaracji zmiennych iinstrukcji, ale z dodatkowym atrybutem EXTERNAL. Inne atrybuty to PUBLIC dlaprocedur udostępnianych dla innychmodułów i REENTRANT dlaprocedurrekurencyjnych.
Główneinstrukcje języka PL/M:
v1, v2, …, vn = wyrażenie,; (separator instrukcji),DO…END,IF…THEN…[ELSE…],DO CASE…END,GOTO,DO…TO…[BY…]…END, repetycyjnejDO WHILE…END,CALL,RETURN.Język posiada takżewbudowane procedury ipredefiniowane zmienne.
Przykład:
PR1: DO; DECLARE LICZ BYTE, TAB(5) BYTE, SUM ADRESS INITAL(0); READTAB: PROCEDURE; DECLARE I BYTE; DO I=1 TO 5 BY 1; TAB(I)=INPUT(1); END; END READTAB; CALL READTAB; LICZ=1; DO WHILE LICZ<6; SUM=SUM+TAB(LICZ); LICZ=LICZ+1; END; OUTPUT(1)=SUM;END PR1;
| 1GL | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2GL/ Język drugiej generacji/ Asembler | |||||||||||||||
| 3GL / Język trzeciej generacji |
| ||||||||||||||
| 4GL/ Język czwartej generacji/ Język dziedzinowy |
| ||||||||||||||
| 5GL/Logiczne | |||||||||||||||
| Ezoteryczne | |||||||||||||||
| Inne |