To dobre pytanie! Pyta, czego oczekujemy od typów w języku pisanym na maszynie.
Najpierw zauważ, że za pomocą unitype możemy wpisać dowolny język programowania : po prostu wybierz literę, powiedz U
i powiedz, że każdy program ma typ U
. Nie jest to szczególnie przydatne, ale ma sens.
Istnieje wiele sposobów rozumienia typów, ale z punktu widzenia programisty następujące, które moim zdaniem są przydatne. Pomyśl o typie jako specyfikacji lub gwarancji . Powiedzieć, że ma typ A to znaczy, że „możemy zagwarantować / oczekiwać / popytu że e spełniają własności kodowanego przez A ”. Często A jest czymś prostym , w którym to przypadku właściwość jest po prostu „liczbą całkowitą”.miZAmiZAZAint
Nie ma końca, jak wyraziste mogą być twoje typy. Zasadniczo mogą to być wszelkiego rodzaju logiczne stwierdzenia, mogą wykorzystywać teorię kategorii i tak dalej itd. Na przykład typy zależne pozwolą ci wyrazić rzeczy takie jak „ta funkcja mapuje listy na listę, tak że dane wyjściowe są posortowane”. Możesz pójść dalej, w tej chwili słucham wykładu na temat „logiki separacji współbieżnej”, która pozwala mówić o tym, jak współbieżne programy działają ze stanem współdzielonym. Fantazyjne rzeczy.
Sztuka pisania w języku programowania polega na równoważeniu ekspresji i prostoty :
- bardziej ekspresyjne typy pozwalają nam bardziej szczegółowo wyjaśnić (sobie i kompilatorowi), co się dzieje
- prostsze typy są łatwiejsze do zrozumienia i mogą być łatwiej zautomatyzowane w kompilatorze. (Ludzie wymyślają typy, które zasadniczo wymagają asystenta dowodu i wkładu użytkownika w celu sprawdzenia typu).
Nie należy lekceważyć prostoty, ponieważ nie każdy programista ma doktorat z teorii języków programowania.
Wróćmy więc do pytania: skąd wiesz, że twój system typów jest dobry ? Cóż, udowodnij twierdzenia, które pokazują, że twoje typy są zrównoważone. Będą dwa rodzaje twierdzeń:
Twierdzenia, które mówią, że twoje typy są przydatne . Wiedza, że program ma typ, powinna oznaczać pewne gwarancje, na przykład, że program się nie utknie (byłoby to twierdzenie dotyczące bezpieczeństwa ). Inna rodzina twierdzeń połączyłaby typy z modelami semantycznymi , abyśmy mogli zacząć używać prawdziwej matematyki do dowodzenia rzeczy o naszych programach (byłyby to twierdzenia o adekwatności i wiele innych). Powyższy unitype jest zły, ponieważ nie ma tak użytecznych twierdzeń.
Twierdzenia, które mówią, że twoje typy są proste . Podstawową zasadą byłoby rozstrzygnięcie, czy dane wyrażenie ma dany typ. Inną funkcją prostoty jest podanie algorytmu wnioskowania o typie. Inne twierdzenia dotyczące prostoty brzmiałyby: że wyrażenie ma co najwyżej jeden typ lub że wyrażenie ma główny typ (tj. „Najlepszy” spośród wszystkich typów, które ma).
Trudno jest być bardziej szczegółowym, ponieważ typy są bardzo ogólnym mechanizmem. Ale mam nadzieję, że zobaczysz, o co powinieneś strzelać. Podobnie jak większość aspektów projektowania języka programowania, nie ma absolutnej miary sukcesu. Zamiast tego istnieje przestrzeń możliwości projektowania, a ważne jest, aby zrozumieć, gdzie w przestrzeni jesteś lub chcesz być.