Ponieważ wspominasz o Pythonie, pytanie nie jest czysto teoretyczne. Dlatego staram się dać szersze spojrzenie na typy. Rodzaje są różne dla różnych ludzi. Zebrałem co najmniej 5 różnych (ale powiązanych) pojęć typów:
Systemy typów są systemami logicznymi i teoriami zestawów.
System typów wiąże typ z każdą obliczoną wartością. Badając przepływ tych wartości, system typów próbuje udowodnić lub zapewnić, że nie wystąpią żadne błędy typu.
Typ to klasyfikacja identyfikująca jeden z różnych typów danych, takich jak wartość rzeczywista, liczba całkowita lub wartość logiczna, która określa możliwe wartości dla tego typu; operacje, które można wykonać na wartościach tego typu; znaczenie danych; oraz sposób przechowywania wartości tego typu
Abstrakcyjne typy danych pozwalają na abstrakcję danych w językach wysokiego poziomu. ADT są często implementowane jako moduły: interfejs modułu deklaruje procedury odpowiadające operacjom ADT. Ta strategia ukrywania informacji umożliwia zmianę implementacji modułu bez zakłócania programów klienckich.
Implementacje języka programowania wykorzystują typy wartości do wybrania miejsca potrzebnego na wartości oraz algorytmów operacji na wartościach.
Cytaty pochodzą z Wikipedii, ale w razie potrzeby mogę podać lepsze referencje.
Typy-1 powstały z pracy Russela, ale dziś nie są one jedynie ochroną przed paradoksami: język maszynopisany w teorii typów homotopii to nowy sposób kodowania matematyki w formalnym, zrozumiałym dla maszyny języku, i nowy sposób rozumienia podstaw przez ludzi matematyki. („Stary” sposób to kodowanie przy użyciu aksjomatycznej teorii zbiorów).
Rodzaje 2-5 powstały w programowaniu z kilku różnych potrzeb: aby uniknąć błędów, sklasyfikować dane, z którymi współpracują projektanci i programiści, zaprojektować duże systemy i odpowiednio zaimplementować języki programowania.
Systemy typów w C / C ++, Ada, Java, Python nie powstały z pracy Russel lub chęci uniknięcia błędów. Powstały z potrzeby opisania różnych rodzajów danych (np. „Nazwisko jest ciągiem znaków, a nie liczbą”), zmodularyzowania projektu oprogramowania i optymalnego wyboru reprezentacji niskiego poziomu dla danych. Te języki nie mają typów-1 ani typów-2. Java zapewnia względne bezpieczeństwo przed błędami nie poprzez udowodnienie poprawności programu za pomocą systemu typów, ale przez staranne zaprojektowanie języka (bez arytmetyki wskaźników) i systemu wykonawczego (maszyna wirtualna, weryfikacja kodu bajtowego). System typów w Javie nie jest systemem logicznym ani teorią zbiorów.
Jednak system pisma w języku programowania Agda jest nowoczesną odmianą systemu pisma Russela (opartego na późniejszych pracach lub Per Martin-Lof i inni matematycy). System typów w Agdzie jest zaprojektowany do wyrażania matematycznych właściwości programu i potwierdzania tych właściwości, jest to system logiczny i teoria mnogości.
Nie ma tu czarno-białego rozróżnienia: między wieloma językami. Na przykład system typów języka Haskell ma swoje korzenie w twórczości Russela, może być postrzegany jako uproszczony system Agdy, ale z matematycznego punktu widzenia jest niespójny (wewnętrznie sprzeczny), jeśli jest postrzegany jako system logiczny lub teoria zestawów.
Jednak jako teoretyczny pojazd do ochrony programów Haskell przed błędami działa całkiem dobrze. Możesz nawet używać typów do kodowania niektórych właściwości i ich dowodów, ale nie wszystkie właściwości można zakodować, a programista może nadal naruszać sprawdzone właściwości, jeśli użyje zniechęconych brudnych hacków.
System czcionek Scala jest jeszcze bardziej oddalony od pracy Russela i doskonałego języka dowodowego Agdy, ale nadal ma swoje korzenie w twórczości Russela.
Jeśli chodzi o sprawdzanie właściwości języków przemysłowych, których systemy typów nie zostały zaprojektowane do tego celu, istnieje wiele podejść i systemów.
Aby uzyskać ciekawe, ale różne podejścia, zobacz projekt badawczy Coq i Microsoft Boogie. Coq polega na teorii typów w celu generowania programów imperatywnych z programów Coq. Boogie opiera się na adnotacjach programów imperatywnych o właściwościach i udowadnianiu tych właściwości za pomocą twierdzenia twierdzenia Z3, stosując zupełnie inne podejście niż Coq.