Czym jest Bliss i dlaczego warto go poznać
Bliss to język programowania systemowego, który powstał na Carnegie Mellon University jako odpowiedź na pytanie: jak pisać wydajny, niskopoziomowy kod bez asemblera, ale z pełną kontrolą nad sprzętem? Bliss nie jest językiem, który spotkasz w codziennej pracy webowej czy data science. To narzędzie z zupełnie innej epoki — ale właśnie dlatego warto mu się przyjrzeć.
Dla współczesnego developera Bliss jest fascynujący z kilku powodów. Po pierwsze, był jednym z pierwszych języków, które próbowały pogodzić wygodę programowania wysokiego poziomu z brutalną efektywnością kodu maszynowego. Po drugie, jego wpływ na późniejsze języki — w tym na C — jest nie do przecenienia. Jeśli kiedykolwiek zastanawiałeś się, skąd wzięły się pewne decyzje projektowe w językach, których używasz na co dzień, Bliss daje część odpowiedzi.
Bliss nigdy nie osiągnął mainstreamowej popularności, ale jego użytkownicy byli niezwykle lojalni. Digital Equipment Corporation (DEC) używał go intensywnie do pisania systemów operacyjnych, firmware’u i kompilatorów na swoje maszyny PDP i VAX. To język, który powstał z konkretnej potrzeby i został dopracowany do tego konkretnego zadania.
Krótka historia i ewolucja
Bliss został zaprojektowany w latach 1969–1970 przez W.A. Wulfa, D.B. Russella i A.N. Habermanna na Carnegie Mellon University. Nazwa to akronim od „Basic Language for Implementation of System Software” — choć niektórzy żartowali, że chodzi o stan euforii, w jaki wpadał programista po opanowaniu jego składni. Wersja BLISS-10 została zaimplementowana na PDP-10 i szybko zyskała uznanie w środowisku systemowców.
Przełomowy moment nadszedł, gdy DEC wybrał Bliss jako główny język systemowy dla swoich platform. BLISS-11 (na PDP-11) i później BLISS-32 (na VAX) stały się standardowymi narzędziami w ekosystemie DEC. Firma zainwestowała w kompilatory, biblioteki i dokumentację na poziomie, o jakim wiele współczesnych niszowych języków może tylko pomarzyć. W latach 80. Bliss był de facto językiem systemowym w świecie DEC.
Wraz z upadkiem DEC i dominacją Uniksa (a co za tym idzie — C), Bliss stopniowo tracił na znaczeniu. Kompilatory C stały się wystarczająco dobre, a ekosystem Uniksa wystarczająco duży, by przyciągnąć większość developerów systemowych. Dziś Bliss to praktycznie martwy język, ale jego kod źródłowy i dokumentacja są nadal dostępne dla entuzjastów historii informatyki.
Kluczowe cechy i filozofia
Bliss jest językiem proceduralnym, ale z kilkoma nietypowymi decyzjami projektowymi, które odróżniają go od C czy Pascala. Najbardziej charakterystyczną cechą jest to, że każde wyrażenie ma wartość — nie ma rozróżnienia na instrukcje i wyrażenia jak w C. Przypisanie, blok kodu, pętla — wszystko zwraca wartość. To sprawia, że kod jest bardziej zwięzły, ale też wymaga przyzwyczajenia.
System typów w Bliss jest minimalistyczny, ale pragmatyczny. Typy to w zasadzie rozmiary słów maszynowych (BLISS-16, BLISS-32 itd.), a język daje programiście bezpośredni dostęp do operacji na bitach i bajtach. Nie ma tu abstrakcji w stylu high-level objects — Bliss traktuje pamięć jako tablicę słów, z którymi robisz, co chcesz. To podejście bliskie asemblerowi, ale z czytelną składnią.
Kolejną ważną cechą jest brak wskaźników w stylu C. Zamiast tego Bliss używa koncepcji „referencji” i jawnej arytmetyki adresowej. Może to brzmieć dziwnie, ale w praktyce daje programiście więcej kontroli i mniej okazji do popełnienia błędów typu dangling pointer. Makra w Bliss są potężne — pozwalają na metaprogramowanie na poziomie, który w C wymaga zewnętrznych preprocesorów.
Filozofia Bliss to „daj programiście pełną władzę nad maszyną, ale w cywilizowany sposób”. To nie jest język, który chroni cię przed błędami — to język, który zakłada, że wiesz, co robisz, i daje ci najlepsze narzędzia do roboty.
Gdzie Bliss sprawdza się najlepiej
W swoim czasie Bliss był bezkonkurencyjny w pisaniu systemów operacyjnych, kompilatorów, firmware’u i sterowników na platformach DEC. System operacyjny VMS — jeden z najbardziej zaawansowanych OS-ów swoich czasów — miał znaczące fragmenty napisane w Bliss. Różne narzędzia systemowe, bootloadery i warstwy HAL również powstawały w tym języku.
Dziś Bliss nie ma praktycznych zastosowań komercyjnych. Ale jako obiekt studiów nad historią języków programowania i ewolucją paradygmatów systemowych — jest bezcenny. Niektóre koncepcje z Bliss (np. traktowanie wszystkiego jako wyrażenie) przetrwały w językach takich jak Rust czy Swift.
Jak wygląda kod w Bliss
Oto prosty przykład funkcji obliczającej silnię:
MODULE FACTORIAL (MAIN = FACT) =
BEGIN
GLOBAL ROUTINE FACT(N) =
IF .N LEQ 1 THEN 1
ELSE .N * FACT(.N - 1);
GLOBAL ROUTINE MAIN() =
BEGIN
LOCAL X = FACT(5);
! X = 120
END;
END
ELUDOM
Zwróć uwagę na kilka rzeczy: kropka przed nazwą zmiennej (.N) oznacza dereferencję — odczytanie wartości. To jedna z tych cech, które na początku dezorientują, ale po chwili stają się naturalne. Słowo kluczowe ROUTINE definiuje funkcje, a ! to komentarz. Całość jest zamknięta w module z symetrycznym ELUDOM na końcu.
Ekosystem i narzędzia
W szczycie popularności Bliss miał solidne wsparcie od DEC: kompilatory na PDP-10, PDP-11 i VAX, biblioteki standardowe, debuggery i obszerną dokumentację. DEC opublikował nawet podręcznik „Bliss Language Manual”, który do dziś jest czytany przez entuzjastów.
Dziś ekosystem Bliss praktycznie nie istnieje. Nie znajdziesz go na GitHubie, nie ma package managera, nie ma community na Discordzie. Istnieją jednak archiwalne kompilatory dostępne w emulatorach PDP i VAX (np. SIMH), a kilku entuzjastów utrzymuje strony z dokumentacją i przykładami kodu. To język dla archeologów informatyki — i to jest w porządku.
Mocne i słabe strony
Mocne strony Bliss to przede wszystkim wydajność generowanego kodu i kontrola nad sprzętem. Kompilatory Bliss produkowały kod maszynowy jakości porównywalnej z ręcznie pisanym asemblerem. Składnia, choć nietypowa, jest spójna i logiczna. System makr pozwalał na eleganckie abstrakcje bez narzutu runtime’owego.
Słabe strony? Przede wszystkim — Bliss był silnie związany z platformami DEC. Gdy DEC upadł, język nie miał dokąd uciec. Brak przenośności na inne platformy sprzętowe był gwoździem do trumny. Składnia z dereferencją przez kropkę i odwróconymi słowami kluczowymi (ELUDOM, TINUEC zamiast CONTINUE) bywała barierą wejścia. No i brak zarządzania pamięcią — programista musiał sam dbać o wszystko, co w erze współczesnych języków wydaje się archaiczne.
Podsumowanie
Bliss to język, który powinien zainteresować każdego, kto chce zrozumieć, jak ewoluowało programowanie systemowe. Nie nauczysz się go po to, by dostać pracę — nauczysz się go, by zrozumieć, dlaczego C wygląda tak, jak wygląda, i jakie alternatywy istniały w latach 70. i 80. Dla fanów historii informatyki i retrocomputingu Bliss jest kopalnią wiedzy i inspiracji.

