Czym jest REXX i dlaczego warto go poznać
REXX (REstructured eXtended eXecutors) to język skryptowy stworzony w IBM, który łączy prostotę składni z zaskakującą mocą. Jeśli kiedykolwiek pracowałeś na mainframe’ach IBM, systemach OS/2 albo używałeś CMS (Conversational Monitor System), prawdopodobnie spotkałeś REXX. To język, który przez dekady był domyślnym narzędziem automatyzacji w ekosystemie IBM — i wciąż jest, w wielu korporacyjnych środowiskach.
REXX jest językiem interpretowanym, proceduralnym, z dynamicznym typowaniem i niezwykle czytelną składnią. Jego projektant, Mike Cowlishaw, postawił na prostotę: instrukcje są angielskimi słowami, zmienne nie wymagają deklaracji, a kod REXX czyta się niemal jak pseudokod. Ale nie daj się zwieść — REXX ma potężne operacje na stringach, macierze asocjacyjne (stems) i mechanizmy sygnałowe, które czynią go poważnym narzędziem.
Dlaczego warto go poznać? Bo REXX to jeden z najlepiej zaprojektowanych języków skryptowych w historii. Jego składnia jest tak czysta, że służyła jako inspiracja dla innych języków. A jeśli pracujesz w środowisku mainframe IBM — REXX nie jest opcją, jest koniecznością.
Krótka historia i ewolucja
REXX został stworzony przez Mike’a Cowlishaw w 1979 roku w IBM UK Scientific Centre. Cowlishaw był sfrustrowany istniejącymi językami skryptowymi na mainframe — EXEC2 i CLIST były toporne i nieczytelne. REXX miał być prostszy, bardziej elastyczny i łatwiejszy w debugowaniu. Pierwsza wersja ukazała się wewnętrznie w IBM w 1979 roku, a publicznie w 1982.
REXX szybko stał się standardem w ekosystemie IBM. Został zintegrowany z VM/CMS, TSO (Time Sharing Option) i OS/2. W 1996 roku ANSI opublikował standard REXX (ANSI X3.274-1996), ujednolicając różne implementacje. Object REXX, wprowadzony w latach 90., dodał programowanie obiektowe do klasycznego REXX.
Regina REXX i ooRexx (open-source Object REXX) to darmowe implementacje dostępne na wiele platform. NetRexx, stworzony przez Cowlishaw, kompiluje do Java bytecode, łącząc składnię REXX z ekosystemem JVM. Choć REXX nie jest modny, jest stabilny i wciąż używany w tysiącach firm na całym świecie.
Kluczowe cechy i filozofia
REXX wyróżnia się czystością składni. Instrukcje są proste i konsekwentne: SAY drukuje, PARSE parsuje, DO...END to pętla, IF...THEN...ELSE to warunek. Nie ma tu enigmatycznych operatorów ani magicznych zmiennych. Kod REXX jest samowyjaśniający — nawet osoba, która nigdy nie widziała REXX, potrafi odczytać prosty program.
Stems (macierze asocjacyjne) to unikalna cecha REXX. Zmienna dane.1, dane.2, dane.imie to nie tablice w tradycyjnym sensie — to klucze w asocjacyjnej strukturze z prefiksem dane.. Kropka na końcu jest częścią konwencji nazewnictwa. Stems mogą być wielowymiarowe: tablica.2.3 to element na pozycji (2,3). To prosty, ale skuteczny system zarządzania danymi.
Typowanie w REXX jest dynamiczne i przezroczyste. Wszystko jest stringiem — liczby to stringi, które wyglądają jak liczby. Operacje arytmetyczne automatycznie konwertują stringi na liczby i z powrotem. To eliminuje potrzebę deklaracji typów i konwersji, ale wymaga dyscypliny, żeby nie wpaść w pułapki porównań.
Filozofia REXX to “prostota bez ograniczeń”. Język jest łatwy do nauki, ale wystarczająco potężny do poważnych zadań. Wbudowane funkcje do operacji na stringach (SUBSTR, POS, WORD, TRANSLATE) są bogate i spójne. Mechanizm SIGNAL do obsługi wyjątków i INTERPRET do eval-like metaprogramowania dają elastyczność, której brakuje wielu nowszym językom.
Gdzie REXX sprawdza się najlepiej
Mainframe IBM to naturalny dom REXX. Systemy z/OS, z/VM i TSO używają REXX jako domyślnego języka skryptowego. Automatyzacja zadań systemowych, przetwarzanie batch jobs, generowanie raportów, zarządzanie danymi na mainframe — REXX robi to wszystko od dekad. Firmy z sektora finansowego, ubezpieczeniowego i rządowego, które używają mainframe’ów IBM, mają tysiące skryptów REXX w produkcji.
OS/2 i eComStation to drugi historyczny dom REXX. System operacyjny IBM OS/2 miał REXX wbudowany jako język skryptowy, a Object REXX pozwalał na automatyzację GUI i integrację z systemem. Choć OS/2 jest dziś niszowy, eComStation wciąż żyje w niektórych środowiskach.
REXX bywa też używany jako język makro w narzędziach IBM i jako język skryptowy w systemach embedded. Niektóre bazy danych (jak DB2) wspierają procedury składowane w REXX.
Jak wygląda kod w REXX
Prosty program z operacjami na stringach:
/* Program: Analiza logu */
PARSE ARG filename
IF filename = '' THEN DO
SAY 'Podaj nazwe pliku jako argument.'
EXIT 1
END
errors = 0
DO WHILE LINES(filename) > 0
line = LINEIN(filename)
IF POS('ERROR', line) > 0 THEN DO
errors = errors + 1
SAY 'Znaleziono blad: ' line
END
END
SAY 'Laczna liczba bledow: ' errors
PARSE ARG pobiera argumenty, LINES() sprawdza dostępne linie, LINEIN() czyta linię, POS() szuka podstringu. Kod jest czytelny nawet bez znajomości REXX.
Stems w akcji:
/* Zliczanie slow w tekscie */
text = "Ala ma kota a kot ma Ale"
words. = 0 /* domyslna wartosc dla wszystkich kluczy */
DO i = 1 TO WORDS(text)
word = WORD(text, i)
words.word = words.word + 1
END
DO word OVER words.
IF words.word > 0 THEN
SAY word ': ' words.word ' razy'
END
words. to stem z domyślną wartością 0. WORDS() zwraca liczbę słów, WORD() zwraca n-te słowo. Pętla DO...OVER iteruje po kluczach stem. Eleganckie i typowe dla REXX.
Ekosystem i narzędzia
ooRexx (Open Object REXX) to flagowa open-source’owa implementacja. Jest zgodna ze standardem ANSI i dodaje programowanie obiektowe, wielowątkowość i wsparcie dla wielu platform (Windows, Linux, macOS). ooRexx jest aktywnie rozwijany i ma dobrą dokumentację.
Regina REXX to kolejna popularna implementacja open source, skupiona na zgodności z klasycznym REXX. Regina jest lekka, szybka i dostępna na praktycznie każdą platformę.
NetRexx kompiluje do Java bytecode, co otwiera drzwi do ekosystemu JVM. Możesz pisać kod w składni REXX i używać bibliotek Javy — to ciekawy most między światem mainframe a nowoczesnym developmentem.
Społeczność REXX skupia się wokół RexxLA (REXX Language Association), która organizuje coroczne sympozja. Istnieją aktywne grupy dyskusyjne i mailing listy, choć społeczność jest mała i skoncentrowana na środowisku IBM.
Mocne i słabe strony
Największą zaletą REXX jest czytelność i prostota. Kod REXX jest zrozumiały dla nietechnicznych osób, co jest ogromną zaletą w środowiskach korporacyjnych, gdzie skrypty muszą być review’owane przez różne zespoły. Operacje na stringach są naturalne i bogate. Stems dają prosty sposób na zarządzanie danymi bez złożonych struktur.
Kolejną zaletą jest stabilność i backward compatibility. Skrypty REXX sprzed 30 lat działają bez zmian na dzisiejszych interpreterach. Dla firm z dużą bazą legacy code to nieoceniona wartość.
Największą wadą jest niszowość. REXX jest silnie związany z ekosystemem IBM i mainframe. Poza tym środowiskiem jest praktycznie nieznany. Rynek pracy dla programistów REXX jest mały i ograniczony do specyficznych branż.
Kolejnym problemem jest brak nowoczesnego ekosystemu. REXX nie ma menedżera pakietów porównywalnego z pip czy npm, nie ma frameworków webowych, nie ma wsparcia dla nowoczesnych paradygmatów jak async/await. Object REXX dodaje OOP, ale nie zmienia faktu, że język czuje się jak produkt lat 80.
Podsumowanie
REXX to elegancki, dobrze zaprojektowany język skryptowy, który zasługuje na szacunek. Jeśli pracujesz na mainframe’ach IBM, REXX jest twoim codziennym narzędziem i prawdopodobnie nie potrzebujesz zachęty do jego nauki. Jeśli nie — REXX jest wart poznania jako przykład doskonałego designu języka skryptowego: prosty, czytelny i skuteczny.
Przyszłość REXX jest związana z przyszłością mainframe’ów IBM. Dopóki korporacje będą używać z/OS i TSO, REXX będzie miał swoje miejsce. Nie zdobędzie mainstreamu, ale nie musi — jego wartość mierzona jest w miliardach transakcji przetwarzanych codziennie przez systemy, które REXX automatyzuje.

