W językach dynamicznych, takich jak JavaScript lub Python, typ zmiennej jest określany w czasie wykonywania. Jest to jeden z powodów, dla których są one wolniejsze niż języki pisane, takie jak Java.
Jak przeprowadzana jest kontrola typu? Co jest zasadniczym powodem, dla którego ten proces jest powolny?
Odpowiedzi:
Pytanie jest zamieszane.
Zakłada się, że sprawdzanie typu jest powolne, co niekoniecznie ma miejsce.
Pytanie wydaje się również mylić proces wysyłki typu ze sprawdzaniem typu i są to dwie różne rzeczy. Jeden to proces wykonywany w czasie wykonywania, drugi proces w czasie kompilacji. Podejrzewam, że tak naprawdę pytanie dotyczy wysyłki typu.
Wysyłanie typów może wprowadzać narzut w czasie wykonywania, ponieważ obliczenia spędzają czas na instrukcjach, które dynamicznie decydują o tym, jakie działanie należy podjąć, na podstawie typów wartości, które widzi w czasie wykonywania. np. w dynamicznym języku, jeśli zastosuję „+” do dwóch rzeczy, może to oznaczać dodawanie liczbowe lub łączenie ciągów, więc muszę poświęcić czas na sprawdzenie, co jest pod ręką, aby zdecydować, co robić. Istnieją strategie oceny, które mogą obniżyć koszty dynamicznej wysyłki. (np. śledzenie JIT)
Odnośnie do sprawdzania typu w JavaScript, patrz: http://www.cs.brown.edu/~sk/Publications/Papers/Published/gsk-flow-typing-theory/ . Aby uzyskać bardziej ogólny przegląd działania sprawdzania typów, algorytm opisuje standardowy podręcznik języka programowania. Na przykład http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/
źródło
Mówiąc najprościej, w nietypowych językach każdy punkt odniesienia do obiektu zawierającego zarówno typ, jak i wartość. Na przykład
var a = 3
wskazuje na instancję, która zawiera wartość 3 i typ int, jeśli to zrobisza = "bla"
, odwołanie zostanie zaktualizowane do instancji zawierającej ciąg „bla” i ciąg typu, stary obiekt zostanie odrzucony itp.Jest to powolne, ponieważ za każdym razem, gdy
a + b
należy wykonać operację (np. ) Na tym podstawowym typie, środowisko wykonawcze musi najpierw wyrejestrować obiekty, sprawdzić, czy ich typ jest kompatybilny, wykonać operację, utworzyć nowy obiekt.Natomiast
a + b
w C ++ lub Java sprawdza w czasie kompilacji , czy typy są poprawne i kompatybilne, a następnie a i b są przechowywane jako wartości bezpośrednie (nie odniesienia), a dodanie jest prostą operacją procesora na tych wartościach.Oczywiście wszystko to jest bardzo teoretyczne. W praktyce można wykonać wiele optymalizacji tego procesu, aby uniknąć większości kosztów ogólnych, a dynamicznie pisane języki mogą być dość szybkie.
źródło
Każda wartość jest przechowywana razem z jej rodzajem, który należy najpierw sprawdzić. Także konwersje mówią, że z ciągu na ciąg przechodzi przez kontrolę w locie.
źródło