W skrócie: w jaki sposób kategoryzowane są systemy typów w kontekście akademickim; w szczególności, gdzie mogę znaleźć renomowane źródła, które wyraźnie rozróżniają różne systemy typów?
W pewnym sensie trudność związana z tym pytaniem nie polega na tym, że nie mogę znaleźć odpowiedzi, ale raczej na tym, że mogę znaleźć zbyt wiele i żadne z nich nie wyróżnia się jako poprawne. Tło stanowi próbę ulepszenia artykułu na wiki Haskell o pisaniu na maszynie , który obecnie ma następujące różnice:
- Bez pisania: w języku nie ma pojęcia typów ani z perspektywy typowania: w języku jest dokładnie jeden typ. Język asemblera ma tylko „wzorzec bitowy”, Rexx i Tk mają tylko „tekst”, rdzeń MatLab ma tylko typ „macierz o złożonej wartości”.
- Słabe pisanie: Istnieje tylko kilka wyróżnionych typów i być może synonimy typów dla kilku typów. Np. C używa liczb całkowitych dla logicznych, liczb całkowitych, znaków, zestawów bitów i wyliczeń.
- Mocne pisanie: drobnoziarnisty zestaw typów, takich jak w Adzie, wirthian (Pascal, Modula-2), Eiffel
Jest to całkowicie sprzeczne z moją osobistą percepcją, która bardziej przypominała:
- Słabe pisanie: Obiekty mają typy, ale są domyślnie konwertowane na inne typy, gdy wymaga tego kontekst. Na przykład Perl, PHP i JavaScript to wszystkie języki, w których
"1"
można używać mniej więcej w dowolnym kontekście1
. - Silne pisanie: Obiekty mają typy i nie ma niejawnych konwersji (chociaż można je symulować przy przeciążeniu), więc użycie obiektu w niewłaściwym kontekście jest błędem. W Pythonie indeksowanie tablicy ciągiem lub liczbą zmiennoprzecinkową powoduje wyjątek TypeError; w Haskell zakończy się niepowodzeniem w czasie kompilacji.
Poprosiłem o opinie na ten temat od innych osób bardziej doświadczonych w tej dziedzinie niż ja, a jedną z tych cech scharakteryzowałem:
- Słabe pisanie: Wykonywanie nieprawidłowych operacji na danych nie jest kontrolowane ani odrzucane, a jedynie powoduje nieprawidłowe / arbitralne wyniki.
- Silne pisanie: Operacje na danych są dozwolone tylko wtedy, gdy dane są zgodne z operacją.
Jak rozumiem, pierwsza i ostatnia charakterystyka nazwałaby C słabym typem, druga nazwałaby to silnym typem. Pierwszy i drugi wywoływałyby słaby typ Perla i PHP, a trzeci wywoływałby je silnie napisane. Wszyscy trzej opisaliby Python jako silnie wpisany.
Myślę, że większość ludzi powiedziałaby mi „no cóż, nie ma konsensusu, nie ma akceptowanego znaczenia terminów”. Jeśli osoby te są błędne, byłbym szczęśliwy, aby usłyszeć o tym, ale jeśli mają rację, to jak mają naukowcy CS opisać i porównać systemy typu? Jakiej terminologii mogę użyć, która jest mniej problematyczna?
Jako powiązane pytanie czuję, że dynamiczne / statyczne rozróżnienie jest często podawane w kategoriach „czasu kompilacji” i „czasu wykonywania”, co uważam za niezadowalające, biorąc pod uwagę, że to, czy język jest kompilowany, nie jest jego własnością jako jego implementacje. Uważam, że powinien istnieć czysto semantyczny opis pisania dynamicznego kontra statycznego; coś w stylu „języka statycznego to taki, w którym można wpisać każde podwyrażenie”. Byłbym wdzięczny za wszelkie przemyślenia, szczególnie odniesienia, które nadają temu pojęciu jasności.