Systemy typów zapobiegają błędom
Systemy typów eliminują nielegalne programy. Rozważ następujący kod Python.
a = 'foo'
b = True
c = a / b
W Pythonie ten program nie działa; rzuca wyjątek. W języku takim jak Java, C #, Haskell , cokolwiek, nie jest to nawet legalny program. Całkowicie unikasz tych błędów, ponieważ po prostu nie są one możliwe w zestawie programów wejściowych.
Podobnie lepszy system typów wyklucza więcej błędów. Jeśli przejdziemy do super zaawansowanych systemów typów, możemy powiedzieć coś takiego:
Definition divide x (y : {x : integer | x /= 0}) = x / y
Teraz system typów gwarantuje, że nie będzie żadnych błędów dzielenia przez 0.
Jakie błędy
Oto krótka lista rodzajów błędów, którym mogą zapobiec systemy
- Błędy poza zakresem
- Wstrzyknięcie SQL
- Uogólniając 2, wiele problemów związanych z bezpieczeństwem (po co sprawdzanie skażenia w Perlu )
- Błędy poza sekwencją (zapominanie o wywołaniu init)
- Wymuszanie użycia podzbioru wartości (na przykład tylko liczby całkowite większe niż 0)
Niegrzeczne kocięta (Tak, to był żart)
- Błędy utraty precyzji
- Błędy oprogramowania pamięci transakcyjnej (STM) (wymaga to czystości, która wymaga również typów)
- Uogólniając 8, kontrolując efekty uboczne
- Niezmienniki ponad strukturami danych (czy drzewo binarne jest zrównoważone?)
- Zapominanie wyjątku lub rzucanie niewłaściwego
I pamiętaj, że jest to również w czasie kompilacji . Nie musisz pisać testów ze 100% pokryciem kodu, aby po prostu sprawdzić błędy typu, kompilator to zrobi za Ciebie :)
Studium przypadku: Wpisany rachunek lambda
Dobra, przyjrzyjmy się najprostszemu ze wszystkich systemów typów, po prostu typowi rachunku lambda .
Zasadniczo istnieją dwa typy,
Type = Unit | Type -> Type
Wszystkie terminy są zmiennymi, lambdami lub aplikacjami. Na tej podstawie możemy udowodnić, że każdy dobrze napisany program kończy się. Nigdy nie ma sytuacji, w której program utknie lub zapętli się na zawsze. Nie jest to możliwe do udowodnienia w normalnym rachunku lambda, ponieważ cóż, to nieprawda.
Pomyśl o tym, możemy użyć systemów typów, aby zagwarantować, że nasz program nie zapętla się wiecznie, a raczej fajnie, prawda?
Objazd do typów dynamicznych
Systemy typu dynamicznego mogą oferować identyczne gwarancje jak systemy typu statycznego, ale w czasie wykonywania, a nie w czasie kompilacji. W rzeczywistości, ponieważ jest to środowisko wykonawcze, możesz zaoferować więcej informacji. Tracisz jednak pewne gwarancje, w szczególności dotyczące właściwości statycznych, takich jak zakończenie.
Dlatego typy dynamiczne nie wykluczają niektórych programów, ale raczej kierują źle sformułowane programy do dobrze zdefiniowanych akcji, takich jak zgłaszanie wyjątków.
TLDR
Długa i krótka jest to, że systemy typów wykluczają niektóre programy. Wiele programów jest w jakiś sposób zepsutych, dlatego w systemach typu unikamy tych zepsutych programów.