Charity — jezyk, ktory chcial udowodnic, ze programowanie moze byc matematyka

Definicja pojęcia Charity — jezyk, ktory chcial udowodnic, ze programowanie moze byc matematyka

Czym jest Charity i dlaczego warto go poznać

Charity to funkcyjny język programowania stworzony w celach badawczych, który powstał na University of Calgary pod kierunkiem Robin Cocketta. Język ten opiera się na teorii kategorii i realizuje koncepcję tzw. distributive category — struktury algebraicznej, która pozwala na eleganckie modelowanie typów danych i operacji na nich. Charity nie jest językiem, który spotkacie w produkcji ani w ogłoszeniach o pracę, ale jego idee są fascynujące z perspektywy teorii języków programowania.

Dlaczego w ogóle warto o nim wiedzieć? Bo Charity reprezentuje nurt myślenia o programowaniu, w którym każdy program jest gwarancją terminacji. Tak, dobrze czytacie — w Charity każdy program się kończy. Nie ma tu pętli w tradycyjnym sensie, nie ma while(true), nie ma nieskończonej rekurencji. Język wymusza na programiście pisanie kodu, który zawsze się zatrzyma, i robi to na poziomie systemu typów i struktury języka, a nie za pomocą timeoutów czy watchdogów.

Współczesne dyskusje o total functional programming — czyli programowaniu, w którym każda funkcja jest totalna (zdefiniowana dla każdego wejścia i zawsze zwracająca wynik) — czerpią z idei, które Charity eksplorował dekady temu. Jeśli interesujecie się teorią stojącą za językami takimi jak Idris, Agda czy Dhall, Charity jest ciekawym przystankiem na tej drodze.

Krótka historia i ewolucja

Charity powstał w połowie lat 90. na University of Calgary w Kanadzie. Robin Cockett i jego zespół pracowali nad formalizacją pojęcia distributive category i chcieli pokazać, że ta abstrakcyjna struktura z teorii kategorii może służyć jako fundament języka programowania. Pierwsza implementacja była interpreterem napisanym w C, działającym w trybie tekstowym.

Język nigdy nie wyszedł poza fazę badawczą. Nie miał rozbudowanej społeczności, nie doczekał się komercyjnych wdrożeń ani adaptacji w przemyśle. Ale to nie był jego cel — Charity był narzędziem do eksploracji pewnych idei, a nie produktem rynkowym. W tym sensie spełnił swoją rolę: pokazał, że można zbudować język, w którym terminacja jest wbudowana w samą strukturę, a nie dodana jako afterthought.

Z czasem Charity został zastąpiony przez nowocześniejsze narzędzia badawcze. Idee, które eksplorował, żyją dalej w językach zależnie typowanych (dependently typed) oraz w badaniach nad programowaniem totalnym. Sam interpreter jest dziś raczej ciekawostką archiwalną niż praktycznym narzędziem.

Kluczowe cechy i filozofia

Podstawą Charity jest koncepcja distributive category. Brzmi strasznie, ale w praktyce chodzi o to, że język oferuje dwa fundamentalne typy operacji: konstruktory (budujące dane) i destruktory (rozkładające dane na części). Każda operacja w Charity jest albo jednym, albo drugim, a reguły kompozycji tych operacji są ściśle określone przez aksjomaty kategorii dystrybutywnej.

System typów w Charity jest silny i statyczny, ale wygląda zupełnie inaczej niż w Haskellu czy ML-u. Zamiast tradycyjnych definicji typów algebraicznych, programista definiuje typy przez podanie ich konstruktorów i destruktorów wraz z regułami redukcji. To podejście jest bliższe temu, co znajdziecie w teorii kategorii niż w typowym programowaniu funkcyjnym.

Najbardziej uderzającą cechą Charity jest gwarancja terminacji. Język nie dopuszcza ogólnej rekurencji — zamiast tego oferuje kontrolowane schematy rekurencji, które z samej konstrukcji gwarantują zakończenie obliczeń. To oznacza, że Charity nie jest Turing-kompletny, i to nie jest bug, tylko feature. W świecie, w którym debugujemy wycieki pamięci i nieskończone pętle, idea języka, w którym te problemy po prostu nie istnieją, jest odświeżająca.

Składnia Charity jest surowa i akademicka. Nie znajdziecie tu lukru składni, operatorów pipe ani pattern matchingu w stylu Haskella. Język wygląda bardziej jak formalny zapis matematyczny niż jak narzędzie do codziennej pracy, co jest zarówno jego siłą (precyzja), jak i słabością (próg wejścia).

Gdzie Charity sprawdza się najlepiej

Charity nie sprawdza się w produkcji — i nigdy nie miał. To język badawczy, stworzony do eksploracji idei z pogranicza teorii kategorii i informatyki. Jego naturalnym środowiskiem są artykuły naukowe, wykłady z teorii języków programowania i dyskusje o fundamentalnych własnościach systemów typów.

Jeśli pracujecie nad własnym językiem programowania albo systemem typów, Charity może być cennym źródłem inspiracji. Pokazuje, jak daleko można posunąć gwarancje na poziomie systemu typów, zanim język stanie się niepraktyczny. To cenna lekcja dla każdego, kto projektuje DSL-e albo embedded languages.

W edukacji Charity bywał używany do nauczania studentów o związkach między teorią kategorii a programowaniem. Dziś tę rolę przejęły nowocześniejsze narzędzia, ale historyczne znaczenie Charity pozostaje niezaprzeczalne.

Jak wygląda kod w Charity

Typowy program w Charity wygląda mniej więcej tak:

datatype nat = zero | succ(nat);

coDatatype stream = head -> nat & tail -> stream;

Powyższy fragment definiuje typ liczb naturalnych (z konstruktorem zero i succ) oraz kotyp (codatatype) strumienia, który jest nieskończoną sekwencją liczb naturalnych. Zwróćcie uwagę na rozróżnienie między datatype (typy indukcyjne, budowane od dołu) a coDatatype (typy koindukcyjne, obserwowane od góry) — to kluczowy koncept w Charity.

Operacje na tych typach definiuje się przez podanie reguł redukcji, które określają, jak destruktory interagują z konstruktorami. To zupełnie inny model niż pattern matching w ML-owatych językach, choć efekt bywa podobny.

Ekosystem i narzędzia

Ekosystem Charity jest minimalny — interpreter, dokumentacja akademicka i kilka artykułów naukowych. Nie ma tu menedżera pakietów, nie ma bibliotek na GitHubie, nie ma pluginów do VS Code. Język był dystrybuowany jako źródła do samodzielnego skompilowania, a jego społeczność ograniczała się do grupy badaczy na University of Calgary i kilku zapaleńców teorii kategorii.

Dokumentacja Charity ma charakter akademicki — to przede wszystkim artykuły Cocketta i jego współpracowników, publikowane w czasopismach z dziedziny teoretycznej informatyki. Nie znajdziecie tutoriali na YouTube ani postów na blogach. Jeśli chcecie zgłębić temat, musicie sięgnąć po literaturę naukową.

Dla współczesnego programisty najciekawszym „narzędziem” związanym z Charity są jego idee — te same koncepcje znajdziecie w bardziej przystępnej formie w językach takich jak Agda, Idris czy nawet w zaawansowanych feature’ach Haskella (GADTs, type families).

Mocne i słabe strony

Największą siłą Charity jest jego matematyczna elegancja i precyzja. Gwarancja terminacji to nie jest coś, co dostajecie w mainstreamowych językach — nawet w Haskellu undefined i error mogą spowodować nieskończone zapętlenie. Charity eliminuje tę możliwość na poziomie projektu języka, co jest imponującym osiągnięciem teoretycznym.

Z drugiej strony, ta sama cecha jest największym ograniczeniem. Brak Turing-kompletności oznacza, że nie napiszecie w Charity interpretera dowolnego innego języka, nie zaimplementujecie serwera HTTP ani bazy danych. Język jest z założenia ograniczony do obliczeń, które się kończą, co wyklucza większość realnych zastosowań.

Składnia i krzywa uczenia się to kolejne problemy. Charity wymaga od programisty znajomości teorii kategorii na poziomie, który wykracza daleko poza typowe wykształcenie informatyczne. To sprawia, że język jest dostępny tylko dla wąskiej grupy odbiorców.

Podsumowanie

Charity to język dla tych, którzy traktują programowanie jako gałąź matematyki i chcą zrozumieć, jak daleko można posunąć formalne gwarancje w systemie typów. Nie jest to narzędzie do codziennej pracy, ale raczej intelektualna przygoda, która poszerza horyzonty.

Jeśli na co dzień piszecie w Haskellu, Rust albo TypeScript i chcecie zobaczyć, jak wygląda język, w którym teoria kategorii nie jest tylko inspiracją, ale bezpośrednim fundamentem — Charity jest wart przynajmniej pobieżnego poznania. Kto wie, może idee z Charity za dekadę staną się mainstreamem, tak jak monady z Haskella stały się nim dwie dekady temu.

Pozostałe definicje

Charity to funkcyjny jezyk oparty na teorii kategorii, stworzony na University of Calgary. Poznaj idee distributive category i dlaczego ten jezyk jest fascynujacy dla teoretykow jezykow programowania.
Scroll to Top
Framework
Języki Programowania
Stanowisko
Co to jest