Pourquoi les candidats au concours de programmation utilisent-ils C ++ et Java? [fermé]

93

Après avoir participé et suivi le concours Google Code Jam de cette année , je n'ai pas pu m'empêcher de remarquer le nombre incroyable de candidats [réussis] qui utilisaient C / C ++ et Java. La répartition des langues utilisées tout au long du concours peut être vue ici .

Après avoir programmé en C / C ++ pendant plusieurs années, je suis récemment tombé amoureux de Python pour sa nature lisible / simple. Plus récemment, j'ai appris des langages fonctionnels comme OCaml, Scheme et même des langages logiques comme Prolog. Ces langages ont certainement leurs mérites et, à mon avis, peuvent être appliqués plus facilement que C ++ et Java dans certaines situations. Par exemple, l'utilisation de l'appel / cc par Scheme simplifie le retour en arrière (un outil nécessaire pour répondre à plusieurs problèmes) et la spécification logique de Prolog, bien qu'inefficace en raison de sa nature de force brute, peut considérablement simplifier (et même résoudre automatiquement) certains problèmes difficiles à résoudre. envelopper son cerveau.

Il est clair qu'un concurrent doit utiliser les outils les mieux adaptés pour relever le défi. Même l'assemblage x86 est Turing complet - cela ne justifie pas de résoudre les problèmes avec lui. Dans ce cas, pourquoi les concurrents qui utilisent des langages moins courants comme Scheme / Lisp, Prolog et même Python ont-ils beaucoup moins de succès que les concurrents qui utilisent C / C ++ et Java? En d'autres termes, pourquoi les candidats retenus n'utilisent-ils pas des langues qui, bien que moins courantes, sont sans doute de meilleurs outils pour le travail?

Il y a plusieurs motivations à ma question. Plus important encore, j'aimerais devenir un meilleur programmeur - à la fois dans l'aspect pratique et dans l'aspect compétition. Après avoir été initié à de si beaux paradigmes comme la programmation fonctionnelle et logique, il est décourageant de voir autant de gens les rejeter au profit de C / C ++ et Java. Cela me fait même remettre en question mon admiration pour ces paradigmes, craignant de ne pas réussir en tant que programmeur Lisp / Scheme / Prolog dans un concours de programmation.

avouer
la source
11
Je suppose que la vitesse d'exécution pourrait être un facteur.
Zaki
Question interessante; ce serait bien d'avoir des réponses des participants, dans Code Jam ou d'autres compétitions (ACM, etc.). Les limites de temps de fonctionnement pourraient avoir un biais contre les langues interprétées, cependant ...
Tzaman
11
Les langages dynamiques ont un énorme problème de performances: voir benchmark
NullUserException
Pour Topcoder, c'est simplement parce qu'ils ont une règle interdisant l'utilisation de tout autre chose que les bibliothèques standard Python, ce qui rend impossible tout autre chose que des tâches triviales. Vous recherchez des astéroïdes dans les images spatiales? Dommage, vous ne pouvez même pas utiliser NumPy.
endolith

Réponses:

68

Excellente question! En tant que personne qui a moi-même participé un peu à des concours de programmation, j'ai peut-être quelque chose à dire.

[Supprimons la clause de non-responsabilité standard: la programmation de concours n'est que vaguement liée à la "programmation dans le monde réel", et même si elle teste les compétences en algorithme et en résolution de problèmes et la capacité à trouver un code de travail rapide et sans bogue sous pression temporelle, cela ne correspond pas nécessairement à la capacité de construire de grands projets logiciels, d'écrire du code maintenable, etc. (au-delà du fait que les programmes bien structurés sont plus faciles à déboguer).]

Maintenant pour quelques réponses:

  • C ++ / Java sont également plus courants que d'autres langages dans le monde réel, vous vous attendez donc à voir une proportion plus élevée n'importe où. (Mais c'est encore plus élevé dans la population du concours.)

  • Beaucoup de ces participants sont des étudiants ou ont participé à des concours en tant qu'étudiants, et C ++ / Java sont des «premiers langages» plus courants que les étudiants apprennent. (Les étudiants de premier cycle de nos jours peuvent commencer par Scheme, Haskell, Python, etc., mais les lycéens (souvent autodidactes) moins souvent.) En fait, de nombreux participants d'Europe de l'Est utilisent encore Pascal, et sont plus étonnants avec lui. que le reste d'entre nous ne le sera jamais avec n'importe quelle langue.

  • Les concours de niveau scolaire et collégial utilisent généralement ces langues. L'Olympiade internationale d'informatique (IOI) n'autorise que C, C ++ et Pascal (ou peut-être qu'il autorise Java maintenant; je n'ai pas suivi), et le concours de programmation ACM Intercollegiate (ACM ICPC) autorise uniquement C, C ++ et Java. TopCoder autorise C ++, Java, C # et VB (vraiment: p); et récemment, Python. On pourrait donc dire que «l'écosystème du concours» contient plus de programmeurs C ++ / Java. Google Code Jam et IPSC sont parmi les rares concours qui permettent du code dans n'importe quelle langue, en fait.

  • Maintenant, la question est, dans GCJ où les candidats sont libres de choisir un langage, pourquoi ne choisiraient-ils pas Python ou Scheme? Le facteur le plus important est que ces langues sont lentes . Bien sûr, pour la plupart des programmes du monde réel, ils sont facilement assez rapides, mais pour les boucles serrées qui sont souvent impliquées dans l'exécution d'un programme sous la limite de n secondes pour tous les cas de test, ces langages ne le coupent pas pour aucun des les problèmes algorithmiquement plus complexes. (Un problème conçu pour accepter les solutions O (n log n) mais pas les solutions Θ (n 2 ) pour C / C ++ exclut fréquemment même les solutions optimales O (n log n) dans les langages plus lents. Même Java avait un handicap à USACO; je ne suis pas sûr que ce soit toujours le cas.)

  • Un autre facteur est les bibliothèques: C ++ et Java ont de meilleures bibliothèques pour les algorithmes et les structures de données fréquemment utiles (par exemple, les arbres rouge-noir, next_permutation de C ++), tandis que les bibliothèques de Python (assez bonnes pour le monde réel) sont moins utiles ici, et Prolog et Scheme ... Je ne connais pas leurs bibliothèques. C'est un facteur relativement mineur, car ces programmeurs peuvent écrire leur propre code si nécessaire. :-)

  • Les langages multi-paradigmes à usage général sont plus utiles pour simplement faire avancer les choses dans les délais impartis du concours, que les langages qui imposent une philosophie ou une façon de faire les choses. C'est pourquoi Prolog restera toujours impopulaire, par exemple. (Philosophie générale: certains langages sont des langages «habilitants» qui vous permettent de faire n'importe quoi, y compris vous tirer une balle dans le pied, certains sont «dirigent» qui vous obligent à faire les choses de la bonne façon.) C'est aussi pourquoi C ++ est trois fois plus populaire que Java dans les participants au concours général, et beaucoup plus populaire parmi les meilleurs concurrents. Puisque le code n'a pas à être lu par quelqu'un d'autre, il est normal et même utile d'avoir des macros de boucle commeFOR(i,n)(moins de code à taper, et surtout moins de chance de faire un bogue quand on est pressé). Rien contre Java, il y a quelques grands programmeurs qui utilisent aussi Java. :-)

  • Enfin, bien que beaucoup de ces meilleurs programmeurs puissent avoir C ++ / Java / Pascal comme "premier langage", ils ne sont pas bons à cause de leur langage, vous n'avez donc pas à désespérer à ce sujet. Beaucoup de ces mêmes programmeurs ont remporté des concours comme le concours ICFP même en utilisant intentionnellement des langages fous comme les scripts shell, m4 (utilisé dans autoconf) et l'assembly (l'équipe nommée "You Can't Spell Awesome Without ASM").

ShreevatsaR
la source
2
Je suis d'accord; comme je l'ai dit, l'existence des bibliothèques est un problème relativement très mineur. Je peux le supprimer si vous pensez que je l'ai exagéré.
ShreevatsaR
2
Ce peu de Java dans l'avant-dernier point n'est pas tout à fait vrai. Beaucoup des meilleurs concurrents de GCJ utilisent Java.
NullUserException
1
[L'autre participant à la finale ("linguo") a utilisé Python, et à travers le concours a utilisé des langues telles que LOLCODE, Piet, FALSE, Whitespace et FRACTRAN!]
ShreevatsaR
4
Je voudrais juste ajouter un peu à la partie sur la vitesse. La "vitesse" dans les concours comme le GCJ est la complexité d'exécution du code (c'est-à-dire big-O). Dans le GCJ, l'algorithme correct est généralement accepté même dans un langage lent (il y a donc beaucoup de soumissions Python acceptées) tandis qu'un algorithme lent prendra une éternité, même dans asm. Il y a des exceptions, mais généralement si vous utilisez le bon algorithme / technique, vous êtes en sécurité même avec un langage plus lent.
MAK
1
@EvgeniSergeev Ce que vous dites est vrai pour la plupart des concours de programmation, comme IOI / TopCoder, mais dans GCJ en particulier, les limites de temps sont généralement de 8 minutes pour la grande entrée, et les problèmes sont généralement conçus pour que les solutions Python puissent également passer. Il y a encore 10 ans, la règle empirique était de ~ 10 ^ 9 opérations "simples" par seconde, donc par exemple pour distinguer O (n ^ 2) de Ω (n ^ 3), nous avons juste besoin de n ^ 2 <10 ^ 9 * 60 * 8 <n ^ 3, soit environ 8000 <n <692000. Vous pouvez prendre n = 20000, et n ^ 2 algo même dans une langue 400x plus lente (10 ^ 9/400 par s) ne prendra que 160 secondes, alors que même fast n ^ 3 prendra 8000 secondes.
ShreevatsaR
14

J'ai aimé l'idée de Jerry Coffin de tracer les candidats au concours Google AI, alors j'ai pris tous les résultats et les ai tracés (moyenne calculée, écart type, puis tracé les courbes de distribution normales dans Excel).

Avec Lua et JS, j'ai ceci:

Sans (il y avait peu de candidats, donc peut-être que les résultats sont biaisés):

Il semble que les participants Java aient fait bien pire que les autres, tandis que Go, Common Lisp et C sont du meilleur côté.

Tatiana Racheva
la source
Cependant, la question posée sur Google Code Jam et non sur le concours Google AI (votre réponse est le premier endroit où j'en entends parler), il pourrait donc être plus pertinent de dessiner ces graphiques pour Google Code Jam. En fait, la question mentionne déjà de telles statistiques (2010) ; voir également 2011 , 2012 , 2013 et 2014 (en cours actuellement) .
ShreevatsaR
12

Pourquoi nous parlons tous anglais et non espéranto ? Eh bien, c'est arrivé ainsi. Même si l'anglais est incohérent et gonflé et que l'espéranto est intentionnellement conçu comme un «meilleur outil».

Ainsi, une des raisons est une tradition. Dans la plupart des écoles, la programmation est toujours enseignée en C / C ++, Java, Pascal ou même Basic. Et participez à ces concours principalement des étudiants, qui choisissent la langue qu'ils connaissent mieux.
En outre, vous pouvez remarquer que la plupart des livres algorithmiques comportent psedudocode dans le style de Pascal ou Ada, et très très rarement - Lisp. Je ne sais pas pourquoi, peut-être aussi une tradition. Ou peut-être que ce n'est pas si bon pour les algorithmes.

Une autre raison serait la vitesse. Bien que ce ne soit pas un problème pour Google Code Jam, dans presque tous les concours, un écart de vitesse 2x est une différence entre les verdicts `` Accepté '' et `` Limite de temps ''.
En d'autres termes, si un algorithme optimal en C ++ s'exécute 10 fois plus vite qu'en Ruby, cela peut signifier qu'un algorithme sous-optimal en C ++ sera toujours plus rapide qu'un bon algorithme en Ruby. Et les auteurs de concours ne veulent généralement pas autoriser les soumissions O (n ^ 2), si O (n * logn) peut être atteint.

Nikita Rybak
la source
7
Juste un commentaire sur votre analogie: l'espéranto échoue lamentablement à ses objectifs. Ses sons sont à peu près ceux du dialecte polonais de Zamenhof, et sa grammaire est artificielle et compliquée. Ce n'est en aucun cas un bon langage universel; Le klingon, à bien des égards, fait mieux pour ressembler à un langage humain naturel. On pourrait, je suppose, affirmer qu'il y a des similitudes avec C ++ et Java, mais ce serait injuste :) (Voir aussi xibalba.demon.co.uk/jbr/ranto .)
Antal Spector-Zabusky
1
@Antal Eh bien, l'analogie peut être erronée, mais vous comprenez mon point. Entre vous et moi, je ne parle pas non plus l'espéranto :)
Nikita Rybak
Le langage (naturel) est un insigne d'appartenance tribale , et les langages de programmation sont influencés par bon nombre des mêmes pressions
trapèze
12

Tout d'abord, je remettrais en question votre prémisse [modifier: ou ce que je prends pour une prémisse - que les concurrents utilisant C ++ et Java s'en tirent à peu près aussi bien]. Par exemple, voici quelles langues ont été utilisées pour les entrées qui sont arrivées dans les 100 premières places et les 100 dernières places du récent concours d'IA de Google:

texte alternatif

Les participants utilisant C ++ et Java ne semblent pas être nulle part à proximité de succès également dans ce concours. Les concurrents utilisant Python ne semblaient pas non plus s'en tirer particulièrement bien, bien qu'ils soient considérablement moins nombreux, ce qui affaiblit toute conclusion à cet égard.

Deuxièmement, bien sûr, une grande partie de l'explication (comme d'autres l'ont souligné) est sans aucun doute juste le nombre de personnes qui connaissent chaque langue. Il y a probablement plus de personnes qui suivent un cours en Java en ce moment que le nombre total de personnes qui ont déjà écrit des Lisp, Scheme ou Prolog.

Edit: Je pense qu'une troisième possibilité est simplement la polyvalence. Pour prendre un exemple extrême, Prolog est très bien adapté à quelques problèmes, mais également mal adapté à de nombreux autres. Peu de gens peuvent (ou du moins apprennent) plus d'une ou deux langues assez bien pour les utiliser dans un concours, donc la plupart des personnes intéressées par de telles choses sont susceptibles de choisir des langues qui peuvent fonctionner raisonnablement bien pour presque tout, plutôt que essayer d'apprendre une langue spécialisée pour chaque problème qui pourrait être choisi.

Jerry Coffin
la source
1
Eh bien, il semble que la plupart des principaux participants aient utilisé C ++ / C # et que moins d'entre eux aient utilisé Python / Haskell / Lisp / Scheme / Ruby / Prolog, ce qui renforce la prémisse de la question, n'est-ce pas? La question n'était pas de comparer C ++ et Java entre eux (bien que ce soit intéressant, merci), mais quelque chose comme: ”Pourquoi les" jolis "langages sont-ils moins performants au sommet? Pourquoi les bons candidats (qui connaissent probablement de nombreuses langues) ne choisissent-ils pas l'un d'entre eux? » Mais je suis d'accord que la familiarité est l'une des principales raisons.
ShreevatsaR
Mon impression (peut-être erronée) était que la question supposée que les concurrents utilisant C ++ et Java avaient à peu près le même succès. Cela peut être vrai dans certains concours, mais cela ne semble certainement pas l'être dans celui-ci. Bien qu'il soit certainement vrai qu'ils étaient moins nombreux, les candidats utilisant Go, Haskell, Lua et CL semblaient avoir plus de succès que ceux utilisant Java (bien que, certes, en termes de taux de réussite, C ++ semble certainement dominer, du moins en ce cas particulier).
Jerry Coffin
5
Pardon my nit-pickin 'mais cela devrait vraiment être un graphique à barres plutôt qu'un graphique linéaire ...
tzaman
Oh mon. J'ai du mal à faire un graphique qui a du sens pendant une heure et je ne fais pas de progrès. Les feuilles de calcul Excel et Google me font me sentir stupide.
Tatiana Racheva
Lisp ne peut-il pas techniquement être utilisé comme préprocesseur de macro C / C ++ ...? Vous pourriez donner l'impression que vous avez soumis un programme C ++ mais en fait vous avez codé en Lisp!
aoeu256
12

Dans presque tous les cycles de Google Code Jam, les concurrents les plus performants codent en C ++.

Vous trouverez ci-dessous les statistiques linguistiques de Google Code Jam 2012 Round 1A, 1B et 1C (répertoriées de haut en bas). Le nombre de participants à chaque tour est respectivement de 3 686, 3 281 et 3 189.

Statistiques linguistiques de Google Code Jam 2012 Round 1A Statistiques linguistiques de Google Code Jam 2012 Round 1B Statistiques linguistiques de Google Code Jam 2012 Round 1C

Rose Perrone
la source
8

question amusante, devrait probablement être le wiki de la communauté.

Regardez le nombre de finalistes par pays: http://www.go-hero.net/jam/10/regions . remarquez le nombre de personnes d'Europe de l'Est et de Russie. ces endroits ont des communautés C ++ très fortes, ainsi que Java, pour un certain nombre de raisons.

regardez les langues des nombres dans les qualificatifs: http://www.go-hero.net/jam/10/languages/0 et finals: http://www.go-hero.net/jam/10/languages/6 . C ++ commence moins de la moitié et a 75% en finale. soit les bons programmeurs préfèrent C ++ ou C ++ fait les programmeurs. Probablement au moment où vous maîtrisez C ++, d'autres choses deviennent triviales.

Vous êtes cependant libre de tirer vos propres conclusions.

Anycorn
la source
5

Tout d'abord, comme vous l'avez souligné C++, ce Javasont des langues courantes. Cela signifie automatiquement que les personnes qui commencent à faire des concours de programmation leur seront présentées en premier - d'ailleurs qui apprend Lispcomme langue maternelle :) Je participe aussi régulièrement à de telles compétitions - j'utilise C++pour concourir, bien que ma langue préférée soit Java. C'est juste que je veux pratiquer une autre langue en dehors de Java- aussiC++est un peu moins verbeux et fonctionne plus vite, ce qui est important pour la programmation de concours. Maintenant, à mon point - les gens deviennent d'abord des experts dans les langues traditionnelles. Pour participer à des concours de programmation, vous devez avoir une assez bonne compréhension du langage que vous utilisez. Vous n'avez pas le temps de rechercher sur Internet des choses stupides - comme oublier une construction. C'est juste que la vitesse y est un facteur important. UtiliserLispdans une compétition, vous devez l'aimer. Je ne pense pas qu'il y ait autant de monde là-bas. Corrigez-moi si je me trompe. Et honnêtement, les avantages que vous avez mentionnés simplifient le retour en arrière: quelle que soit la langue, le retour en arrière est facile - déclarez une méthode et rappelez-la pour chaque résultat possible. Cela ne pouvait pas être plus simple. Je n'ai pas senti jusqu'à présent que le langage que j'utilise est d'essayer de trébucher pour les concours de programmation.

Petar Minchev
la source
Le pluriel de l'anecdote n'est peut-être pas une donnée, mais j'ai appris Scheme comme première langue et mon cours d'introduction CS était en Haskell. Je conviens que cela semble inhabituel, cependant: C / C ++ / Java / Python semblent être les plus populaires.
Wang
Bon point; Je pense que cela va au cœur du problème. Pour les programmeurs ayant suffisamment d'expérience pour faire les choses qui reviennent fréquemment, il n'y a vraiment pas de grands avantages dans d'autres langues. (Et des fonctionnalités telles que, par exemple, la capacité de traitement de texte de Perl sont rarement utiles dans ces concours.)
ShreevatsaR
3

OMG ... Les gens passent tous par les statistiques et les chiffres !!

N'oublions pas les bases .. Ce sont les deux seules langues (pour la plupart) qui sont enseignées aux gens dans les collèges / écoles ...!

Cela pourrait répondre à la forte ruée!

Arpit
la source
3

Une raison vitale pourrait être que tous les concours ne prennent pas en charge des langages comme python ou prologue. Spécialement ACM ICPC World Finals prend en charge C / C ++ et Java . Et TopCoder ne prend également en charge que C ++, Java, C #, VB et maintenant Python . Il est naturel pour les participants de choisir une langue disponible dans chaque concours. Une autre raison pourrait être la vitesse d'exécution. Et oui, une autre raison est que ce sont les langues que la plupart des gens apprennent en premier.

taskinoor
la source
2

Les grandes bibliothèques étaient un argument de vente pour Java dans ACM ICPC. Il est pratique de pouvoir réaliser que vous voulez une structure de données aléatoire ou un algorithme et de simplement le retirer des bibliothèques standard.

Wang
la source
2

Gardez à l'esprit que C ++ n'est pas seulement la majorité parmi tous les concurrents, mais au fur et à mesure que les tours progressent, son pourcentage ne cesse de s'améliorer.

Je dirais qu'il est vrai que la plupart des participants sont des étudiants (cependant, comme il s'agit d'un tournoi ouvert avec des chances de passer un entretien d'embauche avec Google, alors vous devez considérer que beaucoup de ceux qui participent sont diplômés). Mais les dernières rondes sont réservées aux personnes ayant une tonne d'expérience. Ce ne sont pas seulement des étudiants qui viennent d'apprendre à coder en C ++ / Java.

Bien sûr, l'argument étudiant fonctionne également avec des langages comme LISP et OcaML ou ProLog. Ce sont des langues, qui sont beaucoup utilisées dans les domaines de l'IA, mais dans le monde ordinaire, les étudiants sont les plus susceptibles de les apprendre et de les utiliser.

Les grands concours autres que Google prennent en charge quelques langages, mais cela n'expliquerait toujours pas pourquoi Pascal ou .net ne sont pas proches du niveau de Java (car ils ont tendance à être également pris en charge dans les principaux événements de concours).

Beaucoup des meilleurs codeurs de ces concours connaissent beaucoup de langues. Mais ils préfèrent toujours utiliser C ++ pendant les tours, ce doit être pour une raison plus grande que "C ++ appris" d'abord.

Je contesterais l'affirmation selon laquelle les langages autres que C ++ ou Java sont de meilleurs outils pour le travail. Si les données directes indiquent que les finalistes sont plus susceptibles d'utiliser C ++ et Java, c'est une contradiction directe avec cette affirmation.

Les données de la concurrence de Google AI ne contredisent en fait aucune prémisse concernant le blocage de code. Cela montre en fait que les meilleurs codeurs sont capables d'utiliser des langages comme Common Lisp alors que c'est vraiment le meilleur outil pour le travail. Si nous voulons utiliser ces données pour supposer que CLISP est un excellent outil pour les compétitions d'IA, nous devons également supposer que C ++ est un excellent outil pour les compétitions d'algorithmes comme GCJ.

UltraAwesomeAnonymousSpy
la source