Czym jest Lisaac i dlaczego warto go poznać
Lisaac to obiektowy język programowania, który łączy inspiracje z dwóch seemingly odległych światów: rygorystycznego podejścia do jakości kodu znanego z Eiffela i elastyczności prototypowej inspirowanej Selfem. Efekt jest zaskakująco spójny — dostajesz język, który dba o poprawność kodu, ale nie zakuwa cię w kajdany biurokratycznego typowania.
Warto poznać Lisaac, bo pokazuje on fascynującą możliwość: da się połączyć Design by Contract z prototypowym modelem obiektowym. To nie jest oczywiste połączenie — kontrakty kojarzą się z formalnymi specyfikacjami i sztywnymi klasami, a prototypy z luźnym klonowaniem obiektów. Lisaac udowadnia, że te dwa światy mogą ze sobą współpracować.
Dla osób zainteresowanych jakością kodu, kontraktami i jednocześnie elastycznością prototypów, Lisaac oferuje unikalną perspektywę. To język, który zmusza do myślenia o poprawności, ale daje swobodę w organizacji kodu. W praktyce oznacza to, że możesz prototypować szybko i swobodnie, a potem stopniowo dodawać kontrakty tam, gdzie są najbardziej potrzebne — bez konieczności przepisywania kodu od zera. To podejście pragmatyczne, które szanuje czas programisty i jednocześnie dba o jakość.
Krótka historia i ewolucja
Lisaac powstał na początku lat 2000. na Université de Technologie de Compiègne we Francji. Głównym twórcą był Jean-Marc Jézéquel, badacz specjalizujący się w inżynierii oprogramowania i modelowaniu obiektowym. Język był częścią szerszego projektu badawczego nad jakością kodu obiektowego.
Nazwa “Lisaac” nawiązuje do Isaac — co sugeruje, że język miał być “synem” lub następcą wcześniejszych idei. Wpływy Eiffela są wyraźne w nacisku na kontrakty, a wpływy Selfa — w prototypowym modelu obiektowym. To połączenie francuskiej tradycji formalnej z kalifornijską swobodą.
Język był aktywnie rozwijany przez kilka lat, z implementacją kompilatora generującego kod w C. Powstało kilka wersji, z których każda dodawała nowe mechanizmy i poprawiała istniejące. Lisaac był nauczany na kilku francuskich uczelniach i używany w projektach badawczych.
Kluczowe cechy i filozofia
Najważniejszą cechą Lisaac jest połączenie Design by Contract z prototypowym modelem obiektowym. Każdy obiekt może mieć preconditions, postconditions i invariants — dokładnie jak w Eiffelu — ale obiekty tworzy się przez klonowanie prototypów, nie przez instancjonowanie klas. To daje elastyczność prototypów przy zachowaniu gwarancji kontraktów.
Lisaac obsługuje wielopłaszczyznowe dziedziczenie prototypowe — obiekt może klonować wiele prototypów jednocześnie, łącząc ich zachowania. System rozwiązywania konfliktów jest oparty na liniaryzacji, podobnie jak w C3 w Pythonie, ale dostosowany do modelu prototypowego.
Typowanie w Lisaac jest statyczne z inferencją typów. Kompilator potrafi wywnioskować większość typów, więc programista nie musi ich jawnie deklarować wszędzie. Ale tam, gdzie typy są zadeklarowane, kompilator sprawdza je rygorystycznie — łącznie z weryfikacją kontraktów w czasie kompilacji, gdy to możliwe.
Filozofia Lisaac zakłada, że jakość kodu i elastyczność nie muszą być przeciwstawnymi celami. Kontrakty pomagają pisać poprawny kod, a prototypy pozwalają organizować go w sposób, który najlepiej pasuje do problemu. To podejście pragmatyczne — nie ideologiczne.
Gdzie Lisaac sprawdza się najlepiej
Lisaac był używany głównie w edukacji i badaniach nad jakością kodu obiektowego. Na uczelniach francuskich służył do nauczania zaawansowanego programowania obiektowego z naciskiem na poprawność i kontraktowe podejście do projektowania.
W zastosowaniach praktycznych, Lisaac mógł sprawdzać się w budowie systemów krytycznych, gdzie poprawność jest ważniejsza niż szybkość developmentu — systemy wbudowane, narzędzia do analizy, prototypy algorytmiczne z formalnymi gwarancjami.
Dziś Lisaac ma wartość jako studium przypadku w łączeniu różnych paradygmatów obiektowych. Dla osób projektujących nowe języki lub frameworki, jego podejście do kontraktów w modelu prototypowym jest nadal inspirujące.
Jak wygląda kod w Lisaac
Section Interface
Interface POINT
Section Inherit
CLONEABLE
Section Public
x : INTEGER
y : INTEGER
require_init
x >= 0;
y >= 0;
distance(other : POINT) : REAL
require
other /= Void
do
Result := ((x - other.x) ^ 2 + (y - other.y) ^ 2).sqrt
ensure
Result >= 0
end
Kod w Lisaac jest zorganizowany w sekcje — Interface, Inherit, Public — co nadaje mu wyraźną strukturę. Zwróć uwagę na kontrakty: require określa warunki wstępne, ensure warunki końcowe, a require_init ograniczenia na wartości początkowe. Składnia jest czytelna i zbliżona do Eiffela, ale z prototypowym twistem.
Ekosystem i narzędzia
Głównym narzędziem był kompilator Lisaac, który generował kod w C, co pozwalało na uruchamianie programów na różnych platformach. Kompilator był dostępny jako narzędzie open source i mógł być używany z linii poleceń.
Biblioteka standardowa obejmowała podstawowe kolekcje, operacje matematyczne i I/O. Nie istniał rozbudowany ekosystem zewnętrznych bibliotek. Dokumentacja była prowadzona w formie podręcznika użytkownika i publikacji akademickich, głównie po francusku i angielsku.
Społeczność Lisaac była niewielka, skupiona głównie wokół francuskich uczelni i grup badawczych. Nie powstały żadne znaczące projekty open source w tym języku poza samym kompilatorem. Warto jednak wspomnieć, że Lisaac był używany w kilku projektach badawczych nad weryfikacją kodu i generowaniem testów z kontraktów — te eksperymenty pokazały, że Design by Contract w modelu prototypowym może być równie efektywny jak w klasowym, a w niektórych scenariuszach nawet bardziej naturalny.
Mocne i słabe strony
Mocne strony to unikalne połączenie Design by Contract z prototypami, statyczne typowanie z inferencją i czytelna składnia. Kompilacja do C zapewnia dobrą wydajność i przenośność. Kontrakty realnie pomagają w pisaniu poprawnego kodu.
Słabe strony to ograniczona społeczność, brak nowoczesnych narzędzi deweloperskich (IDE, debugger, profiler) i skromna biblioteka standardowa. Język nigdy nie zdobył popularności poza francuskim środowiskiem akademickim. Prototypowy model z kontraktami, choć elegancki, wymaga przyzwyczajenia. Brak wsparcia dla nowoczesnych paradygmatów (async, reactive) i ograniczona interoperacyjność z innymi językami to kolejne bariery w szerszym zastosowaniu.
Podsumowanie
Lisaac to język dla tych, którzy wierzą, że jakość kodu i elastyczność mogą iść w parze. Jeśli cenisz Design by Contract, ale czujesz się ograniczony klasowym modelem Eiffela, Lisaac pokaże ci alternatywną drogę. Nie jest to język do codziennej pracy komercyjnej, ale jako źródło inspiracji i edukacji — bezcenny.

