Jaki język, Twoim zdaniem, pozwala przeciętnemu programistowi wyświetlać funkcje z najmniejszą ilością trudnych do znalezienia błędów? To jest oczywiście bardzo szerokie pytanie, a ja interesują mnie bardzo szerokie i ogólne odpowiedzi i mądrości.
Osobiście uważam, że spędzam bardzo mało czasu na szukaniu dziwnych błędów w programach Java i C #, podczas gdy kod C ++ ma odrębny zestaw powtarzających się błędów, a Python / podobny ma własny zestaw typowych i głupich błędów, które byłyby wykrywane przez kompilator w innych językach.
Trudno mi też brać pod uwagę języki funkcjonalne pod tym względem, ponieważ nigdy nie widziałem dużego i złożonego programu napisanego w pełni funkcjonalnym kodzie. Twój wkład proszę.
Edycja: Całkowicie arbitralne wyjaśnienie trudnego do znalezienia błędu: reprodukcja zajmuje więcej niż 15 minut lub ponad godzinę, aby znaleźć przyczynę i naprawić.
Wybacz mi, jeśli to duplikat, ale nie znalazłem nic na ten konkretny temat.
źródło
Odpowiedzi:
Im mocniejszy system typów języka, tym więcej błędów zostanie wychwyconych w czasie kompilacji.
Poniższy rysunek porównuje niektóre z dobrze znanych języków programowania pod względem mocy, prostoty i bezpieczeństwa ich systemów typów. [ Źródło ]
* Uwzględniając zdolność do używania niebezpiecznych konstrukcji.
źródło
(let ((itbe '())) ... )
...Moim zdaniem Haskell pomaga uniknąć niektórych typowych źródeł błędów:
null
nie jest częścią definicji typów wartości: dzięki temu można uniknąć błędu w miliardach dolarówźródło
null
, istniejeundefined
, który jest członkiem każdego typu.)Tradycyjnie najtrudniejsze do znalezienia błędy to takie same warunki wyścigowe w aplikacjach wielowątkowych
Dlatego potrzebujesz języków, które zarządzają dla ciebie paraliżem tak bardzo i nieinwazyjnie, jak to możliwe. Nie są to jeszcze główne nurty. Java robi trochę, ale zostawia cię z trudną częścią.
Według mnie potrzebujesz funkcjonalnego języka, ponieważ „brak efektów ubocznych” to przede wszystkim to, że dwa pociski znikają. Widziałem, że trwają prace nad przezroczystym uczynieniem Haskell wydajnym językiem wielowątkowym, i uważam, że Fortress został zaprojektowany od podstaw jako wydajny język równoległy.
Edycja: w Javie
Executors
obsłuż jeszcze więcej twardych części. Musisz dostosować poszczególne zadania doCallable
interfejsu.źródło
Ada została zaprojektowana tak, aby w miarę możliwości wychwytywano jak najwięcej podczas kompilacji, a nie w czasie wykonywania. Oznacza to, że często kompilacja programu w Adzie zajmuje około 10 razy więcej niż powiedziałby odpowiednik w Javie, ale kiedy się kompiluje, możesz być bardziej pewny, że całe klasy błędów nie pojawią się, gdy program biegać.
źródło
Po pierwsze definicja: trudny do znalezienia błąd, tak jak go rozumiem, to błąd, który można odtworzyć, ale jego przyczyna jest trudna do znalezienia.
Prawdopodobnie najważniejszym aspektem jest to, co nazwałbym wąskością , tj. Jak daleko może uciec błąd, jak duży jest zasięg, na jaki błąd może potencjalnie wpłynąć. W językach takich jak C błąd, np. Ujemny indeks tablicy lub niezainicjowany wskaźnik, może wpływać dosłownie na wszystko w całym programie, więc w najgorszym przypadku musisz sprawdzić wszystko wszędzie, aby znaleźć źródło problemu.
Dobre języki pod tym względem wspierają modyfikatory dostępu i egzekwują je w sposób, który utrudnia lub uniemożliwia ich obejście. Dobre języki zachęcają do ograniczenia zakresu zmiennych, zamiast zbyt łatwego posiadania zmiennych globalnych (np. „Wszystko, co nie zostało wyraźnie zadeklarowane, jest zmienną globalną o domyślnym typie i wartości”).
Drugim ważnym aspektem jest współbieżność . Warunki wyścigowe są na ogół trudne do odtworzenia, a zatem trudne do znalezienia. Dobre języki oferują łatwe w użyciu mechanizmy synchronizacji, a ich standardowe biblioteki lib są w razie potrzeby bezpieczne dla wątków.
To już uzupełnia moją listę; inne rzeczy, takie jak mocne pisanie, pomagają wykrywać błędy w czasie kompilacji, ale te błędy prawdopodobnie nie będą trudne do znalezienia później.
Biorąc to wszystko pod uwagę, powiedziałbym, że Java i C # oraz wiele innych języków w JVM i .net są odpowiednie, aby uniknąć trudnych do znalezienia błędów.
źródło
Ponieważ Excel jest najczęściej używanym DSL, skorzystam z Excela. (oczywiście z wyłączeniem VBA)
Pasuje do rachunku:
źródło
123
lubABC
) lub funkcja (=SUM(A2:A5)
). Excel następnie ocenia wszystkie zmienne, ustalając kolejność rozwiązywania zależności itp. Z pewnością nie są to tylko dane.To trudne pytanie, ponieważ większość błędów nie wynika z samego języka - raczej z winy programistów, którzy popełniają błędy w używaniu języka.
Uważam, że istnieje kilka aspektów funkcji językowych, które wpływają na prawdopodobieństwo błędów:
Interaktywność - dynamiczne języki z REPL zachęcają do interakcji / eksperymentów z uruchomionymi programami i znacznie mniejszymi cyklami kodu / testów. Jeśli uważasz, że iteracja jest dobrym sposobem na znalezienie czystych prostych rozwiązań i wykrycie / wyeliminowanie błędów, wówczas faworyzuje to interaktywne języki.
Ekspresyjność - jeśli kod jest krótszy i ma mniejszą złożoność / przypadkową złożoność, łatwiej jest dostrzec błędy / błędy logiczne.
Bezpieczeństwo typu - im więcej sprawdzania czasu kompilacji, tym więcej błędów zostanie wychwyconych przez kompilator, więc ogólnie bezpieczeństwo typu jest dobrą rzeczą. Jednak zwykle nie są trudne do znalezienia błędów - nawet w pełni dynamicznym języku niewłaściwy typ w strukturze danych zwykle powoduje bardzo oczywisty błąd w czasie wykonywania, a TDD prawie zawsze wykrywa takie błędy.
Niezmienność - wiele trudnych błędów jest spowodowanych złożonymi interakcjami stanu zmiennego. Języki, które podkreślają niezmienność (Haskell, Clojure, Erlang) mają ogromną przewagę, unikając zmienności
Programowanie funkcjonalne - funkcjonalne podejście do pisania kodu jest bardziej „możliwe do udowodnienia” niż kod obiektowy ze złożonymi sekwencjami efektów / interakcji. Z mojego doświadczenia wynika, że FP pomaga uniknąć trudnych błędów - wierzę, że są gdzieś jakieś badania naukowe, których obecnie nie mogę znaleźć, które to potwierdzają.
Obsługa współbieżności - problemy z współbieżnością są szczególnie trudne do wykrycia i debugowania, dlatego jest to tak ważne. Wszystko, co wymaga ręcznego blokowania, jest ostatecznie skazane na niepowodzenie (a obejmuje to prawie każde podejście obiektowe do współbieżności). Najlepszym językiem, jaki znam pod tym względem, jest Clojure - ma unikalne podejście do zarządzania współbieżnością, które łączy w sobie pamięć transakcyjną oprogramowania z niezmiennymi strukturami danych, aby uzyskać nowatorską, niezawodną i możliwą do skomponowania strukturę współbieżności. Aby uzyskać więcej informacji, zobacz http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
źródło
Im słabszy jest język, tym mniej opcji daje ci strzelanie własną stopą.
Języki wysokiego poziomu, takie jak Java i C #, będą generować mniej błędów niż języki niskiego poziomu, takie jak C ++.
Powiedziawszy, że uważam, że Java jest bezpieczniejsza niż C #. Java jest sztucznie ograniczona, więc przeciętny programista bez zaawansowanej wiedzy może ją opanować i tworzyć stabilne programy.
źródło
Moim zdaniem Delphi. Oparty na Pascalu, język jest wystarczająco prosty i intuicyjny, aby przeciętny programista (a nawet niedoświadczony programista) mógł go łatwo odczytać, a jego bogate narzędzie i obsługa biblioteki ułatwiają znalezienie większości błędów.
if (alert = RED) {LaunchNukes;}
nie zostanie skompilowany).źródło
var I: Integer; Pointer(I)^ := $00;
Jedną z rzeczy, które należy wziąć pod uwagę, jest zwrot w czasie.
Przez ostatnie pięć lat głównie tworzyłem aplikacje internetowe w Javie (JSF, Seam itp.). Niedawno dostałem nową pracę i korzystamy z Perla (z Catalyst i Moose).
W Perlu jestem znacznie bardziej produktywny niż w Javie.
Jednym z powodów jest brak konieczności kompilacji i (gorącej) instalacji. Uważam również, że pisanie przypadków użycia jest łatwiejsze, ponieważ można to zrobić w bardziej iteracyjny sposób. A frameworki w Javie wydają się niepotrzebnie złożone, przynajmniej w przypadku projektów, w które byłem zaangażowany.
Wydaje mi się, że liczba błędów w moim kodzie Perl jest mniej więcej taka sama jak liczba błędów w moim kodzie Java, może nawet być wyższa. Ale znajduję i łatwiej i szybciej znajduję i naprawiam te błędy.
źródło
Być może badanie liczby dostępnych narzędzi do statycznej i dynamicznej analizy kodu dla każdego języka programowania może dać pomysł. Im więcej narzędzi dla danego języka, tym bardziej prawdopodobne jest, że język ten jest albo bardzo popularny wśród użytkowników, albo bardzo popularny w generowaniu trudnych do znalezienia błędów. Ale nie mogę zmusić Google do wskazania jakichkolwiek badań na ten temat. Należy również zauważyć, że niektóre języki, takie jak C, mogą być używane do obejścia podstawowych błędów sprzętowych, a także do obejścia zużycia sprzętu w miarę starzenia się.
źródło
Zamiast mówić o językach, co z mówieniem o funkcjach językowych
źródło