Czym jest M i dlaczego warto go poznać
M, znany też jako MUMPS (Massachusetts General Hospital Utility Multi-Programming System), to język programowania i jednocześnie system zarządzania bazą danych. Tak, dobrze przeczytałeś — M nie rozdziela języka od bazy danych. Zmienne w M mogą być trwałe (persistent), co oznacza, że automatycznie zapisują się na dysku i przetrwają restart systemu. To podejście, które dziś nazywamy “baza danych w pamięci z persistence”, w M istnieje od lat 60.
M jest językiem interpretowanym, proceduralnym, z dynamicznym typowaniem i unikalnym systemem zmiennych globalnych. Jego składnia jest zwięzła — wręcz kryptyiczna — z jednoliterowymi komendami: S (set), W (write), R (read), D (do), I (if). Dla niewtajemniczonych kod M wygląda jak telegraficzny szyfr, ale dla wtajemniczonych to niezwykle efektywne narzędzie.
Dlaczego warto go poznać? Bo M napędza jedne z najważniejszych systemów informatycznych na świecie — systemy opieki zdrowotnej. Departament Obrony USA (VistA), National Health Service w Wielkiej Brytanii i setki szpitali na całym świecie używają M do zarządzania danymi pacjentów. To język, od którego dosłownie zależą ludzkie życia.
Krótka historia i ewolucja
MUMPS został stworzony w 1966 roku przez Neila Pappalardo i Roberta Greenesa w Massachusetts General Hospital. Powstał jako narzędzie do zarządzania danymi medycznymi na komputerze PDP-7. Od początku łączył język programowania z systemem bazodanowym — rewolucyjne podejście w czasach, gdy języki i bazy danych były całkowicie oddzielnymi systemami.
W latach 70. i 80. MUMPS stał się standardem w amerykańskich szpitalach i systemach rządowych. Veterans Administration (obecnie VA) wybrała MUMPS jako bazę dla VistA — jednego z największych i najdłużej działających systemów informatyki medycznej na świecie. Standard MUMPS został zatwierdzony przez ANSI w 1977 roku, a później przez ISO.
W latach 90. nazwę skrócono do “M”, a język ewoluował pod auspicjami M Technology Association. Pojawiły się nowoczesne implementacje: GT.M (FIS), Caché (InterSystems, obecnie IRIS), YottaDB. InterSystems Caché/IRIS stał się dominującą platformą M, dodając obiektowość, SQL i integrację z nowoczesnymi technologiami.
Kluczowe cechy i filozofia
Najbardziej unikalną cechą M jest system zmiennych globalnych. Zmienne lokalne (bez prefiksu) istnieją tylko w bieżącym kontekście. Zmienne globalne (z prefiksem ^) są trwałe — automatycznie zapisywane na dysku i dostępne między procesami. ^Patient(123, "Name") = "Jan Kowalski" tworzy trwały rekord w bazie danych — bez SQL, bez ORM, bez konfiguracji połączenia.
M ma hierarchiczne zmienne, które działają jak wielowymiarowe tablice asocjacyjne. ^Data("a", 1, "x") to nie zagnieżdżony obiekt — to ścieżka w drzewie danych. M automatycznie zarządza indeksem i pozwala efektywnie iterować po dowolnym poziomie hierarchii przez komendę $Order. To podejście, które dziś widzimy w key-value stores jak Redis czy etcd.
Składnia M jest ekstremalnie zwięzła. Jednoliterowe komendy, skróty, brak zbędnych słów kluczowych. S X=1 W X to “ustaw X na 1, wydrukuj X”. Ta zwięzłość wynika z czasów, gdy każdy bajt pamięci był cenny, ale przetrwała jako element kultury M.
Filozofia M to “jeden system do wszystkiego”. Nie oddzielamy języka od bazy, aplikacji od danych, runtime od storage. Wszystko jest zintegrowane, co daje niesamowitą wydajność i prostotę deploymentu — ale też vendor lock-in i brak modularności.
Gdzie M sprawdza się najlepiej
Opieka zdrowotna to dominujące zastosowanie M. VistA — system VA — zarządza danymi milionów weteranów: historiami chorób, receptami, wynikami badań, harmonogramami wizyt. Epic Systems, jeden z największych dostawców EHR (Electronic Health Records), był pierwotnie zbudowany na M (choć teraz migruje na inne technologie). Setki szpitali na całym świecie używają systemów opartych na M.
Finanse to drugi ważny obszar. Niektóre systemy bankowe i ubezpieczeniowe używają M do zarządzania transakcjami i danymi klientów. Wydajność M w operacjach na danych i jego niezawodność (niektóre instancje M działają nieprzerwanie od dekad) czynią go atrakcyjnym dla systemów, które nie mogą sobie pozwolić na downtime.
M bywa też używany w systemach rezerwacyjnych, logistycznych i innych aplikacjach wymagających szybkiego dostępu do danych z persistence. InterSystems IRIS, nowoczesna platforma M, dodaje wsparcie dla SQL, REST API i integracji z chmurą, co otwiera nowe zastosowania.
Jak wygląda kod w M
Prosty program pobierający i wyświetlający dane pacjenta:
S ^PATIENT(1,"NAME")="Kowalski, Jan"
S ^PATIENT(1,"AGE")=45
S ^PATIENT(1,"DIAG")="Nadciśnienie"
;
D DISPLAY(1)
Q
;
DISPLAY(ID)
W !,"Pacjent: ",^PATIENT(ID,"NAME")
W !,"Wiek: ",^PATIENT(ID,"AGE")
W !,"Diagnoza: ",^PATIENT(ID,"DIAG")
Q
S (Set) przypisuje wartość, W (Write) drukuje, D (Do) wywołuje podprogram, Q (Quit) kończy. Zmienne z ^ to globals — trwałe dane na dysku. ! to nowa linia. Komentarze zaczynają się od ;.
Iteracja po pacjentach:
S ID=0
F S ID=$O(^PATIENT(ID)) Q:ID="" D
. W !,"ID: ",ID," Nazwisko: ",^PATIENT(ID,"NAME")
$O ($Order) zwraca następny klucz w drzewie. Pętla F (For) bez warunku iteruje, dopóki Q (Quit) nie przerwie. Kropka . oznacza wcięcie bloku. To typowy wzorzec iteracji w M.
Ekosystem i narzędzia
InterSystems IRIS (dawniej Caché) to dominująca platforma M. Oferuje zintegrowane IDE, debugger, profiler, wsparcie dla SQL, REST, SOAP i integrację z Javą i .NET. IRIS jest komercyjny i drogi, ale dla dużych organizacji medycznych to standard.
GT.M (obecnie YottaDB) to darmowa, open-source’owa implementacja M z silnym wsparciem dla transakcji ACID i szyfrowania. YottaDB jest używany w systemach finansowych i medycznych, gdzie koszt licencji InterSystems jest zbyt wysoki.
Społeczność M jest mała i starzejąca się — to realny problem. Konferencje MUG (MUMPS Users Group) gromadzą głównie weteranów branży. Brakuje młodych programistów, co stanowi zagrożenie dla systemów, które muszą być utrzymywane przez dekady. InterSystems próbuje przyciągnąć nowych użytkowników przez dodawanie nowoczesnych interfejsów.
Mocne i słabe strony
Największą zaletą M jest integracja języka z bazą danych. Brak overheadu połączenia, brak ORM, brak migracji schematu — po prostu zmienne, które są trwałe. Wydajność operacji na danych jest znakomita, a systemy M są znane z niezawodności i długowieczności. Hierarchiczne zmienne naturalnie modelują złożone struktury danych.
Kolejną zaletą jest dojrzałość. Systemy M działają w produkcji od 40+ lat. Bugs są wyłapane, edge cases udokumentowane, a wydajność zoptymalizowana. W świecie, gdzie frameworki pojawiają się i znikają co rok, M jest skałą.
Największą wadą jest archaiczna składnia i brak nowoczesnych konstrukcji. Jednoliterowe komendy, brak OOP (w czystym M), brak pakietów, brak menedżera zależności. Kod M jest trudny do czytania i utrzymania dla osób, które nie grew up z tym językiem.
Kolejnym poważnym problemem jest brak programistów. Społeczność M się kurczy, a systemy medyczne oparte na M muszą być utrzymywane. To tworzy rosnący deficyt specjalistów i presję na migrację do nowszych technologii — co jest kosztowne i ryzykowne przy systemach krytycznych.
Podsumowanie
M to język, który udowadnia, że proste idee mogą przetrwać dekady. Integracja języka z bazą danych, hierarchiczne zmienne i ekstremalna wydajność uczyniły go idealnym do systemów medycznych. Jeśli pracujesz w health IT lub interesujesz się architekturą systemów bazodanowych, M jest fascynującym studium przypadku.
Przyszłość M jest niepewna. Systemy oparte na M działają i będą działać jeszcze przez lata, ale nowe projekty rzadko wybierają M. InterSystems IRIS próbuje pomostować przepaść między starym a nowym światem. Niezależnie od przyszłości M, jego idee — persistent variables, hierarchical data — żyją dalej w nowoczesnych bazach NoSQL.

