PL/M

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

PL/Mstrukturalny język programowania wysokiego poziomu, klasyfikowany zwykle jako asemblerowy język wysokiego poziomu ze względu na wysoki współczynnik przełożenia na język asemblera. Niegdyś stosowany był do tworzenia oprogramowania systemowego, w tym m.in. systemów operacyjnych i kompilatorów. Jedną z ważniejszych implementacji była wersja opracowana przez firmę Intel dla procesorów serii 8080/8085, stosowana m.in. w systemie ISIS-II oraz PL/M-86 opracowana głównie dla potrzeb programowania procesów w systemach czasu rzeczywistego iRMX.

Składnia tego języka wzorowana jest na języku PL/1.

Przykład[edytuj | edytuj kod]

Information icon.svg Zobacz też: Hello world.
/* 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;

Cechy[edytuj | edytuj kod]

Język PL/M jest językiem umożliwiającym programowanie modularne, przy czym jedną z ważniejszych jego cech było tworzenie przemieszczalnych modułów i możliwość programowania hybrydowego (PL/Masembler).

Język PL/M (jego implementacja PL/M-80) jest tak zaprojektowany, że istnieje bezpośrednie odwzorowanie konstrukcji tego języka na język maszynowy procesora 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żnie kompilowanych modułów. Moduł źródłowy (najmniejsza kompilowalna jednostka) jest instrukcją strukturalną o postaci:

nazwa: DO;
     deklaracje i definicje
     [instrukcje]
  END nazwa;

Jeżeli moduł zawiera co najmniej 1 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ć jedynie deklaracje i definicje.

W języku PL/M zmienne posiadają określane w deklaracjach atrybuty:

  • zmienne proste:
    • BYTE – bajtowe
    • ADDRESS – dwubajtowe, zmienne te mogą oprócz liczb całkowitych przechowywać dane wskaźnikowe (należy raczej powiedzieć, że dane całkowite przechowywane w tych zmiennych mogą być traktowane jako wskaźniki)
    • BASE – bazowe
  • tablicowe – tablice mogą być w PL/M jednowymiarowe o ustalonym wymiarze indeksowane od zera,
  • strukturowe,
  • literały – LITERALLY 'tekst'.

Późniejsze wersje języka, jak PL/M 386 dla systemu iRMX, wprowadzają już nowe typy znane z innych języków programowania, takie jak cał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łe atrybuty określają inne cechy zmiennych:

  • AT(adres) – określa położenie zmiennej w pamięci,
  • INITIAL(wartość) – nadanie początkowej wartości zmiennej,
  • PUBLIC – udostępnienie zmiennej dla innych modułów,
  • EXTERNAL – zmienna z innego modułu.

W deklaracjach (podobnie jak w PL/1) można grupować identyfikatory: DECLARE (A,B) (3) ADDRESS;

Deklaracja i definicja procedury ma postać:

 nazwa: PROCEDURE(parametry) [typ_wartości] [atrybuty];
              DECLARE deklaracje parametrów,
                      deklaracje zmiennych;
              instrukcje
        END nazwa;

W przypadku procedur zewnętrznych stosować należy deklarację o postaci jak wyżej z pominięciem deklaracji zmiennych i instrukcji, ale z dodatkowym atrybutem EXTERNAL. Inne atrybuty to PUBLIC dla procedur udostępnianych dla innych modułów i REENTRANT dla procedur rekurencyjnych.

Główne instrukcje języka PL/M:

Język posiada także szereg wbudowanych procedur i predefiniowanych zmiennych.

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;

Bibliografia[edytuj | edytuj kod]

Zobacz też[edytuj | edytuj kod]