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.
la source
Réponses:
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 comme
FOR(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").
la source
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é.
la source
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.
la source
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:
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.
la source
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.
la source
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.
la source
Tout d'abord, comme vous l'avez souligné
C++
, ceJava
sont 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 apprendLisp
comme langue maternelle :) Je participe aussi régulièrement à de telles compétitions - j'utiliseC++
pour concourir, bien que ma langue préférée soitJava
. C'est juste que je veux pratiquer une autre langue en dehors deJava
- 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. UtiliserLisp
dans 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.la source
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!
la source
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.
la source
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.
la source
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.
la source