Moduł-2 - Modula-2

Moduł-2
Paradygmaty imperatywna , ustrukturyzowana , modułowa , ukrywanie danych i procedur , współbieżna
Rodzina Moduł Wirth
Zaprojektowany przez Niklaus Wirth
Po raz pierwszy pojawiły się 1978 ; 43 lata temu ( 1978 )
Dyscyplina pisania Statyczny , mocny , bezpieczny
Zakres leksykalny (statyczny)
Platforma Lilith ( AMD 2901 )
OS Wieloplatformowy
Rozszerzenia nazw plików .mod, .m2, .def, .MOD, .DEF, .mi, .md
Strona internetowa www .modula2 .org
Główne wdrożenia
Kompilator ETH napisany przez Niklausa Wirtha
GNU Modula-2
ADW Modula-2
Dialekty
PIM2, PIM3, PIM4, ISO
Wpływem
Modula , Mesa , Pascal , ALGOL W , Euclid
Pod wpływem
Modula-3 , Oberon , Ada , Fortran 90 , Lua , Seed7 , Zonnon , Modula-GM

Modula-2 to ustrukturyzowany, proceduralny język programowania opracowany w latach 1977-1985 przez Niklausa Wirtha z ETH Zurich . Został on stworzony jako język dla systemu operacyjnego i aplikacji z Lilith osobistej stacji roboczej . Został później użyty do programowania poza kontekstem Lilith.

Wirth postrzegał Modula-2 jako następcę swoich wcześniejszych języków programowania Pascal i Modula . Główne pojęcia to:

  1. Moduł jako jednostka kompilująca do oddzielnej kompilacji
  2. Współprogram jako podstawowy budulec procesów współbieżnych
  3. Rodzaje i procedury umożliwiające dostęp do danych specyficznych dla maszyny

Projekt języka był pod wpływem języka Mesa i Xerox Alto , oba z Xerox PARC , które Wirth widział podczas swojego urlopu naukowego w 1976 roku. Magazyn komputerowy Byte poświęcił numer z sierpnia 1984 roku językowi i jego otoczeniu.

Po Modula-2 pojawiła się Modula-3 , a później seria języków Oberon .

Opis

Modula-2 jest językiem proceduralnym ogólnego przeznaczenia , wystarczająco elastycznym do programowania systemów , ale o znacznie szerszym zastosowaniu. W szczególności został zaprojektowany do obsługi oddzielnej kompilacji i abstrakcji danych w prosty sposób. Znaczna część składni jest oparta na wcześniejszym i lepiej znanym języku Wirtha, Pascal . Modula-2 została zaprojektowana tak, aby była zasadniczo podobna do Pascala, z usuniętymi niektórymi elementami i niejasnościami składniowymi oraz ważnym dodatkiem koncepcji modułu i bezpośredniej obsługi języka dla multiprogramowania .

Język umożliwia korzystanie z kompilatorów jednoprzebiegowych . Taki kompilator autorstwa Gutknechta i Wirtha był około cztery razy szybszy niż wcześniejsze kompilatory wieloprzebiegowe .

Oto przykład kodu źródłowego programu „Hello world”:

MODULE Hello;
FROM STextIO IMPORT WriteString;
BEGIN
  WriteString("Hello World!")
END Hello.

Modula-2 modułu mogą być stosowane do opakowania zestawu odpowiednich podprogramów oraz struktury danych i ograniczyć ich widoczności z innych części programu. Projekt modułu zaimplementował funkcję abstrakcji danych Modula-2 w bardzo przejrzysty sposób. Programy Modula-2 składają się z modułów, z których każdy składa się z dwóch części: modułu definicji , części interfejsu, która zawiera tylko te części podsystemu, które są eksportowane (widoczne dla innych modułów) oraz modułu implementacji , który zawiera działający kod, który jest wewnętrzny dla modułu.

Język ma ścisłą kontrolę zakresu . Zakres modułu można uznać za nieprzenikalną ścianę: z wyjątkiem standardowych identyfikatorów, żaden obiekt z zewnątrz nie jest widoczny wewnątrz modułu, chyba że został wyraźnie zaimportowany; żaden obiekt modułu wewnętrznego nie jest widoczny z zewnątrz, chyba że został wyraźnie wyeksportowany.

Załóżmy, że moduł M1 eksportuje obiekty a, b, c i P przez wyliczenie ich identyfikatorów na jawnej liście eksportu

  DEFINITION MODULE M1;
    EXPORT QUALIFIED a, b, c, P;
    ...

Następnie obiekty a, b, c i P z modułu M1 stają się teraz znane poza modułem M1 jako M1.a, M1.b, M1.c i M1.P. Są one eksportowane w sposób kwalifikowany na zewnątrz (przy założeniu, że moduł M1 jest globalny). Nazwa modułu eksportującego, tj. M1, jest używana jako kwalifikator, po której następuje nazwa obiektu.

Załóżmy, że moduł M2 zawiera następującą deklarację IMPORT

  MODULE M2;
    IMPORT M1;
    ...

Oznacza to, że obiekty wyeksportowane przez moduł M1 na zewnątrz programu otaczającego mogą być teraz używane wewnątrz modułu M2. Są one przywoływane w sposób kwalifikowany , a więc: M1.a, M1.b, M1.c i M1.P. Przykład:

    ...
    M1.a := 0;
    M1.c := M1.P(M1.a + M1.b);
    ...

Kwalifikowany eksport pozwala uniknąć kolizji nazw: Na przykład, jeśli inny moduł M3 również wyeksportowałby obiekt o nazwie P, nadal możemy rozróżnić te dwa obiekty, ponieważ M1.P różni się od M3.P. Dzięki eksportowi kwalifikowanemu nie ma znaczenia, że ​​oba obiekty noszą nazwę P wewnątrz swoich modułów eksportujących M1 i M3.

Istnieje alternatywna metoda, która jest szeroko stosowana przez programistów Modula-2. Załóżmy, że moduł M4 jest sformułowany w następujący sposób:

  MODULE M4;
    FROM M1 IMPORT a, b, c, P;

Oznacza to, że obiekty wyeksportowane przez moduł M1 na zewnątrz mogą być ponownie użyte wewnątrz modułu M4, ale teraz przez samo tylko odwołania do wyeksportowanych identyfikatorów w sposób niekwalifikowany , a więc: a, b, c i P. Przykład:

    ...
    a := 0;
    c := P(a + b);
    ...

Ta metoda importu bez kwalifikacji pozwala na użycie zmiennych i innych obiektów poza ich modułem eksportującym w dokładnie taki sam prosty, tzn. niekwalifikowany sposób, jak wewnątrz modułu eksportującego. Ściany otaczające wszystkie moduły stały się teraz nieistotne dla wszystkich obiektów, dla których zostało to wyraźnie dozwolone. Oczywiście niekwalifikujący się import jest użyteczny tylko wtedy, gdy nie ma kolizji nazw.

Te reguły eksportu i importu mogą wydawać się niepotrzebnie restrykcyjne i szczegółowe. Ale nie tylko chronią obiekty przed niepożądanym dostępem, ale mają również przyjemny efekt uboczny w postaci automatycznego powiązania definicji każdego identyfikatora w programie: jeśli identyfikator jest kwalifikowany nazwą modułu, to definicja pochodzi z ten moduł. W przeciwnym razie, jeśli wystąpi niekwalifikowany, po prostu szukaj wstecz, a natkniesz się na deklarację tego identyfikatora lub jego wystąpienie w instrukcji IMPORT, która nazywa moduł, z którego pochodzi. Ta właściwość staje się bardzo przydatna podczas próby zrozumienia dużych programów zawierających wiele modułów.

Język zapewnia (ograniczoną) jednoprocesorową współbieżność ( monitory , współprogramy i jawne przekazywanie kontroli) oraz dostęp do sprzętu (adresy bezwzględne, manipulacja bitami i przerwania ). Wykorzystuje system typu nominalnego .

Dialekty

Istnieją dwa główne dialekty Modula-2. Pierwszym z nich jest PIM , nazwany na cześć książki Programowanie w Modula-2 autorstwa Niklausa Wirtha. Były trzy główne wydania PIM: drugie, trzecie (poprawione) i czwarte. Każdy opisuje niewielkie warianty języka. Drugim głównym dialektem jest ISO , nazwany tak od wysiłków normalizacyjnych Międzynarodowej Organizacji Normalizacyjnej . Oto kilka różnic między nimi.

  • PIM2 (1983)
    • Wymagana EXPORTklauzula explicit w modułach definicji.
    • Funkcja SIZEmusi zostać zaimportowana z modułuSYSTEM
  • PIM3 (1985)
    • Usunięto EXPORTklauzulę z modułów definicji po stwierdzeniu, że wszystko w module definicji definiuje interfejs do tego modułu, stąd EXPORTklauzula była zbędna.
    • Funkcja SIZEjest wszechobecna (widoczna w dowolnym zakresie bez importu)
  • PIM4 (1988)
    • Określono zachowanie MODoperatora, gdy operandy są ujemne.
    • Wymagane, aby wszystkie ARRAY OF CHARciągi były zakończone przez ASCII NUL, nawet jeśli ciąg dokładnie pasuje do jego tablicy.
  • ISO (1996, 1998)
    • ISO Modula-2 rozwiązało większość niejasności w PIM Modula-2. Dodano typy danych COMPLEXi LONGCOMPLEX, wyjątki, zakończenie modułu ( FINALLYklauzula) oraz kompletną bibliotekę standardowego wejścia/wyjścia (I/O) . Istnieje wiele drobnych różnic i wyjaśnień.

Supersety

Istnieje kilka nadzbiorów Modula-2 z rozszerzeniami językowymi dla określonych domen aplikacji:

Pochodne

Istnieje kilka języków pochodnych, które bardzo przypominają Modula-2, ale same w sobie są nowymi językami. Większość z nich to różne języki o różnych celach oraz z własnymi mocnymi i słabymi stronami:

  • Modula-3 , opracowany przez zespół byłych pracowników firmy Xerox, którzy przenieśli się do DEC i Olivetti
  • Oberon , opracowany w ETH Zürich dla Systemu Oberon dostępnego online .
  • Oberon-2 , Oberon z rozszerzeniami OO
  • Active Oberon , jeszcze jedno obiektowe rozszerzenie Oberon , opracowane również w ETH z głównym celem wspierania programowania równoległego w systemach wieloprocesorowych i wielordzeniowych.
  • Parallaxis, język niezależnego od maszyny programowania równoległego danych
  • Umbriel, opracowany przez Pata Terry'ego jako język nauczania
  • YAFL, język badawczy autorstwa Dariusa Blasband

Wiele innych obecnych języków programowania przyjęło cechy Modula-2.

Elementy języka

Zarezerwowane słowa

PIM [2,3,4] definiuje 40 słów zastrzeżonych :

AND         ELSIF           LOOP       REPEAT
ARRAY       END             MOD        RETURN
BEGIN       EXIT            MODULE     SET
BY          EXPORT          NOT        THEN
CASE        FOR             OF         TO
CONST       FROM            OR         TYPE
DEFINITION  IF              POINTER    UNTIL
DIV         IMPLEMENTATION  PROCEDURE  VAR
DO          IMPORT          QUALIFIED  WHILE
ELSE        IN              RECORD     WITH

Wbudowane identyfikatory

PIM [3,4] definiuje 29 wbudowanych identyfikatorów :

ABS         EXCL            LONGINT    REAL
BITSET      FALSE           LONGREAL   SIZE
BOOLEAN     FLOAT           MAX        TRUE
CAP         HALT            MIN        TRUNC
CARDINAL    HIGH            NIL        VAL
CHAR        INC             ODD
CHR         INCL            ORD
DEC         INTEGER         PROC

Korzystanie z systemu wbudowanego

Modula-2 służy do programowania wielu systemów wbudowanych .

Moduł Cambridge-2

Cambridge Modula-2 firmy Cambridge Microprocessor Systems opiera się na podzbiorze PIM4 z rozszerzeniami językowymi do programowania wbudowanego. Kompilator działa w systemie DOS i generuje kod dla wbudowanych mikrokontrolerów Motorola serii 68000 (M68k) z systemem operacyjnym MINOS.

Mod51

Mod51 firmy Mandeno Granville Electronics jest oparty na ISO Modula-2 z rozszerzeniami językowymi do programowania wbudowanego zgodnie z IEC1131, standardem przemysłowym dla programowalnych sterowników logicznych (PLC) ściśle powiązanym z Modula-2. Kompilator Mod51 generuje samodzielny kod dla mikrokontrolerów opartych na 80C51.

Moduł-GM

Delco Electronics , wówczas filia GM Hughes Electronics , opracowała wersję Modula-2 dla wbudowanych systemów sterowania począwszy od 1985 roku. Delco nazwało ją Modula-GM. Był to pierwszy język programowania wysokiego poziomu używany do zastąpienia kodu maszynowego (języka) dla systemów wbudowanych w jednostkach sterujących silnika (ECU) Delco . Było to znaczące, ponieważ w 1988 roku Delco produkowało dla GM ponad 28 000 ECU dziennie. Był to wówczas największy na świecie producent ECU. Pierwsze eksperymentalne użycie Modula-GM we wbudowanym kontrolerze miało miejsce w 1985 roku w systemie Antilock Braking System Controller, który był oparty na mikroprocesorze Motorola 68xxx, a w 1993 roku ECU Gen-4 był używany przez Champ Car World Series Championship Auto Racing Teams (CART). i zespoły Indy Racing League (IRL). Pierwszym zastosowaniem produkcyjnym Modula-GM było jego zastosowanie w ciężarówkach GM, począwszy od modułu sterowania pojazdem (VCM) z roku modelowego 1990, używanego do zarządzania silnikami Vortec firmy GM Powertrain . Modula-GM był również używany we wszystkich ECU dla rodziny silników GM Buick V6 3800 Series II, używanych w roku modelowym 1997-2005 Buick Park Avenue . Kompilatory Modula-GM i związane z nimi narzędzia do zarządzania oprogramowaniem zostały pobrane przez Delco z firmy Intermetrics .

Modula-2 została wybrana jako podstawa do języka wysokiego poziomu Delco, ponieważ jego wielu zalet w stosunku do innych alternatywnych wyborów językowych w roku 1986. Po Delco została wydzielona z GM (z innych działów składowych) tworząc Delphi Automotive Systems w 1995 roku, globalny sourcing wymagał użycia niezastrzeżonego języka oprogramowania wysokiego poziomu. ECU teraz wbudowane oprogramowanie opracowane w Delphi jest skompilowany z kompilatorów handlowych dla języka C .

Rosyjskie satelity radionawigacyjne

Satelity rosyjskiego radionawigacji satelitarnej usługi ramowej GLONASS , podobnych do Stanów Zjednoczonych Global Positioning System (GPS), są zaprogramowane w Modula-2.

Kompilatory

  • Amsterdam Compiler Kit (ACK) Modula-2 – dla MINIX ; darmowy
  • ADW Modula-2 – dla Windows, zgodny z ISO, ISO/IEC 10514-1, ISO/IEC 10514-2 (rozszerzenie OO), ISO/IEC 10514-3 (rozszerzenie ogólne); darmowy
  • Aglet Modula-2 – dla AmigaOS 4.0 dla PowerPC ; darmowy
  • Dopasowane narzędzia programowe (FST) Modula-2 – dla DOS; darmowy
  • Gardens Point Modula-2 (GPM) – dla BSD, Linux, OS/2, Solaris ; zgodny z ISO; freeware, stan na 30 lipca 2014 r.
  • Gardens Point Modula-2 (GPM/CLR) – dla .NET Framework ; darmowy
  • GNU Modula-2 – dla platform GCC, wersja 1.0 wydana 11 grudnia 2010; zgodność: PIM2, PIM3, PIM4, ISO; wolne oprogramowanie , Powszechna Licencja Publiczna GNU (GPL)
  • M2Amiga – dla Amigi ; darmowe oprogramowanie
  • M2M – N. Wirth i współpracownicy z ETH Zurich, wieloplatformowy, generuje kod M dla maszyny wirtualnej ; darmowy
  • MacMETH – N. Wirth i współpracownicy z ETH Zurich dla Macintosh, tylko Classic; darmowy
  • Mod51 – dla rodziny mikrokontrolerów Intel 80x51, zgodny z ISO, rozszerzenia IEC1132; autorskie oprogramowanie
  • Megamax Modula-2 – dla Atari ST z dokumentacją tylko w języku niemieckim; darmowy
  • Modula-2 R10 – kompilator referencyjny dla tej Modula; open-source, recenzowanie
  • ModulaWare – dla OpenVMS ( VAX i Alpha ), zgodny z ISO; autorskie oprogramowanie
  • ORCA/Modula-2 – dla Apple IIGS autorstwa The Byte Works dla Apple Programmer's Workshop
  • p1 Modula-2 – dla komputerów Macintosh , Classic i macOS (tylko PowerPC i Carbon (API) ), zgodność z ISO; autorskie oprogramowanie
  • MOCKA – dla różnych platform, zgodny z PIM; komercyjne, darmowe wersje Linux/BSD
  • TDI Modula-2 – dla Atari ST , od TDI Software
  • Terra M2VMS – dla OpenVMS ( VAX i Alpha ), zgodny z PIM; autorskie oprogramowanie
  • m2c, Ulm Modula-2 System – dla Solarisa (Sun SPARC i Motorola 68k ); wolne oprogramowanie, Powszechna Licencja Publiczna GNU (GPL)
  • XDS – biblioteka zgodna z ISO, kompatybilna z TopSpeed: Natywny XDS-x86 dla x86 (Windows i Linux); XDS-C dla Windows i Linux (wersje 16- i 32-bitowe), docelowe C ( K&R & ANSI ); darmowy

Moduł Turbo-2

Turbo Modula-2 był kompilatorem i zintegrowanym środowiskiem programistycznym dla MS-DOS opracowanym, ale nie opublikowanym, przez firmę Borland . Jensen and Partners, w skład którego wchodził współzałożyciel Borland Niels Jensen, kupił niewydany kod i przekształcił go w TopSpeed ​​Modula-2. Ostatecznie został sprzedany firmie Clarion, obecnie należącej do SoftVelocity, która nadal oferuje kompilator Modula-2 jako część swojej linii produktów Clarion .

Zilog Z80 CP / M wersja Turbo Modula-2 krótko sprzedawany przez Echelonu na licencji firmy Borland. Wydanie towarzyszące dla Hitachi HD64180 zostało sprzedane przez Micromint jako narzędzie programistyczne dla ich jednopłytkowego komputera SB-180.

Moduł IBM-2

IBM miał kompilator Modula-2 do użytku wewnętrznego, który działał zarówno na OS/2, jak i AIX , i miał pierwszorzędną obsługę w edytorze IBM E2 . IBM Modula-2 był używany dla części Pionowego Licencjonowanego Kodu Wewnętrznego OS/400 (w rzeczywistości jądro OS/400). Ten kod został zastąpiony C++, gdy system OS/400 został przeniesiony do rodziny procesorów IBM RS64 . MC68000 backend istniał również, które mogą być stosowane w systemach wbudowanych produktów.

System operacyjny

Modula-2 służy do programowania niektórych systemów operacyjnych (OS). Struktura i wsparcie modułu Modula-2 są używane bezpośrednio w dwóch powiązanych systemach operacyjnych.

System operacyjny o nazwie Medos-2 , dla stacji roboczej Lilith, został opracowany w ETH Zurich przez Svenda Erika Knudsena za radą Wirtha. Jest to jednoużytkownikowy, obiektowy system operacyjny zbudowany z modułów Modula-2.

System operacyjny o nazwie Excelsior dla stacji roboczej Kronos został opracowany przez Akademię Nauk Związku Radzieckiego , oddział Syberyjski, Nowosybirskie Centrum Obliczeniowe, projekt Modular Asynchronous Developable Systems (MARS), Kronos Research Group (KRG). Jest to system jednoużytkownikowy oparty na modułach Modula-2.

Książki

  • Wirth, Niklaus (1988). Programowanie w Modula-2 (wyd. 4). Berlin Heidelberg : Springer-Verlag . doi : 10.1007/978-3-642-83565-0 . Numer ISBN 978-0-387-96051-7.
  • Król, KN (1 stycznia 1988). Modula-2: Kompletny przewodnik . Burlington, Massachusetts : Wydawnictwo Jones i Bartlett. Numer ISBN 978-0669110913.
  • Sutcliffe, Richard J. (2004–2005). Moduł-2: Abstrakcje dla struktur danych i programowania . Książki Arjaya. Numer ISBN 978-0-669-11091-3. Wykorzystuje standard ISO Modula-2.
  • Gleaves, Richard (1984). Moduł-2 dla programistów Pascala . Springer Books on Professional Computing (wyd. 1). Szwajcaria: Springer Nature. doi : 10.1007/978-1-4613-8531-8 . Numer ISBN 978-0-387-96051-7.
  • Cooper, Doug (1 września 1990). O mój! Moduł-2: Wprowadzenie do programowania . Nowy Jork , Nowy Jork : WW Norton & Company . Numer ISBN 978-0393960099.

Bibliografia

Zewnętrzne linki

Ten artykuł jest oparty na materiale zaczerpniętym z bezpłatnego słownika komputerowego on-line sprzed 1 listopada 2008 r. i włączonym na warunkach „ponownego licencjonowania” GFDL w wersji 1.3 lub nowszej.