93 votes

Pourquoi les concurrents de compétition programmation utilisent C++ et Java ?

Après la compétition de cette année, Google Code Jam de la concurrence, je ne pouvais pas aider mais noter le nombre incroyable de [réussi] les participants qui ont utilisé le C/C++ et Java. La répartition des langues utilisées tout au long de la compétition peut être vu ici.

Après la programmation en C/C++ depuis plusieurs années, j'ai récemment tombé en amour avec Python pour ses lisible et simple de la nature. Plus récemment, j'ai appris les langages fonctionnels comme OCaml, Régime, et même de la logique de langues comme le Prologue. Ces langues ont certainement leurs mérites et, à mon avis, peuvent être appliquées plus facilement que C++ et Java pour certaines situations. Par exemple, le Schéma de l'utilisation de call/cc simplifie les retours en arrière (un outil nécessaire pour répondre à plusieurs problèmes) et le Prologue de la logique de spécification, bien que peu efficace en raison de sa force brute de la nature, peut considérablement simplifier (et même de résoudre automatiquement certains problèmes qui sont difficiles à enrouler son cerveau autour de.

Il est clair qu'un concours concurrent doit utiliser les outils qui sont les mieux adaptés pour le défi. Même x86 assemblée est Turing - ce qui ne veut pas justifier la résolution de problèmes avec elle. Dans ce cas, pourquoi les concurrents qui utilisent des langues moins courantes comme le Régime de/Lisp, Prolog, et même le Python beaucoup moins de succès que les concurrents qui utilisent C/C++ et Java? Formulé différemment, pourquoi ne pas les concurrents utilisent des langages qui, bien que peut-être moins "mainstream", sont sans doute de meilleurs outils pour le travail?

Il y a plusieurs motivations pour ma question. Plus important encore, je voudrais devenir un meilleur développeur - à la fois dans l'aspect pratique et l'aspect compétition. Après avoir été présenté à ces belles paradigmes comme fonctionnelle et logique de programmation, il est décourageant de voir autant de gens jeter en faveur de C/C++ et Java. Elle même me fait douter de mon admiration pour ces paradigmes, inquiétant de constater que je ne peut pas réussir en tant que Lisp/Scheme/Prolog programmeur dans une programmation de la concurrence.

67voto

ShreevatsaR Points 21219

Excellente question! Comme quelqu'un qui a barboté dans la programmation des concours un peu moi-même, j'ai peut-être quelque chose à dire.

[Let's get la norme avertissement hors de la voie: concours de programmation est vaguement lié à la programmation "dans le monde réel", et alors qu'il tests algorithmiques et compétences en résolution de problèmes et la capacité à venir avec rapide sans bug code de travail sous la pression du temps, il n'est pas nécessairement corrélée avec le fait d'être en mesure de construire de grands projets logiciels, écrire de code faciles à gérer, etc (au-delà du fait que bien des programmes structurés sont plus facile à déboguer).]

Maintenant, pour quelques réponses:

  • C++/Java sont plus fréquents que d'autres langues dans le monde réel, de sorte que vous vous attendez à voir une proportion plus élevée de n'importe où. (Mais c'est encore plus élevée dans les concours de la population.)

  • Nombre de ces participants sont des étudiants, ou obtenu dans les concours que les étudiants, et de C++/Java sont plus fréquents "première langue" que les élèves apprennent. (Premier cycle étudiants de ces jours peut commencer avec le Schéma, Haskell, Python, etc., mais les lycéens (souvent autodidacte) moins souvent.) En fait, beaucoup de l'europe de l'est participants utilisent encore Pascal, et sont de plus étonnant à ce que le reste d'entre nous ne sera jamais avec n'importe quelle langue.

  • L'école et au collège-niveau des concours généralement l'utilisation de ces langues. L'Olympiade Internationale en Informatique (IOI) ne permet que C, C++ et Pascal (ou peut-être il permet à Java maintenant; je n'ai pas gardé), et le MCA Intercollégial de Programmation Concours (ACM ICPC) ne permet que C, C++ et Java. TopCoder permet C++, Java, C# et VB (vraiment :p), et récemment, Python. On pourrait dire que le "concours de l'écosystème" a plus de C++/Java programmeurs. Google Code Jam et de l' IPSC sont parmi les rares à des concours qui permettent de code dans n'importe quelle langue, en fait.

  • Maintenant, la question est, dans GCJ où les participants sont libres de choisir une langue, pourquoi n'auraient-ils pas choisir de Python ou de Régime? Le facteur le plus pertinent, c'est que ces langues sont lents. Bien sûr, pour la plupart dans le monde réel de la programmation, ils sont facilement assez rapide, mais pour les boucles serrées qui sont souvent impliqués dans l'obtention d'un programme à exécuter en vertu de la n-deuxième limite pour tous les cas de test, ces langues ne coupe pas pour tout de la algorithmiquement plus impliqués problèmes. (Un problème conçu pour accepter des O(n log n) des solutions, mais pas de Θ(n2) solutions pour le C/C++ fréquemment règles, même optimale en O(n log n) des solutions en plus lent langues. Même Java utilisé pour être donner un handicap à USACO; je ne suis pas sûr que ce soit toujours le cas.)

  • Un autre facteur est l'bibliothèques: C++ et Java ont de meilleures bibliothèques pour souvent utile d'algorithmes et structures de données (par exemple, arbres rouge-noir, C++next_permutation), tandis que le Python bibliothèques (assez bon pour le monde réel) sont moins utiles ici, et Prologue et d'un Système de... je ne sais pas à propos de leurs bibliothèques. C'est un facteur relativement mineur, parce que ces programmeurs peuvent écrire leur propre code si nécessaire. :-)

  • Usage général multi-paradigme sont les langues les plus utiles pour juste faire les choses dans les contraintes de temps du concours, que des langues que la force d'une philosophie ou une façon de faire les choses sur vous. C'est pourquoi Prolog restera toujours impopulaire, par exemple. (Philosophie générale: certaines langues sont "activation" des langues qui vous permettent de tout faire, y compris se tirer une balle dans le pied, certains sont de "diriger" qui vous obligent à faire les choses de la bonne façon.) C'est aussi pourquoi le C++ est trois fois plus populaire que Java en général, les participants au concours, et de plus en plus populaire parmi les meilleurs participants. Parce que le code n'a pas à être lu par quelqu'un d'autre, c'est ok et même utile d'avoir de la boucle de macros comme FOR(i,n) (moins de code à taper, et plus important encore moins de chance de faire un bug lors de la pressés). Rien contre Java, il y a quelques programmeurs qui utilisent Java. :-)

  • Enfin, bien que beaucoup de ces haut les programmeurs peuvent avoir C++/Java/Pascal comme leur "langue première", ils ne sont pas bon à cause de leur langue, de sorte que vous n'avez pas à désespérer. Beaucoup de ces mêmes programmeurs ont gagné des concours comme l' ICFP concours , même avec intentionnellement à l'aide de fou langues comme des scripts shell, m4 (utilisé dans autoconf), et à l'assemblée (l'équipe nommée "Vous ne Pouvez pas Orthographier Génial Sans ASM").

14voto

Tatiana Racheva Points 547

J'ai aimé Jerry Cercueil de l'idée de complot concurrents de Google IA concours, donc j'ai pris tous les résultats et tracées (calculé la moyenne, l'écart type, et ensuite de dessiner les courbes de distribution normales dans Excel).

Avec Lua et le JS, obtenu ceci:

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

Il ressemble à Java, les participants n'ont nettement pire que le reste, tout de Go, Common Lisp, et C sont sur la meilleure fin.

12voto

Nikita Rybak Points 36641

Pourquoi nous en parlons tous anglais et l'Espéranto? Eh bien, c'est juste arrivé. Même si l'anglais n'est pas uniforme et de ballonnement et de l'Espéranto est intentionnellement conçu comme "meilleur" outil.

Ainsi, une des raisons est une tradition. Dans la plupart des écoles de la programmation est encore enseigné en C/C++, Java, Pascal ou même de Base. Et de participer à ces concours étudiants pour la plupart, qui font le choix de la langue qu'ils connaissent mieux.
Aussi, vous pouvez remarquer que la plupart des algorithmes de livres fonctionnalité 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 c'est juste pas très bon pour les algorithmes.

Une autre raison serait la vitesse. Bien qu'il n'est pas un problème pour Google Code Jam, dans presque tous les concours de vitesse 2x écart est la différence entre "Accepté" et "Temps Limite" verdicts.
En d'autres termes, si l'algorithme optimal en C++ fonctionne 10 fois plus rapide que dans le Rubis, il se peut que les sous-optimale de l'algorithme en C++ sera toujours plus rapide qu'un bon en Ruby. Et concours auteurs ne veulent généralement pas permettre à O(n^2) soumissions, si O(n*logn) peuvent être atteints.

12voto

Jerry Coffin Points 237758

Tout d'abord, je voudrais remettre en question votre prémisse [edit: ou ce que je pense être une prémisse -- que les participants à l'aide de C++ et Java tarif tout aussi bien]. Par exemple, voici ce que les langues ont été utilisées pour les entrées qui sont venus dans les 100 premières places et le dernier de 100 places dans Google récente de l'IA du concours:

alt text

Les participants à l'aide de C++ et Java ne semble pas être n'importe où près de autant de succès dans ce concours. Les participants à l'aide de Python ne semble pas de tarif particulièrement bien soit, mais il y avait beaucoup moins d'entre eux, l'affaiblissement aucune conclusion à cet égard.

Deuxièmement, bien sûr, beaucoup de l'explication (comme d'autres l'ont souligné) est sans doute que le nombre de personnes qui sont familiers avec la langue. Il y a probablement plus de gens de prendre un cours de Java que le nombre total de personnes qui ont écrit des Lisp, Scheme ou Prolog.

Edit: je pense qu'une troisième possibilité est tout simplement la polyvalence. Pour choisir un exemple extrême, le Prologue est très bien adapté à un peu de problèmes, mais tout aussi mal adapté à de nombreux autres. Peu de gens peuvent (ou au moins ne) en savoir plus d'une ou deux langues assez bien pour les utiliser dans un concours, donc la plupart des gens qui sont intéressés par ces choses sont susceptibles de choisir la langue qui peut fonctionner raisonnablement bien pour presque rien, plutôt que d'essayer d'apprendre un langage spécialisé pour chaque problème qui pourrait être choisi.

12voto

Rose Perrone Points 14478

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

Ci-dessous sont le langage stats de Google Code Jam 2012 Tour 1A, 1B et 1C (énumérés haut vers le bas). Le nombre de participants dans chaque tour sont 3,686, 3,281, et 3,189 respectivement.

Language Stats from Google Code Jam 2012 Round 1ALanguage Stats from Google Code Jam 2012 Round 1BLanguage Stats from Google Code Jam 2012 Round 1C

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X