Dlaczego uczestnicy konkursu programistycznego używają C ++ i Java? [Zamknięte]

94

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.

advait
źródło
11
Myślę, że szybkość wykonania może być czynnikiem.
Zaki
Interesujące pytanie; byłoby miło uzyskać odpowiedzi od uczestników, w Code Jam lub innych konkursach (ACM itp.). Limity czasowe mogą być sprzeczne z językami tłumaczonymi, chociaż ...
tzaman
11
Dynamiczne języki mają ogromny problem z wydajnością: zobacz test porównawczy
NullUserException,
W przypadku Topcodera dzieje się tak wyłącznie dlatego, że mają regułę zabraniającą używania czegokolwiek poza standardowymi bibliotekami Pythona, co uniemożliwia wykonanie niczego innego niż trywialne zadania. Szukasz asteroid na zdjęciach kosmosu? Szkoda, nie możesz nawet używać NumPy.
endolith

Odpowiedzi:

69

Ś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 jakFOR(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”).

ShreevatsaR
źródło
2
Zgadzam się; jak powiedziałem, istnienie bibliotek jest stosunkowo niewielkim problemem. Mogę to usunąć, jeśli uważasz, że to zawyżałem.
ShreevatsaR
2
Ten fragment o Javie w przedostatnim punkcie nie jest do końca prawdziwy. Wielu czołowych zawodników GCJ używa języka Java.
NullUserException,
1
[Drugi uczestnik finału („linguo”) używał języka Python, a podczas konkursu używał języków, w tym LOLCODE, Piet, FALSE, Whitespace i FRACTRAN!]
ShreevatsaR
4
Chciałbym tylko dodać trochę do części o szybkości. „Szybkość” w konkursach takich jak GCJ to złożoność kodu w czasie wykonywania (tj. Duże-O). W GCJ zwykle poprawny algorytm jest akceptowany nawet w wolnym języku (stąd jest wiele akceptowanych zgłoszeń Pythona), podczas gdy powolny algorytm będzie trwał wiecznie nawet w asm. Są wyjątki, ale generalnie jeśli używasz poprawnego algorytmu / techniki, jesteś bezpieczny nawet z wolniejszym językiem.
MAK
1
@EvgeniSergeev To, co mówisz, jest prawdą w przypadku większości konkursów programistycznych, takich jak IOI / TopCoder, ale w szczególności w GCJ ograniczenia czasowe wynoszą zwykle 8 minut dla dużych danych wejściowych, a problemy są zwykle projektowane tak, aby rozwiązania Pythona również mogły przejść. Jeszcze 10 lat temu ogólną zasadą było ~ 10 ^ 9 "prostych" operacji na sekundę, więc np. Aby odróżnić O (n ^ 2) od Ω (n ^ 3), potrzebujemy tylko n ^ 2 <10 ^ 9 * 60 * 8 <n ^ 3 lub w przybliżeniu 8000 <n <692000. Możesz wziąć n = 20000, a n ^ 2 algo nawet w 400x wolniejszym języku (10 ^ 9/400 na s) zajmie tylko 160 sekund, a nawet szybko n ^ 3 zajmie 8000 sekund.
ShreevatsaR
14

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.

Tatiana Racheva
źródło
Jednak pytanie zadane o Google Code Jam, a nie o konkurs Google AI (Twoja odpowiedź to pierwsze miejsce, o którym słyszę), więc bardziej odpowiednie może być narysowanie tych wykresów dla Google Code Jam. Właściwie to pytanie już wspomina o takich statystykach (2010) ; patrz także 2011 , 2012 , 2013 i 2014 (w trakcie realizacji) .
ShreevatsaR
12

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).

Nikita Rybak
źródło
7
Tylko komentarz do twojej analogii: Esperanto nie osiąga swoich celów. Jego dźwięki są prawie dokładnie takie same jak w dialekcie języka polskiego Zamenhofa, a jego gramatyka jest nienaturalna i skomplikowana. W żaden sposób nie jest to dobry uniwersalny język; Klingon pod wieloma względami radzi sobie lepiej, wyglądając jak naturalny język ludzki. Przypuszczam, że można by argumentować, że są w tym podobieństwa do C ++ i Javy, ale byłoby to niesprawiedliwe :) (Zobacz także xibalba.demon.co.uk/jbr/ranto .)
Antal Spector-Zabusky
1
@Antal Cóż, analogia może być błędna, ale rozumiesz, o co mi chodzi. Między tobą a mną też nie mówię w esperanto :)
Nikita Rybak
(naturalny) język jest oznaką przynależności plemiennej , a języki programowania są pod wpływem wielu takich samych nacisków
trapez
12

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ę:

tekst alternatywny

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.

Jerry Coffin
źródło
1
Cóż, wydaje się, że większość czołowych uczestników używało C ++ / C #, a mniej z nich korzystało z Python / Haskell / Lisp / Scheme / Ruby / Prolog, co wzmacnia przesłankę pytania, prawda? Nie chodziło o porównanie między sobą C ++ i Javy (choć to ciekawe, dzięki), ale coś w stylu: „Dlaczego„ ładne ”języki są mniej popularne na szczycie? Dlaczego dobrzy zawodnicy (którzy prawdopodobnie znają wiele języków) nie wybiorą jednego z nich? ” Ale zgadzam się, że zażyłość jest jednym z głównych powodów.
ShreevatsaR
Odniosłem wrażenie (być może błędne), że pytanie zakładało, że zawodnicy używający C ++ i Javy byli mniej więcej równie skuteczni. Może to być prawdą w niektórych konkursach, ale z pewnością nie wydaje się, aby tak było w tym. Chociaż jest z pewnością prawdą, że było ich mniej, zawodnicy używający Go, Haskell, Lua i CL wydawali się być bardziej skuteczni niż ci używający Javy (chociaż, co prawda, C ++ z pewnością zdawał się dominować, przynajmniej w w tym konkretnym przypadku).
Jerry Coffin
5
Przepraszam, ale to powinien być raczej wykres słupkowy, a nie liniowy ...
tzaman
O mój. Od godziny staram się stworzyć wykres, który ma sens i nie robię postępów. Arkusze kalkulacyjne Excel i Google sprawiają, że czuję się głupio.
Tatiana Racheva
Czy z technicznego punktu widzenia Lisp nie może być używany jako preprocesor makr C / C ++ ...? Możesz sprawić, by wyglądało to tak, jakbyś przesłał program w C ++, ale w rzeczywistości kodowałeś w Lispie!
aoeu256
12

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.

Statystyki językowe z Google Code Jam 2012 Round 1A Statystyki językowe z Google Code Jam 2012 Round 1B Statystyki językowe z Google Code Jam 2012 Round 1C

Rose Perrone
źródło
8

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.

Anycorn
źródło
5

Przede wszystkim, jak wskazałeś C++i Javasą 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ę Lispjako pierwszy język :) Regularnie uczestniczę też w takich konkursach - startuję w zawodach C++, chociaż moim ulubionym językiem jest Java. Po prostu chcę ćwiczyć inny język oprócz Java- 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ćLispna 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.

Petar Minchev
źródło
Liczba mnoga anegdoty może nie być danymi, ale nauczyłem się Scheme jako mojego pierwszego języka i mój kurs wprowadzający CS odbył się w Haskell. Zgadzam się, że wydaje się to niezwykłe: C / C ++ / Java / Python wydają się być popularne.
Wang
Słuszna uwaga; Myślę, że to dociera do sedna sprawy. Programiści z wystarczającą praktyką w robieniu rzeczy, które często się pojawiają, nie mają naprawdę wielkiej korzyści w innych językach. (A funkcje takie jak, powiedzmy, umiejętność przetwarzania tekstu Perla rzadko są przydatne w tych konkursach.)
ShreevatsaR
3

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!

Arpit
źródło
3

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.

taskinoor
źródło
2

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.

Wang
źródło
2

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.

UltraAwesomeAnonymousSpy
źródło