Czym jest Modula-2 i dlaczego warto go poznać
Modula-2 to język programowania zaprojektowany przez Niklausa Wirtha na ETH Zürich jako następca Pascala. Jeśli Pascal był „językiem do nauki programowania”, to Modula-2 był „językiem do budowania prawdziwych systemów”. Wirth wziął najlepsze cechy Pascala, wyrzucił jego błędy projektowe i dodał to, czego brakowało najbardziej: moduły — mechanizm hermetyzacji i oddzielania interfejsu od implementacji.
Dla współczesnego developera Modula-2 jest ważny, bo to w nim po raz pierwszy w mainstreamowym języku pojawiła się koncepcja modułów z eksportem/importem — coś, co dziś uważamy za oczywiste w Javie, Go, Rust czy TypeScript. Jeśli kiedykolwiek używałeś import albo export, korzystasz z idei, które Modula-2 spopularyzował w 1978 roku.
Modula-2 nie jest językiem martwym — wciąż ma aktywne community, kompilatory i jest używany w edukacji oraz w systemach embedded, gdzie jego prostota i przewidywalność są cenione wyżej niż bajery nowoczesnych języków.
Krótka historia i ewolucja
Niklaus Wirth zaprojektował Modula-2 w latach 1976–1978 na ETH Zürich. Wirth był już wtedy legendą — twórca Pascala (1970) i laureat Nagrody Turinga (1984). Był niezadowolony z kierunku, w którym ewoluował Pascal (szczególnie z rozszerzeń w stylu Turbo Pascala) i chciał języka, który byłby jednocześnie prosty, bezpieczny i odpowiedni do programowania systemowego.
Nazwa „Modula-2″ pochodzi od modułów — kluczowej innowacji języka. Wirth opublikował definicję języka w książce „Programming in Modula-2″ (1982), która stała się klasykiem literatury informatycznej. Język zyskał popularność w środowisku akademickim, szczególnie w Europie, i był używany do nauczania programowania na wielu uniwersytetach.
W latach 80. powstało wiele implementacji: kompilatory od DEC (VAX), Sun, IBM i niezależnych vendorów. Modula-2 był szczególnie popularny w świecie akademickim i w systemach embedded. Wirth kontynuował ewolucję, tworząc Modula-3 (w DEC Systems Research Center) i później Oberon — ale Modula-2 pozostał najbardziej wpływową wersją.
Dziś Modula-2 ma kilka aktywnych implementacji: GNU Modula-2 (część GCC), ADW Modula-2 (Windows), XDS Modula-2 (Excelsior) i p1modula2. Community jest małe, ale aktywne — szczególnie w kręgach edukacyjnych i embedded.
Kluczowe cechy i filozofia
Najważniejszą innowacją Modula-2 jest system modułów. Każdy moduł składa się z dwóch części: definition module (interfejs — co jest eksportowane) i implementation module (implementacja — jak to działa). To separacja, która dziś jest standardem w inżynierii oprogramowania, ale w 1978 roku była rewolucyjna.
DEFINITION MODULE Stack;
EXPORT QUALIFIED Push, Pop, Empty;
PROCEDURE Push(x: INTEGER);
PROCEDURE Pop(): INTEGER;
PROCEDURE Empty(): BOOLEAN;
END Stack.
System typów jest silny i statyczny. Modula-2 ma typy podstawowe (INTEGER, REAL, CHAR, BOOLEAN), tablice, rekordy, wskaźniki i typy wyliczeniowe. Ale w przeciwieństwie do Pascala, Modula-2 ma też typy nieprzezroczyste (opaque types) — w definition module możesz zadeklarować typ bez ujawniania jego struktry, co jest fundamentem hermetyzacji.
Składnia jest czysta i regularna — typowa dla języków Wirtha. Bloki kodu kończą się słowem kluczowym zamykającym (IF ... END, WHILE ... END, PROCEDURE ... END). Nie ma nawiasów klamrowych. To sprawia, że kod jest czytelny, choć nieco „gadatliwy” dla kogoś przyzwyczajonego do C.
Modula-2 ma też wbudowane wsparcie dla współbieżności przez korutyny i procesy — co było rzadkością w językach tamtej epoki. Moduł SYSTEM daje dostęp do niskopoziomowych operacji (I/O, przerwania), co pozwala używać Modula-2 do programowania systemowego.
Gdzie Modula-2 sprawdza się najlepiej
Modula-2 był używany w trzech głównych obszarach. Po pierwsze: edukacja — wiele uniwersytetów (szczególnie w Europie) używało Modula-2 do nauczania programowania strukturalnego i inżynierii oprogramowania. ETH Zürich, Oxford i wiele niemieckich uczelni miało Modula-2 w programie nauczania przez dekady.
Po drugie: systemy embedded i czasu rzeczywistego. Dzięki przewidywalnej wydajności, silnemu typowaniu i brakowi garbage collectora, Modula-2 był używany w systemach sterowania, avionice i automatyce przemysłowej. Standard Modula-2 był podstawą dla dialektów safety-critical.
Po trzecie: systemy operacyjne i narzędzia systemowe. Lilith — stacja robocza zaprojektowana przez Wirtha na ETH — miała cały system operacyjny napisany w Modula-2. To był jeden z pierwszych systemów operacyjnych napisanych w całości w języku wyższego poziomu.
Jak wygląda kod w Modula-2
Prosty program z modułem:
MODULE HelloWorld;
FROM InOut IMPORT WriteString, WriteLn;
BEGIN
WriteString("Witaj, świecie!");
WriteLn;
END HelloWorld.
A tu bardziej rozbudowany przykład — moduł kolejki:
IMPLEMENTATION MODULE Queue;
CONST MaxSize = 100;
TYPE
QueueType = RECORD
data: ARRAY [0..MaxSize-1] OF INTEGER;
head, tail: CARDINAL;
END;
VAR q: QueueType;
PROCEDURE Enqueue(x: INTEGER);
BEGIN
q.data[q.tail] := x;
q.tail := (q.tail + 1) MOD MaxSize;
END Enqueue;
PROCEDURE Dequeue(): INTEGER;
VAR x: INTEGER;
BEGIN
x := q.data[q.head];
q.head := (q.head + 1) MOD MaxSize;
RETURN x;
END Dequeue;
BEGIN
q.head := 0;
q.tail := 0;
END Queue.
Zwróć uwagę na BEGIN ... END Queue. na końcu — blok inicjalizacji modułu, który działa jak konstruktor. To elegancki mechanizm, który zapobiega problemom z inicjalizacją globalną.
Ekosystem i narzędzia
Najważniejszym współczesnym narzędziem jest GNU Modula-2 (gm2), który jest częścią GCC. To oznacza, że Modula-2 może być kompilowany na praktycznie każdą platformę, którą wspiera GCC — a to niemal wszystko. gm2 jest aktywnie rozwijany i wspiera standard ISO Modula-2.
ADW Modula-2 to komercyjny kompilator na Windows z IDE, popularny w środowisku edukacyjnym. XDS od Excelsior to kolejny solidny kompilator z debuggerem i profilerem.
Biblioteka standardowa Modula-2 jest skromna w porównaniu z nowoczesnymi językami — moduły InOut, Strings, MathLib0, Storage (alokacja pamięci). Ale to jest zamierzone — Wirth wierzył, że język powinien być mały, a biblioteki powinny być budowane przez społeczność.
Mocne i słabe strony
Mocne strony: Modula-2 jest prosty, spójny i bezpieczny. System modułów jest elegancki i wymusza dobrą architekturę. Silne typowanie wyłapuje błędy na etapie kompilacji. Kod jest czytelny i łatwy do utrzymania. Kompilatory produkują wydajny kod maszynowy. Język jest idealny do nauki inżynierii oprogramowania.
Słabe strony: Modula-2 jest zbyt prosty dla niektórych zastosowań — brak OOP (w standardzie), brak generyków, brak exception handling. Ekosystem jest mikroskopijny w porównaniu z C, Java czy Python. Brak nowoczesnych bibliotek do web developmentu, data science czy ML. Składnia, choć czysta, wydaje się dziś archaiczna. I wreszcie — Modula-2 przegrał wojnę o popularność z C i C++, co oznacza mniej miejsc pracy i mniej community support.
Podsumowanie
Modula-2 to język dla tych, którzy cenią prostotę, precyzję i dobrą inżynierię. Nie nauczysz się go, żeby dostać pracę w startupie — nauczysz się go, żeby zrozumieć, jak powinny być projektowane języki i systemy modułowe. Jeśli jesteś studentem informatyki, nauczycielem programowania albo inżynierem embedded — Modula-2 ma ci coś ważnego do powiedzenia. A jeśli po prostu lubisz elegancki kod — Modula-2 jest jak dobrze zaprojektowany mebel: prosty, solidny i ponadczasowy.

