P: Często słyszałem twierdzenie, że języki z dynamicznym pisaniem są bardziej wydajne niż języki z statycznym pisaniem. Jakie są przyczyny tego roszczenia? „
Ma to przyczyny historyczne. Jeśli cofniesz się o kilka dekad, języki dynamiczne były bezsprzecznie znacznie wydajniejsze niż języki statyczne (choć znacznie wolniejsze). Perl jest wyraźnie bardziej produktywny niż C, jeśli znasz oba i jedno z zadań na to pozwala. Jednak z biegiem czasu wiele języków zapożyczało się od siebie, a nowsze języki zmniejszają lukę (zarówno pod względem wydajności, jak i wydajności).
Oto kilka punktów do rozważenia:
Śmieci : Śmieci to ogromny wzrost wydajności. Wierzę, że Java była pierwszym głównym językiem statycznym z GC. Wcześniej statyczne oznaczało w zasadzie ręczne zarządzanie pamięcią. (Uwaga: tutaj i poniżej rozważam tylko języki głównego nurtu. Istnieje wiele języków eksperymentalnych i niszowych, które zapewnią kontrprzykłady w każdym punkcie, który podniosę.)
Bezpieczeństwo pamięci : Jest to poprawa wydajności, dzięki której nie musisz się martwić o strzelanie sobie w stopę. Przed „zarządzanymi” językami statycznymi, takimi jak Java, statyczny zwykle oznaczał bezpośredni dostęp do pamięci. Debugowanie jest również częścią wydajności, a niebezpieczny dostęp do pamięci może prowadzić do naprawdę niejasnych błędów.
Uciążliwe systemy typu. Przed wprowadzeniem sparametryzowanych typów (takich jak szablony lub generyczne) w językach statycznych ograniczenia systemów typów statycznych często stanowiły obciążenie. Na przykład w Javie trzeba było jawnie spuszczać za każdym razem, gdy wybierasz element z kolekcji. Masz syntaktyczny narzut obsady i nie masz żadnego bezpieczeństwa. Biorąc pod uwagę, jak wszechobecne są kolekcje w programowaniu, była to poważna wada.
Konieczność zadeklarowania rodzaju wszystkiego jest zbyteczna, ale przy nowoczesnym wnioskowaniu można to znacznie zmniejszyć.
Duża standardowa biblioteka. Python był reklamowany jako „dołączone baterie” ze względu na dużą standardową bibliotekę. To w porównaniu z C, które mają bardzo minimalistyczną standardową bibliotekę. Jednak w przypadku platform takich jak Java i .net ogromna standardowa biblioteka staje się standardem, a nowsze języki, takie jak Scala i F #, dziedziczą to „za darmo”.
Struktury danych pierwszej klasy. Dynamiczne języki, takie jak Perl i Python, mają wbudowane pierwszorzędne struktury danych, takie jak listy i mapy, z wygodnymi skrótami składniowymi do typowych operacji. W porównaniu z tym C nie ma wbudowanych kolekcji oprócz tablic o stałym rozmiarze.
Zamknięcia i składnia lambda - języki dynamiczne zwykle miały to od samego początku, ale języki statyczne przyjęły to, ostatnio Java.
REPL umiejętność szybkiego testowania fragmentów kodu interaktywnie jest ogromnym dobrodziejstwem. Ale chociaż narzędzia IDE, takie jak „bezpośrednie” okno w Visual Studio, języki statyczne mogą do pewnego stopnia to emulować.
Zaawansowane oprzyrządowanie - oprócz powyższych punktów, w których języki statyczne zbliżają się do wygody języków dynamicznych, nowi redaktorzy korzystają z analizy statycznej w taki sposób, że języki dynamiczne mają trudności z dopasowaniem. Na przykład redaktorzy mogą zapewnić bezpieczne automatyczne refaktoryzacje, co jest ściśle mówiąc niemożliwe w dynamicznym języku.
Konkluzja: Historycznie to była prawda, ale dziś odpowiedź jest mniej jednoznaczna.
P: Więc: co można powiedzieć o wydajności z dynamicznym pisaniem, która naprawdę jest zaletą samego modelu pisma?
Nieco trudno jest oddzielić dynamiczny model pisania od dynamicznych języków, ale na przykład C # przyjęło bardziej dynamiczne funkcje z czasem, mimo że jego rdzeniem jest język statyczny. To naprawdę dowód na korzyść modelu typu dynamicznego. Przykłady:
Odbicie
Odbicie jest zasadniczo funkcją dynamicznego pisania. Rodzaje obiektów są sprawdzane w środowisku wykonawczym niż czas kompilacji. Kiedy został wprowadzony, było to trochę zaniepokojone, ale w C # użycie odbicia staje się coraz bardziej wszechobecne, na przykład ASP.Net MVC mocno wykorzystuje odbicie.
Atrybuty
Atrybuty są przykładem dynamicznego pisania. Możesz dodać dowolne atrybuty do klasy w czasie kompilacji, a następnie sprawdzać w czasie wykonywania (poprzez odbicie) i manipulować obiektami na jej podstawie. Coś w rodzaju MEP to w zasadzie struktura rozszerzenia oparta na modelu typu dynamicznego.
Linq do SQL, EF mv.
Różne transformatory Linq sprawdzają zapytania jako obiekty wykonawcze i generują sql w locie. Nie robi się bardziej dynamiczny niż sprawdzanie kodu w czasie wykonywania. CodeDom to druga strona medalu, w której kod może być generowany w czasie wykonywania
Roslyn
Roslyn w zasadzie implementuje eval
, co kiedyś uważano za cechę definiującą naprawdę dynamiczny język.
Dynamiczny
Typ dynamic
jest najbardziej dynamiczną funkcją w języku C # i jest reklamowany w celu uproszczenia i zwiększenia wydajności interakcji z obiektami zewnętrznymi i językami. Ale dla wygody jest również używany w Asp.net MVC.
Zaleta wszystkich powyższych funkcji pokazuje, że model dynamiczny ma określone zalety nawet w języku statycznym z typami sparametryzowanymi, typami strukturalnymi i wnioskowaniem typu.