Oryginalny tweeter tutaj. :)
Przede wszystkim jestem nieco rozbawiony / zszokowany tym, że mój tweet jest traktowany tak poważnie! Gdybym wiedział, że będzie to tak szeroko rozpowszechnione, spędziłbym ponad 30 sekund na pisaniu tego!
Thiago Silva słusznie zauważa, że „statyczny” i „dynamiczny” dokładniej opisują sprawdzanie typu , a nie systemy typu . W rzeczywistości stwierdzenie, że język jest wpisywany statycznie lub dynamicznie, jest niedokładne. Język ma raczej system typów, a implementacja tego języka może wymusić system typów przy użyciu sprawdzania statycznego lub dynamicznego, albo jedno i drugie, lub oba (choć nie byłaby to bardzo atrakcyjna implementacja językowa!).
Tak się składa, że istnieją pewne systemy typów (lub cechy systemów typów), które są bardziej podatne na sprawdzanie statyczne, i są pewne systemy typów (lub cechy systemów typów), które są bardziej podatne na sprawdzanie dynamiczne. Na przykład, jeśli twój język pozwala ci określić w tekście programu, że określona wartość musi zawsze być tablicą liczb całkowitych, to dość rozsądnie jest napisać statyczny moduł sprawdzający, aby zweryfikować tę właściwość. I odwrotnie, jeśli twój język ma podtypy i jeśli pozwala na downcasting, to dość łatwo jest sprawdzić poprawność downcastu w czasie wykonywania, ale niezwykle trudno to zrobić w czasie kompilacji.
To, co naprawdę rozumiem przez mój tweet, to po prostu to, że zdecydowana większość implementacji językowych wykonuje pewną część dynamicznego sprawdzania typów. Lub, równoważnie, ogromna większość języków ma pewne funkcje, które są trudne (jeśli nie niemożliwe) do sprawdzenia statycznego. Przykładem jest downcasting. Inne przykłady obejmują przepełnienie arytmetyczne, sprawdzanie granic tablic i sprawdzanie wartości NULL. Niektóre z nich można sprawdzić statycznie w niektórych okolicznościach, ale ogólnie rzecz biorąc, trudno byłoby znaleźć implementację języka, która nie wykonuje żadnej kontroli w czasie wykonywania.
to nie jest zła rzecz. To tylko spostrzeżenie, że istnieje wiele interesujących właściwości, które chcielibyśmy egzekwować w naszych językach i że tak naprawdę nie wiemy, jak to sprawdzić statycznie. Jest to przypomnienie, że rozróżnienia, takie jak „typy statyczne” w porównaniu z „typami dynamicznymi”, nie są tak wyraźne, jak niektórzy chcieliby, by ci się wydawało. :)
Ostatnia uwaga: terminy „silny” i „słaby” nie są tak naprawdę używane w społeczności badaczy języków programowania i nie mają tak naprawdę spójnego znaczenia. Ogólnie stwierdziłem, że kiedy ktoś mówi, że język ma „mocne pisanie”, a jakiś inny język ma „słabe pisanie”, to tak naprawdę mówi, że ich ulubiony język (ten z „mocnym pisaniem”) uniemożliwia mu popełniając jakiś błąd, że inny język (ten z „słabym pisaniem”) nie - lub odwrotnie, że ich ulubiony język (ten z „słabym pisaniem”) pozwala im zrobić coś fajnego, że drugi język ( jeden z „silnym pisaniem”) nie.