Po wzięciu udziału w tegorocznym konkursie Google Code Jam i po jego zakończeniu zauważyłem niesamowitą liczbę [odnoszących sukcesy] uczestników, którzy używali C / C ++ i Javy. Rozkład języków używanych podczas konkursu można zobaczyć tutaj .
Po kilku latach programowania w C / C ++, niedawno zakochałem się w Pythonie za jego czytelną / prostą naturę. Niedawno nauczyłem się języków funkcjonalnych, takich jak OCaml, Scheme, a nawet języków logicznych, takich jak Prolog. Te języki z pewnością mają swoje zalety i, moim zdaniem, w pewnych sytuacjach można je łatwiej zastosować niż C ++ i Java. Na przykład użycie call / cc w Scheme upraszcza cofanie (narzędzie wymagane do odpowiedzi na kilka problemów), a specyfikacja logiki Prologu, choć nieefektywna ze względu na jej brutalny charakter, może drastycznie uprościć (a nawet automatycznie rozwiązać) pewne problemy, które są trudne do rozwiązania. owinąć mózg wokół.
Oczywiste jest, że uczestnik konkursu powinien korzystać z narzędzi, które najlepiej nadają się do wyzwania. Nawet montaż x86 jest kompletny w Turingu - to nie usprawiedliwia rozwiązywania z nim problemów. W tym przypadku, dlaczego zawodnicy, którzy używają mniej popularnych języków, takich jak Scheme / Lisp, Prolog, a nawet Python, odnoszą znacznie mniejsze sukcesy niż zawodnicy używający C / C ++ i Java? Mówiąc inaczej, dlaczego zawodnicy odnoszący sukcesy nie używają języków, które chociaż mogą być mniej popularne, są prawdopodobnie lepszymi narzędziami do pracy?
Moje pytanie ma kilka powodów. Przede wszystkim chciałbym zostać lepszym programistą - zarówno od strony praktycznej, jak i konkurencyjnej. Po zapoznaniu się z tak pięknymi paradygmatami, jak programowanie funkcjonalne i logiczne, zniechęcające jest, gdy tak wielu ludzi odrzuca je na rzecz C / C ++ i Javy. To nawet sprawia, że kwestionuję swój podziw dla wspomnianych paradygmatów, martwiąc się, że nie mogę odnieść sukcesu jako programista Lisp / Scheme / Prolog w konkursie programistycznym.
źródło
Odpowiedzi:
Świetne pytanie! Jako ktoś, kto sam parał się trochę konkursami programistycznymi, mogę mieć coś do powiedzenia.
[Usuńmy standardowe zastrzeżenie: programowanie konkursowe jest tylko luźno związane z „programowaniem w prawdziwym świecie”, a podczas gdy testuje umiejętności algorytmiczne i umiejętności rozwiązywania problemów, a także zdolność do szybkiego tworzenia działającego kodu bez błędów w presja czasu, niekoniecznie koreluje z możliwością tworzenia dużych projektów oprogramowania, pisania kodu, który można konserwować itp. (poza faktem, że programy o dobrej strukturze są łatwiejsze do debugowania).]
A teraz kilka odpowiedzi:
C ++ / Java są również bardziej powszechne niż inne języki w świecie rzeczywistym, więc można się spodziewać, że wszędzie będzie ich więcej. (Ale w populacji zawodników jest jeszcze wyższy.)
Wielu z tych uczestników jest studentami lub brało udział w konkursach jako studenci, a C ++ / Java są bardziej popularnymi „pierwszymi językami”, których uczą się uczniowie. (W dzisiejszych czasach studenci studiów licencjackich mogą zaczynać od Scheme, Haskell, Python itp., Ale licealiści (często samoukowie) rzadziej). W rzeczywistości wielu uczestników z Europy Wschodniej nadal używa Pascala i są z nim bardziej niesamowici niż reszta z nas będzie kiedykolwiek posługiwać się jakimkolwiek językiem.
W konkursach na poziomie szkoły i uczelni zazwyczaj używa się tych języków. Międzynarodowa Olimpiada Informatyczna (IOI) dopuszcza tylko C, C ++ i Pascal (a może teraz pozwala na Javę; nie nadążałem), a ACM Intercollegiate Programming Contest (ACM ICPC) dopuszcza tylko C, C ++ i Javę. TopCoder pozwala na C ++, Java, C # i VB (naprawdę: p); a ostatnio Python. Można więc powiedzieć, że w „ekosystemie konkursu” jest więcej programistów C ++ / Java. Google Code Jam i IPSC to jedne z nielicznych konkursów, w których można kodować w dowolnym języku.
Teraz pytanie brzmi: w GCJ, gdzie uczestnicy mają swobodę wyboru języka, dlaczego nie mieliby wybrać Pythona lub Scheme? Najważniejszym czynnikiem jest to, że języki te są powolne . Jasne, w przypadku większości rzeczywistych programów są one wystarczająco szybkie, ale w przypadku ciasnych pętli, które często są zaangażowane w uruchomienie programu poniżej n-sekundowego limitu dla wszystkich przypadków testowych, te języki nie ograniczają tego dla żadnego z algorytmicznie bardziej skomplikowane problemy. (Problem zaprojektowany do akceptowania rozwiązań O (n log n), ale nie rozwiązań Θ (n 2 ) dla C / C ++ często wyklucza nawet optymalne rozwiązania O (n log n) w wolniejszych językach. Nawet Java miała kiedyś utrudnienia w USACO; nie jestem pewien, czy nadal tak jest.)
Innym czynnikiem są biblioteki: C ++ i Java mają lepsze biblioteki dla często użytecznych algorytmów i struktur danych (np. Czerwono-czarne drzewa, next_permutation w C ++), podczas gdy biblioteki Pythona (wystarczająco dobre dla świata rzeczywistego) są tutaj mniej przydatne, a Prolog i Schemat ... Nie wiem o ich bibliotekach. Jest to stosunkowo niewielki czynnik, ponieważ ci programiści mogą w razie potrzeby napisać własny kod. :-)
Języki ogólnego przeznaczenia z wieloma paradygmatami są bardziej przydatne do wykonywania zadań w ramach czasowych konkursu niż języki, które wymuszają na tobie filozofię lub sposób robienia rzeczy. Dlatego np. Prolog zawsze pozostanie niepopularny. (Filozofia ogólna: niektóre języki są językami „umożliwiającymi”, które pozwalają zrobić wszystko, w tym strzelić sobie w stopę, inne „kierują”, co zmusza do robienia rzeczy we właściwy sposób.) Dlatego też C ++ jest trzy razy bardziej popularny niż Java w ogólnej liczbie uczestników konkursu i znacznie bardziej popularna wśród czołowych zawodników. Ponieważ kod nie musi być czytany przez nikogo innego, jest w porządku, a nawet przydatne jest posiadanie makr pętli, takich jak
FOR(i,n)
(mniej kodu do wpisania, a co ważniejsze, mniejsza szansa na zrobienie błędu w pośpiechu). Nie ma nic przeciwko Javie, jest kilku czołowych programistów, którzy też używają Javy. :-)Wreszcie, chociaż wielu z tych czołowych programistów może mieć C ++ / Java / Pascal jako swój „pierwszy język”, nie są oni dobrzy ze względu na swój język, więc nie musisz się tym martwić. Wielu z tych samych programistów wygrało konkursy, takie jak konkurs ICFP, nawet przy celowym używaniu szalonych języków, takich jak skrypty powłoki, m4 (używane w autoconf) i assembler (zespół o nazwie „Nie możesz pisać fantastycznie bez ASM”).
źródło
Podobał mi się pomysł Jerry'ego Coffina polegający na wykreślaniu uczestników konkursu Google AI, więc wziąłem wszystkie wyniki i wykreśliłem je (obliczoną średnią, odchylenie standardowe, a następnie wykreśliłem krzywe rozkładu normalnego w programie Excel).
Dzięki Lua i JS otrzymałem to:
Bez (było niewielu zawodników, więc może wyniki są wypaczone):
Wygląda na to, że uczestnicy Java radzili sobie znacznie gorzej niż pozostali, podczas gdy Go, Common Lisp i C są na lepszym końcu.
źródło
Dlaczego wszyscy mówimy po angielsku, a nie w esperanto ? Cóż, tak się właśnie stało. Mimo że angielski jest niespójny i rozdęty, a esperanto zostało celowo zaprojektowane jako „lepsze narzędzie”.
Tak więc jednym z powodów jest tradycja. W większości szkół programowania nadal uczy się w językach C / C ++, Java, Pascal, a nawet Basic. W konkursach biorą udział głównie studenci, którzy wybierają lepiej znany im język.
Można również zauważyć, że większość książek algorytmicznych zawiera psedudocode w stylu Pascala lub Ady, a bardzo rzadko - Lisp. Nie wiem dlaczego, może też tradycja. A może po prostu nie jest to dobre dla algorytmów.
Innym powodem byłaby szybkość. Chociaż nie stanowi to problemu dla Google Code Jam, w prawie wszystkich konkursach dwukrotna różnica prędkości jest różnicą między werdyktami „Zaakceptowano” i „Limit czasu”.
Innymi słowy, jeśli optymalny algorytm w C ++ działa 10 razy szybciej niż w Rubim, może to oznaczać, że nieoptymalny algorytm w C ++ będzie nadal szybszy niż dobry w Rubim. A autorzy konkursów zwykle nie chcą zezwalać na zgłoszenia O (n ^ 2), jeśli można osiągnąć O (n * logn).
źródło
Po pierwsze, zakwestionowałbym twoje założenie [edytuj: lub co uważam za założenie - że zawodnicy używający C ++ i Java mają równie dobre wyniki]. Na przykład, oto jakie języki zostały użyte w zgłoszeniach, które pojawiły się na pierwszych 100 miejscach i ostatnich 100 miejscach w ostatnim konkursie Google na sztuczną inteligencję:
Zawodnicy używający C ++ i Javy nie wydawali się być nawet bliscy równych sukcesów w tym konkursie. Zawodnicy używający Pythona też nie wyglądali na szczególnie dobrze, choć było ich znacznie mniej, co osłabia jakiekolwiek wnioski w tym względzie.
Po drugie, oczywiście bardzo wiele wyjaśnień (jak wskazywali inni) to niewątpliwie tylko liczba osób znających każdy język. Prawdopodobnie jest teraz więcej osób na kursie Javy niż całkowita liczba osób, które kiedykolwiek napisały jakiekolwiek Lisp, Scheme lub Prolog.
Edycja: Myślę, że trzecią możliwością jest po prostu wszechstronność. Aby wybrać skrajny przykład, Prolog bardzo dobrze nadaje się do kilku problemów, ale równie słabo nadaje się do wielu innych. Niewiele osób może (lub przynajmniej robi) nauczyć się więcej niż jednego lub dwóch języków na tyle dobrze, aby używać ich w konkursie, więc większość osób zainteresowanych takimi rzeczami prawdopodobnie wybierze języki, które mogą działać dość dobrze w prawie wszystkim, a nie próba nauczenia się wyspecjalizowanego języka dla każdego problemu, który może zostać wybrany.
źródło
W prawie wszystkich rundach Google Code Jam więcej zawodników o wyższej wydajności koduje w C ++.
Poniżej znajdują się statystyki językowe z rundy 1A, 1B i 1C Google Code Jam 2012 (wymienione od góry do dołu). Liczba zawodników w każdej rundzie to odpowiednio 3686, 3281 i 3189.
źródło
zabawne pytanie, prawdopodobnie powinno być wiki społeczności.
Spójrz na liczbę finalistów w poszczególnych krajach: http://www.go-hero.net/jam/10/regions . zwróć uwagę na liczbę osób z Europy Wschodniej i Rosji. te miejsca mają bardzo silne społeczności C ++, a także Java, z wielu powodów.
spójrz na liczbę języków w kwalifikatorach: http://www.go-hero.net/jam/10/languages/0 i finałach: http://www.go-hero.net/jam/10/languages/6 . C ++ zaczyna się mniej niż połowa i ma 75 procent w finale. albo dobrzy programiści wolą C ++ albo C ++ sprawia, że programiści. Prawdopodobnie zanim opanujesz C ++, inne rzeczy staną się trywialne.
Możesz jednak wyciągać własne wnioski.
źródło
Przede wszystkim, jak wskazałeś
C++
iJava
są to języki głównego nurtu. To automatycznie oznacza, że osoby, które zaczynają robić konkursy programistyczne, zostaną im najpierw wprowadzone - przy okazji, kto uczy sięLisp
jako pierwszy język :) Regularnie uczestniczę też w takich konkursach - startuję w zawodachC++
, chociaż moim ulubionym językiem jestJava
. Po prostu chcę ćwiczyć inny język opróczJava
- równieżC++
jest trochę mniej gadatliwy i działa szybciej, co jest ważne przy konkursach programistycznych. A teraz do rzeczy - ludzie najpierw stają się ekspertami w językach głównego nurtu. Aby wziąć udział w konkursach programistycznych, musisz dość dobrze znać język, którego używasz. Nie masz czasu na szukanie w Internecie głupich rzeczy - na przykład zapomniałeś konstrukcji. Po prostu prędkość jest tam ważnym czynnikiem. UżywaćLisp
na zawodach musisz to lubić. Myślę, że nie ma tam tylu ludzi. Popraw mnie, jeśli się mylę. I szczerze mówiąc, zalety, o których wspomniałeś, upraszczają cofanie: w jakimkolwiek języku cofanie jest łatwe - zadeklaruj metodę i po prostu wywołaj ją ponownie dla każdego możliwego wyniku. To nie może być prostsze. Do tej pory nie czułem, że język, którego używam, próbuje potykać się o stopy na konkursach programistycznych.źródło
OMG ... Wszyscy ludzie przeglądają statystyki i liczby !!
Nie zapominajmy o podstawach… To są jedyne dwa języki (przeważnie), których uczy się ludzi na uczelniach / szkołach…!
To może odpowiedzieć na duży pośpiech!
źródło
Istotnym powodem może być to, że żadne konkursy nie obsługują języków takich jak Python czy Prolog. Specjalnie ACM ICPC Światowe finały wspierania C / C ++ i Java . I TopCoder obsługuje tylko C ++, Java, C #, VB, a teraz Pythona . Dla uczestników jest naturalne, że wybiorą jeden język, który jest dostępny w każdym konkursie. Innym powodem może być szybkość wykonywania. I tak, innym powodem jest to, że są to języki, których większość ludzi uczy się jako pierwsza.
źródło
Duże biblioteki były punktem sprzedaży Java w ACM ICPC. Przydatna jest możliwość uświadomienia sobie, że potrzebujesz jakiejś losowej struktury danych lub algorytmu i po prostu wyciągnij ją ze standardowych bibliotek.
źródło
Należy pamiętać, że C ++ jest nie tylko większością wśród wszystkich uczestników, ale wraz z postępem rund jego odsetek po prostu się utrzymuje i stale się poprawia.
Powiedziałbym, że to prawda, że większość uczestników to studenci (jednak ponieważ jest to turniej otwarty z szansą na rozmowę kwalifikacyjną w Google, trzeba wziąć pod uwagę, że wielu z nich jest absolwentami). Ale najnowsze rundy są przeznaczone tylko dla osób z dużym doświadczeniem. To nie tylko studenci, którzy dopiero co nauczyli się kodować w C ++ / Java.
Oczywiście argument ucznia działa również w przypadku języków takich jak LISP i OcaML lub ProLog. To są języki, które są często używane w obszarach sztucznej inteligencji, ale w świecie głównym uczniowie najczęściej się ich uczą i używają.
Wielkie konkursy inne niż Google obsługują kilka języków, ale to nadal nie wyjaśnia, dlaczego Pascal lub .net nie są zbliżone do poziomu Java (ponieważ zwykle są równie obsługiwane w głównych konkursach).
Wielu najlepszych programistów biorących udział w tych konkursach zna wiele języków. Ale nadal wolą używać C ++ podczas rund, musi to być z ważniejszego powodu niż „wyuczony C ++”.
Sprzeciwiłbym się twierdzeniu, że języki inne niż C ++ lub Java są lepszymi narzędziami do tego zadania. Jeśli bezpośrednie dane mówią, że finaliści częściej używają C ++ i Javy, jest to bezpośrednia zaprzeczenie tego twierdzenia.
Dane konkurencji Google AI nie są w rzeczywistości sprzeczne z żadną przesłanką dotyczącą zacięcia kodu. W rzeczywistości pokazuje, że najlepsi programiści potrafią używać języków takich jak Common Lisp, kiedy jest to naprawdę lepsze narzędzie do pracy. Jeśli chcemy wykorzystać te dane do założenia, że CLISP jest świetnym narzędziem do zawodów AI, to powinniśmy również założyć, że C ++ jest świetnym narzędziem do zawodów algorytmicznych, takich jak GCJ.
źródło