Tak, zadawano podobne pytania, ale zawsze w celu ustalenia „które z nich jest lepsze”.
Pytam, ponieważ pojawiłem się jako programista przede wszystkim w JavaScript i tak naprawdę nie mam dużego doświadczenia w pisaniu w statycznie pisanych językach.
Mimo to zdecydowanie widzę wartość w nauce języka C do obsługi wymagających operacji na niższych poziomach kodu (co, jak zakładam, ma wiele wspólnego ze statycznym vs dynamicznym na poziomie kompilatora), ale tym, co próbuję ominąć jest to, czy istnieją specyficzne konteksty projektu (może pewne typy dynamicznych operacji intensywnie wykorzystujących dane?) obejmujące rzeczy inne niż wydajność, w których znacznie bardziej sensowne jest używanie Java lub C # w porównaniu z Pythonem.
dynamic-typing
static-typing
Erik Reppen
źródło
źródło
Odpowiedzi:
Tak, zdecydowanie.
Pisanie dynamiczne ma zdecydowane zalety w przypadkach, w których chcesz traktować wszystko jako jeden typ. Serializacja / deserializacja jest jednym z klasycznych przykładów. Dlatego tak dużo programowania WWW wykonuje się w dynamicznie pisanych językach skryptowych: są one dobrze dostosowane do zadania, które wymaga dużej ilości konwersji wszelkiego rodzaju danych na i z łańcuchów.
Z drugiej strony do programowania aplikacji języki statyczne działają znacznie lepiej, ponieważ próba traktowania wszystkiego jako jednego typu nie jest często wymagana. Często chcesz mieć wydajne struktury danych, w których dane są przedstawiane jako same i nie są bardzo często przekształcane w inne typy. To sprawia, że funkcje dynamicznego pisania są wadą, a nie korzyścią, dlatego aplikacje są prawie wyłącznie pisane w językach o typie statycznym.
źródło
Patrząc na to, jeśli potrafisz naturalnie pracować w języku o typie statycznym, to dobrym rozwiązaniem jest pisanie statyczne. Ogólnie rzecz biorąc, celem systemu typów jest zapobieganie wykonywaniu operacji z niezdefiniowaną semantyką
(string) "hello" + (bool) true
. Dodatkowy poziom bezpieczeństwa uniemożliwiający wykonywanie tych operacji może być dobrym sposobem na uniknięcie błędów w kodzie, nawet bez obszernych testów jednostkowych. Oznacza to, że bezpieczeństwo typu zapewnia kolejny poziom pewności co do poprawności semantycznej kodu.Ale systemy typów są bardzo trudne do prawidłowego działania. Nie wierzę, że jest to doskonały układ typu w przyrodzie w momencie pisania tego tekstu. (Przez „idealny system typów” mam na myśli ścisły system typów, który nie wymaga pełnych adnotacji kodu, który nie generuje fałszywych błędów typu, i których błędy typu są łatwe do zrozumienia dla programisty.) Ponadto, może trudno jest zrozumieć naprawdę dobre systemy typu, które istnieją. Kiedy uczyłem się Haskell, nie mogę powiedzieć wam liczby niejasnych błędów typu, które wystąpiły podczas próby napisania czegoś, co wyglądało (dla mnie) jak poprawny kod. Zwykle kod nie był właściwie poprawny (co jest zaletą dla systemu typów), ale zabrał dużo czasupracy, aby zrozumieć komunikaty o błędach z kompilatora, abym mógł rozwiązać podstawowe problemy. W językach OO możesz w końcu pomyśleć: „ten argument powinien być sprzeczny z typem wejściowym, a nie kowariantnym!” Lub (bardziej prawdopodobne) powrócić do typecastów, aby uciec od granic systemu typów. Systemy typów mogą być znacznie trudniejsze, niż myślisz.
Jeśli chodzi o to, co warto, rozumiem, że trudność w znalezieniu dobrych systemów typu jest częścią tego, co zmotywowało Gilada Brachę do włączenia wtykowej obsługi systemu typów w Newspeak.
źródło
Są to różne narzędzia, ale nie zależy to od wydajności. Chodzi o złożoność .
Języki dynamiczne zwykle dążą do maksymalnej elastyczności, co niesie ze sobą brak walidacji i rodzaj gwarancji. Następnie jest bardzo wydajny w programach na małą skalę, ale utrzymanie programów na dużą skalę (złożoność) staje się prawie niemożliwe.
Języki statyczne zwykle mają na celu maksymalną walidację. Ich pierwszym celem jest zwykle wykrywanie błędów (lub błędów) jak najwcześniej. Na walidację składa się wiele gwarancji. Wówczas trudniej jest się nauczyć i zacząć, ale w miarę powiększania się programów zapewnia lepszą weryfikację programu przy znacznie niższych kosztach (wysiłki związane z kodowaniem).
W rezultacie języki dynamiczne zwykle pasują do małych (mam na myśli bardzo małe) programów, takich jak dynamiczne strony internetowe, DSL przeglądarki internetowej (nie dla aplikacji przeglądarki!) Lub skrypty powłoki. Języki statyczne lepiej pasują do programowania systemu lub innych rzeczy.
Powyższe opisy dotyczą bardzo czysto dynamicznych lub statycznych języków. Większość prawdziwych języków znajduje się pomiędzy nimi i wykazuje różne cechy.
Zobacz tutaj po więcej szczegółów: https://softwareengineering.stackexchange.com/a/105417/17428
źródło
Obecnie programuję w językach statycznych (C # i F #), ale lubię programować w językach dynamicznych (Smalltalk, Ruby). Istnieje wiele zalet i wad, które ludzie kojarzą z jednym typem w porównaniu do drugiego, które są bardziej związane z językiem niż w przypadku egzekwowania typów. Na przykład języki dynamiczne mają zwykle czystszą, bardziej zwięzłą składnię, jednak F # i OCaml z systemem wnioskowania o typie mają tak samo czystą składnię jak każdy język dynamiczny. A przy pisaniu statycznym masz prawdziwe automatyczne refaktoryzacje i autouzupełnianie, ale Smalltalk, z całym kodem źródłowym w bazie danych i każdą metodą skompilowaną osobno, był pierwszym językiem, który naprawdę miał poważne automatyczne refaktoryzacje i działał świetnie. Ostatecznie współczesne języki dynamiczne i statyczne są dziś bezpieczne dla typów, co jest najważniejszym aspektem twojego systemu typów,
źródło
Jest rok 2015, który dodaje kilka interesujących fragmentów do rozmowy:
Więc faceci backendowi są zmęczeni niepotrzebną prostą kurtką ścisłego pisania, podczas gdy faceci frontendu są zmęczeni chaosem dynamicznego pisania.
Całkiem ironiczne: zastanawiam się, czy spotkają się w środku, czy też przebiegną obok siebie z dźwiękowym hukiem upływającego terminu ...? ;)
źródło