Perché i concorrenti della competizione di programmazione usano C ++ e Java? [chiuso]


93

Dopo aver partecipato e seguito al concorso Google Code Jam di quest'anno , non ho potuto fare a meno di notare l'incredibile numero di concorrenti [di successo] che hanno utilizzato C / C ++ e Java. La distribuzione delle lingue utilizzate durante il concorso può essere vista qui .

Dopo aver programmato in C / C ++ per diversi anni, di recente mi sono innamorato di Python per la sua natura leggibile / diretta. Più recentemente, ho imparato linguaggi funzionali come OCaml, Scheme e persino linguaggi logici come Prolog. Questi linguaggi hanno certamente i loro pregi e, a mio avviso, possono essere applicati più facilmente di C ++ e Java per determinate situazioni. Ad esempio, l'uso di call / cc da parte di Scheme semplifica il backtracking (uno strumento necessario per rispondere a diversi problemi) e la specifica logica di Prolog, sebbene inefficiente a causa della sua natura di forza bruta, può semplificare drasticamente (e persino risolvere automaticamente) alcuni problemi che sono difficili da avvolgere il proprio cervello.

È chiaro che un concorrente della competizione dovrebbe utilizzare gli strumenti più adatti alla sfida. Anche l'assemblaggio x86 è completo di Turing, il che non giustifica la risoluzione dei problemi con esso. In questo caso, perché i concorrenti che usano linguaggi meno comuni come Scheme / Lisp, Prolog e persino Python hanno un successo significativamente inferiore rispetto ai concorrenti che usano C / C ++ e Java? Con parole diverse, perché i concorrenti di successo non usano linguaggi che, sebbene possano essere meno diffusi, sono probabilmente strumenti migliori per il lavoro?

Ci sono diverse motivazioni per la mia domanda. Soprattutto, vorrei diventare un programmatore migliore, sia nell'aspetto pratico che in quello della competizione. Dopo essere stati introdotti a paradigmi così belli come la programmazione logica e funzionale, è scoraggiante vedere così tante persone scartarli a favore di C / C ++ e Java. Mi fa persino dubitare della mia ammirazione per detti paradigmi, preoccupandomi di non poter avere successo come programmatore Lisp / Scheme / Prolog in una competizione di programmazione.


11
Immagino che la velocità di esecuzione potrebbe essere un fattore.
Zaki

Domanda interessante; sarebbe bello avere delle risposte dai partecipanti, a Code Jam o ad altri concorsi (ACM, ecc.). I limiti di tempo di esecuzione potrebbero pregiudicare le lingue interpretate, però ...
tzaman

11
I linguaggi dinamici hanno un enorme problema di prestazioni: vedi benchmark
NullUserException

Per Topcoder, è semplicemente perché hanno una regola che vieta l'uso di qualsiasi cosa tranne le librerie standard di Python, il che rende impossibile qualsiasi cosa diversa dalle attività banali. Cerchi asteroidi nelle immagini spaziali? Peccato, non puoi nemmeno usare NumPy.
endolith

Risposte:


68

Ottima domanda! Come qualcuno che si è dilettato un po 'nei concorsi di programmazione, potrei avere qualcosa da dire.

[Togliamo di mezzo la dichiarazione di non responsabilità standard: la programmazione del concorso è solo vagamente correlata alla "programmazione nel mondo reale", e mentre mette alla prova le abilità algoritmiche e di risoluzione dei problemi e la capacità di elaborare codice di lavoro veloce e privo di bug sotto pressione del tempo, non è necessariamente correlato alla capacità di creare grandi progetti software, scrivere codice manutenibile, ecc (oltre al fatto che i programmi ben strutturati sono più facili da eseguire il debug).]

Ora alcune risposte:

  • Anche C ++ / Java sono più comuni di altri linguaggi nel mondo reale, quindi ti aspetteresti di vedere una proporzione maggiore ovunque. (Ma è ancora più alto nella popolazione del concorso.)

  • Molti di questi partecipanti sono studenti o hanno partecipato a concorsi come studenti, e C ++ / Java sono le "prime lingue" più comuni che gli studenti imparano. (Gli studenti universitari in questi giorni possono iniziare con Scheme, Haskell, Python, ecc., Ma i liceali (spesso autodidatti) meno spesso.) In effetti, molti dei partecipanti dell'Europa orientale usano ancora Pascal e sono più sorprendenti con esso rispetto al resto di noi sarà mai con qualsiasi lingua.

  • I concorsi a livello scolastico e universitario di solito usano queste lingue. L'International Olympiad in Informatics (IOI) consente solo C, C ++ e Pascal (o forse ora consente Java; non ho tenuto il passo) e l'ACM Intercollegiate Programming Contest (ACM ICPC) consente solo C, C ++ e Java. TopCoder consente C ++, Java, C # e VB (in realtà: p); e recentemente, Python. Quindi si potrebbe dire che l '"ecosistema del concorso" contiene più programmatori C ++ / Java. Google Code Jam e IPSC sono tra i pochi concorsi che consentono il codice in qualsiasi lingua, in realtà.

  • La domanda è: in GCJ, dove i concorrenti sono liberi di scegliere una lingua, perché non dovrebbero scegliere Python o Scheme? Il fattore più rilevante è che queste lingue sono lente . Certo, per la maggior parte della programmazione del mondo reale sono abbastanza veloci, ma per i cicli stretti che spesso sono coinvolti nel far funzionare un programma sotto il limite di n secondi per tutti i casi di test, questi linguaggi non lo tagliano per nessuno di i problemi algoritmicamente più coinvolti. (Un problema progettato per accettare soluzioni O (n log n) ma non soluzioni Θ (n 2 ) per C / C ++ spesso esclude anche soluzioni O (n log n) ottimali nei linguaggi più lenti. Anche Java aveva un handicap USACO; Non sono sicuro che sia ancora così.)

  • Un altro fattore sono le librerie: C ++ e Java hanno librerie migliori per algoritmi e strutture dati frequentemente utili (ad esempio alberi rosso-neri, next_permutation di C ++), mentre le librerie di Python (abbastanza buone per il mondo reale) sono meno utili qui, e Prolog e Scheme ... Non so delle loro biblioteche. Questo è un fattore relativamente minore, perché questi programmatori possono scrivere il proprio codice quando necessario. :-)

  • I linguaggi multi-paradigma generici sono più utili per fare le cose entro i limiti di tempo del concorso, rispetto ai linguaggi che impongono una filosofia o un modo di fare le cose su di te. Questo è il motivo per cui Prolog rimarrà sempre impopolare, ad esempio. (Filosofia generale: alcuni linguaggi sono linguaggi "abilitanti" che ti consentono di fare qualsiasi cosa, incluso spararti ai piedi, alcuni sono "diretti" che ti costringono a fare le cose nel modo giusto.) Questo è anche il motivo per cui il C ++ è tre volte più popolare di Java nei partecipanti al concorso generale e molto più popolare tra i migliori concorrenti. Dato che il codice non deve essere letto da nessun altro, va bene e anche utile avere macro di ciclo comeFOR(i,n)(meno codice da digitare e, cosa più importante, meno possibilità di creare un bug quando si ha fretta). Niente contro Java, ci sono anche alcuni dei migliori programmatori che usano Java. :-)

  • Infine, sebbene molti di questi migliori programmatori possano avere C ++ / Java / Pascal come "prima lingua", non sono buoni a causa del loro linguaggio, quindi non devi disperare per questo. Molti di questi stessi programmatori hanno vinto concorsi come il concorso ICFP anche usando intenzionalmente linguaggi folli come script di shell, m4 (usato in autoconf) e assembly (il team chiamato "You Can't Spell Awesome Without ASM").


2
Sono d'accordo; come ho detto, l'esistenza delle biblioteche è una questione relativamente minore. Posso rimuoverlo se pensi che l'abbia esagerato.
ShreevatsaR

2
Quel pezzo su Java nel penultimo punto dell'elenco non è del tutto vero. Molti dei migliori concorrenti di GCJ usano Java.
NullUserException

1
[L'altro partecipante alla finale ("linguo") ha utilizzato Python e attraverso il concorso ha utilizzato linguaggi tra cui LOLCODE, Piet, FALSE, Whitespace e FRACTRAN!]
ShreevatsaR

4
Vorrei solo aggiungere un po 'alla parte sulla velocità. La "velocità" in concorsi come il GCJ è la complessità runtime del codice (cioè big-O). Nel GCJ di solito l'algoritmo corretto viene accettato anche in un linguaggio lento (quindi ci sono molti invii Python accettati) mentre un algoritmo lento impiegherà un'eternità anche in asm. Ci sono eccezioni, ma generalmente se usi l'algoritmo / tecnica corretto, sei al sicuro anche con un linguaggio più lento.
MAK

1
@EvgeniSergeev Quello che dici è vero per la maggior parte dei concorsi di programmazione, come IOI / TopCoder, ma in GCJ in particolare, i limiti di tempo sono di solito 8 minuti per l'input di grandi dimensioni, e i problemi sono solitamente progettati in modo che anche le soluzioni Python possano passare. Anche 10 anni fa la regola pratica era ~ 10 ^ 9 operazioni "semplici" al secondo, quindi ad esempio per distinguere O (n ^ 2) da Ω (n ^ 3), abbiamo solo bisogno di n ^ 2 <10 ^ 9 * 60 * 8 <n ^ 3, o circa 8000 <n <692000. Puoi prendere n = 20000 e n ^ 2 algo anche in una lingua 400 volte più lenta (10 ^ 9/400 al secondo) richiederà solo 160 secondi, mentre anche veloce n ^ 3 richiederà 8000 secondi.
ShreevatsaR

14

Mi è piaciuta l'idea di Jerry Coffin di tracciare i concorrenti del concorso di intelligenza artificiale di Google, quindi ho preso tutti i risultati e li ho tracciati (media calcolata, deviazione standard, quindi ho rappresentato graficamente le normali curve di distribuzione in Excel).

Con Lua e JS, ho ottenuto questo:

Senza (c'erano pochi concorrenti, quindi forse i risultati sono distorti):

Sembra che i partecipanti a Java abbiano fatto decisamente peggio degli altri, mentre Go, Common Lisp e C sono dalla parte migliore.


Tuttavia, la domanda posta su Google Code Jam e non sul concorso Google AI (la tua risposta è il primo posto in cui ne sento parlare), quindi potrebbe essere più pertinente disegnare questi grafici per Google Code Jam. In realtà, la domanda menziona già tali statistiche (2010) ; vedere anche 2011 , 2012 , 2013 e 2014 (in corso in questo momento) .
ShreevatsaR

12

Perché parliamo tutti inglese e non esperanto ? Bene, è appena successo così. Anche se l'inglese è incoerente e gonfio e l'esperanto è intenzionalmente concepito come "strumento migliore".

Quindi, una ragione è una tradizione. Nella maggior parte delle scuole la programmazione è ancora insegnata in C / C ++, Java, Pascal o anche Basic. E partecipano a quei concorsi soprattutto studenti, che scelgono la lingua che conoscono meglio.
Inoltre, puoi notare che la maggior parte dei libri algoritmici presenta psedudocodice nello stile di Pascal o Ada e molto molto raramente - Lisp. Non so perché, forse anche una tradizione. O forse non è così buono per gli algoritmi.

Un altro motivo sarebbe la velocità. Sebbene non sia un problema per Google Code Jam, in quasi tutti i concorsi il doppio del divario di velocità è una differenza tra i verdetti "Accettato" e "Limite di tempo".
In altre parole, se l'algoritmo ottimale in C ++ viene eseguito 10 volte più velocemente che in Ruby, potrebbe significare che l'algoritmo non ottimale in C ++ sarà ancora più veloce di uno buono in Ruby. E gli autori del concorso di solito non vogliono consentire O (n ^ 2) invii, se è possibile ottenere O (n * logn).


7
Solo un commento sulla tua analogia: l'esperanto fallisce miseramente nei suoi obiettivi. I suoi suoni sono più o meno esattamente quelli del dialetto polacco di Zamenhof, e la sua grammatica è innaturale e complicata. Non è in alcun modo un buon linguaggio universale; Il Klingon, in molti modi, fa un lavoro migliore nell'apparire come un linguaggio umano naturale. Si potrebbe, suppongo, sostenere che ci siano somiglianze in questo con C ++ e Java, ma sarebbe ingiusto :) (Vedi anche xibalba.demon.co.uk/jbr/ranto .)
Antal Spector-Zabusky

1
@ Antal Beh, l'analogia può essere difettosa, ma hai capito il mio punto. Tra me e te, non parlo neanche l'esperanto :)
Nikita Rybak

il linguaggio (naturale) è un segno di appartenenza tribale e i linguaggi di programmazione sono influenzati da molte delle stesse pressioni
trapezio

12

Per prima cosa, metterei in dubbio la tua premessa [modifica: o quello che considero una premessa - che i concorrenti che utilizzano C ++ e Java se la cavano altrettanto bene]. Ad esempio, ecco quali lingue sono state utilizzate per le voci che sono arrivate nei primi 100 posti e negli ultimi 100 posti nel recente concorso AI di Google:

testo alternativo

I concorrenti che utilizzano C ++ e Java non sembrano essere ovunque vicino alla altrettanto successo in quel concorso. Anche i concorrenti che usavano Python non sembravano cavarsela particolarmente bene, anche se ce n'erano notevolmente meno, indebolendo qualsiasi conclusione al riguardo.

In secondo luogo, ovviamente, gran parte della spiegazione (come altri hanno sottolineato) è senza dubbio solo il numero di persone che hanno familiarità con ciascuna lingua. Probabilmente ci sono più persone che seguono un corso in Java in questo momento rispetto al numero totale di persone che hanno mai scritto Lisp, Scheme o Prolog.

Modifica: penso che una terza possibilità sia semplicemente la versatilità. Per citare un esempio estremo, Prolog si adatta molto bene ad alcuni problemi, ma ugualmente male adatto a molti altri. Poche persone possono (o almeno lo fanno) imparare più di una o due lingue abbastanza bene da usarle in un concorso, quindi la maggior parte delle persone interessate a queste cose è probabile che scelga lingue che possono funzionare ragionevolmente bene per quasi tutto, piuttosto che tentando di imparare una lingua specializzata per ogni problema che potrebbe essere scelto.


1
Bene, sembra che la maggior parte dei partecipanti principali usasse C ++ / C # e meno di loro usassero Python / Haskell / Lisp / Scheme / Ruby / Prolog, il che rafforza la premessa della domanda, non è vero? La domanda non era confrontare C ++ e Java tra di loro (anche se questo è interessante, grazie), ma qualcosa del tipo: ”Perché i linguaggi" belli "hanno meno successo in alto? Perché i bravi concorrenti (che presumibilmente conoscono molte lingue) non scelgono uno di questi? " Ma sono d'accordo sul fatto che la familiarità sia una delle ragioni principali.
ShreevatsaR

La mia impressione (forse sbagliata) era che la domanda presupponeva che i concorrenti che utilizzavano C ++ e Java avessero lo stesso successo. Potrebbe essere vero in alcuni concorsi, ma certamente non sembrava esserlo in questo. Sebbene sia certamente vero che ce n'erano meno, i concorrenti che utilizzavano Go, Haskell, Lua e CL sembravano avere più successo di quelli che utilizzavano Java (sebbene, ammettiamolo, in termini di percentuale di successo, C ++ sembrava certamente dominare, almeno in questo caso particolare).
Jerry Coffin

5
Perdonatemi i pignoli, ma questo dovrebbe davvero essere un grafico a barre piuttosto che un grafico a linee ...
tzaman

Oh mio. Ho lottato per creare un grafico che avesse un senso per un'ora e non sto facendo progressi. Excel e Google Spreadsheets mi fanno sentire stupido.
Tatiana Racheva

Non è tecnicamente possibile utilizzare Lisp come preprocessore di macro C / C ++ ...? Potresti far sembrare che tu abbia inviato un programma C ++ ma in realtà hai codificato in Lisp!
aoeu256

12

In quasi tutti i round di Google Code Jam, la maggior parte dei concorrenti con prestazioni più elevate codifica in C ++.

Di seguito sono riportate le statistiche sulla lingua di Google Code Jam 2012 Round 1A, 1B e 1C (elencate dall'alto in basso). Il numero di concorrenti in ogni round è rispettivamente 3.686, 3.281 e 3.189.

Statistiche linguistiche da Google Code Jam 2012 Round 1A Statistiche linguistiche da Google Code Jam 2012 Round 1B Statistiche linguistiche da Google Code Jam 2012 Round 1C


8

domanda divertente, probabilmente dovrebbe essere un wiki della comunità.

Guarda il numero di finalisti per paese: http://www.go-hero.net/jam/10/regions . notare il numero di persone provenienti dall'Europa orientale e dalla Russia. quei luoghi hanno comunità C ++ molto forti, oltre a Java, per una serie di ragioni.

guarda il numero di lingue nelle qualificazioni: http://www.go-hero.net/jam/10/languages/0 e finali: http://www.go-hero.net/jam/10/languages/6 . Il C ++ inizia meno della metà e ha il 75% in finale. entrambi i buoni programmatori preferiscono C ++ o C ++ fa i programmatori. Probabilmente quando padroneggi il C ++, altre cose diventano banali.

Tuttavia, sei libero di trarre le tue conclusioni.


5

Prima di tutto, come hai sottolineato C++e Javasono lingue tradizionali. Ciò significa automaticamente che le persone che iniziano a partecipare alle competizioni di programmazione verranno presentate loro per prime - a proposito di chi impara Lispcome prima lingua :) Partecipo regolarmente anche a tali competizioni - che uso C++per competere, sebbene la mia lingua preferita sia Java. È solo che voglio praticare un'altra lingua a parteJava - ancheC++è un po 'meno prolisso e gira più velocemente, il che è importante per le competizioni di programmazione. Ora al punto: le persone diventano prima esperte nelle lingue tradizionali. Per partecipare ai concorsi di programmazione devi avere una buona conoscenza del linguaggio che stai utilizzando. Non hai tempo per cercare su Internet cose stupide, come dimenticare un costrutto. È solo che la velocità è un fattore importante lì. UsareLispin una competizione, devi esserne affezionato. Non credo che ci siano così tante persone là fuori. Correggimi se sbaglio. E onestamente i professionisti che hai citato come semplificano il backtracking: in qualsiasi lingua il backtracking è facile: dichiara un metodo e chiamalo di nuovo per ogni possibile risultato. Non potrebbe essere più semplice. Fino ad ora non ho sentito che il linguaggio che sto usando stia cercando di inciampare per i concorsi di programmazione.


Il plurale di aneddoto potrebbe non essere un dato, ma ho imparato Scheme come prima lingua e il mio corso introduttivo di informatica era ad Haskell. Sono d'accordo che questo sembra essere insolito, però: C / C ++ / Java / Python sembrano essere quelli popolari.
Wang

Buon punto; Penso che questo vada al cuore della questione. Per i programmatori con abbastanza pratica nel fare le cose che vengono fuori di frequente, non c'è davvero alcun grande vantaggio in altri linguaggi. (E caratteristiche come, ad esempio, l'abilità di elaborazione del testo di Perl sono raramente utili in questi concorsi.)
ShreevatsaR

3

OMG ... le persone stanno passando tutte le statistiche e le cifre !!

Non dimentichiamo le basi .. Queste sono le uniche due lingue (principalmente) che vengono insegnate alle persone nei college / scuole ...!

Questo potrebbe rispondere alla forte corsa!


3

Un motivo fondamentale potrebbe essere che tutti i concorsi non supportano linguaggi come Python o Prolog. Specialmente le finali mondiali ACM ICPC supportano C / C ++ e Java . E TopCoder supporta anche solo C ++, Java, C #, VB e ora Python . È naturale per i concorrenti che sceglieranno una lingua disponibile in ogni concorso. Un altro motivo potrebbe essere la velocità di esecuzione. E sì, un altro motivo è che queste sono le lingue che la maggior parte delle persone impara per prime.


2

Le grandi biblioteche erano un punto di forza per Java in ACM ICPC. È utile essere in grado di rendersi conto che si desidera una struttura o un algoritmo di dati casuali e semplicemente estrarli dalle librerie standard.


2

Tieni presente che il C ++ non è solo la maggioranza tra tutti i concorrenti, ma man mano che i round progrediscono, la sua percentuale continua e continua a migliorare.

Direi che è vero che la maggior parte dei partecipanti sono studenti (Tuttavia, trattandosi di un torneo aperto con possibilità di un colloquio di lavoro con google, allora bisogna considerare che molti di quelli che partecipano sono laureati). Ma gli ultimi round sono solo per persone con un sacco di esperienza. Non sono solo studenti che hanno appena imparato a programmare in C ++ / Java.

Ovviamente, l'argomento studente funziona anche contro linguaggi come LISP e OcaML o ProLog. Queste sono le lingue, che sono molto usate nelle aree dell'IA, ma nel mondo tradizionale è più probabile che gli studenti le imparino e le usino.

Grandi concorsi diversi da Google supportano poche lingue, ma ciò non spiegherebbe ancora perché Pascal o .net non sono vicini al livello di Java (poiché tendono ad essere ugualmente supportati nei principali eventi di contest).

Molti dei migliori programmatori in questi concorsi conoscono molte lingue. Ma preferiscono ancora usare C ++ durante i round, deve essere per un motivo più grande del "C ++ appreso" prima.

Vorrei discutere contro l'affermazione che linguaggi diversi da C ++ o Java sono strumenti migliori per il lavoro. Se i dati diretti dicono che è più probabile che i finalisti utilizzino C ++ e Java, è una contraddizione diretta a tale affermazione.

I dati sulla concorrenza di Google AI in realtà non contraddicono alcuna premessa riguardo al code jam. In realtà mostra che i migliori programmatori sono in grado di utilizzare linguaggi come Common Lisp quando è davvero lo strumento migliore per il lavoro. Se vogliamo utilizzare questi dati per presumere che CLISP sia un ottimo strumento per le competizioni di intelligenza artificiale, allora dovremmo anche presumere che C ++ sia un ottimo strumento per le competizioni di algoritmi come GCJ.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.