Pourquoi faire de la programmation de la concurrence les concurrents d'utiliser C++ et Java?
Après la compétition et 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 réussie 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.
- Je suppose que la vitesse d'exécution peut aussi être un facteur.
- Question intéressante; ce serait bien d'obtenir des réponses de la part des participants, dans le Code de la Confiture ou d'autres compétitions (ACM, etc). Temps de fonctionnement limites de partialité à l'encontre des langages interprétés, mais...
- Dynamique des langues ont un énorme problème de performance: voir benchmark
- Qu'en C#!?
- Pour Topcoder, c'est tout simplement parce qu'ils ont une règle interdisant l'utilisation de rien, mais les bibliothèques standard Python, qui fait autre chose que des tâches insignifiantes impossible. Recherche d'astéroïdes dans l'espace des images? Trop mauvais, vous ne pouvez même pas utiliser NumPy.
Vous devez vous connecter pour publier un commentaire.
Grande 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 quelques réponses:
C++/Java sont plus fréquents que d'autres langues dans le monde réel, ainsi, 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 ou du 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 à la hauteur), 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 en elle. Google Code Jam et 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 lent. 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), des 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++'s 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 aussi. 🙂Enfin, bien que beaucoup de ces haut les programmeurs peuvent avoir C++/Java/Pascal comme leur "langue première", ils ne sont pas bons parce que de leur langue, de sorte que vous n'avez pas à désespérer à ce sujet. Beaucoup de ces mêmes programmeurs ont gagné des concours comme le 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").
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.
Pourquoi l'on parle anglais et pas L'espéranto? Eh bien, il vient de se passer ainsi. 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.
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 le 100 premiers lieux et les dernière Cent endroits dans Google récente de IA concours:
Concurrents à l'aide de C++ et Java ne semble pas être n'importe où près également à la réussite du 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ème, 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, Prolog est très bien adaptés à quelques problèmes, mais 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.
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.
plaisir question, devrait probablement être de la communauté wiki.
Regarder le nombre de finalistes par pays: http://www.go-hero.net/jam/10/regions. avis de nombre de personnes de l'Est de l'Europe et de la Russie. ces lieux ont une très forte C++ communautés, ainsi que Java, pour nombre de raisons.
regarder le nombre de langues dans les qualificatifs: http://www.go-hero.net/jam/10/languages/0 et finales: http://www.go-hero.net/jam/10/languages/6. C++ commence moins de la moitié de 75 pour cent dans les finales. de bons programmeurs préfèrent C++ ou le C++ permet la part des programmeurs. Probablement par le temps de vous le maître de C++, d'autres choses se banalise.
Libre à vous d'en tirer vos propres conclusions bien que.
Tout d'abord, comme vous l'avez fait
C++
etJava
sont les principaux langages. Ces signifie automatiquement que les personnes qui commencent à faire de la programmation des compétitions sera introduite d'abord par le chemin qui apprendLisp
comme première langue:) j'ai aussi participer régulièrement à des compétitions - je utiliserC++
à la concurrence, bien que ma langue préférée estJava
. C'est juste que je veux à la pratique d'une autre langue en dehors deJava
- aussiC++
est un peu moins verbeux et s'exécute plus rapidement ce qui est important pour la programmation des compétitions.Maintenant, à mon point gens à devenir des experts d'abord, dans les principales langues. Pour participer à la programmation des compétitions, vous devez avoir une bonne maîtrise de la langue que vous utilisez. Vous n'avez pas le temps de faire des recherches sur internet pour des choses stupides comme oublié une construction. C'est juste que la vitesse est un facteur important là. Pour utiliser
Lisp
à un concours, vous devez être friands. Je ne pense pas qu'il existe un tel nombre de gens là-bas. Corrigez-moi si je me trompe. Et honnêtement, les avantages que vous avez cité, comme simplifie la mandature: quelle que soit la langue de mandature est facile de déclarer une méthode et viens de l'appeler à nouveau à chaque résultat possible. Il ne pouvait pas être plus simple. Je n'ai pas eu jusqu'à présent que la langue que j'utilise est d'essayer de voyage jusqu'à mes pieds pour la programmation des compétitions.OMG ... les Gens sont tous en passant par les Statistiques et les Chiffres !!
Permet de ne pas oublier les bases.. ce sont les deux seules langues (principalement), qui sont enseignées aux personnes dans le collège/à l'école...!
Qui pourrait répondre à la ruée vers l'lourds!
Une raison vitale pourrait être que tous les concours ne prennent pas en charge les langages comme python ou prolog. Spécialement ACM ICPC Finales mondiales de soutien de C/C++ et Java. Et TopCoder prend également en charge seulement C++, Java, C#, VB, et maintenant Python. Il est naturel pour les candidats qu'ils choisissent une langue qui est disponible dans tous les 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.
Grandes bibliothèques ont un point de vente pour Java dans les ACM ICPC. C'est pratique pour être en mesure de réaliser que vous voulez un peu aléatoire de la structure de données ou de l'algorithme et juste de le tirer hors de la norme bibliothèques.
Garder à l'esprit que le C++ n'est pas seulement de la majorité parmi tous les concurrents, mais, comme les tours de progrès, son pourcentage ne cesse et ne cesse de s'améliorer.
Je dirais que c'est vrai que la plupart des participants sont des étudiants (Cependant, puisque c'est un tournoi ouvert avec des chances à un entretien d'embauche avec google, alors vous avez à considérer que beaucoup de ceux qui participent sont gradués). Mais les dernières séries sont seulement pour les personnes avec une tonne d'expérience. Ils ne sont pas seulement les étudiants qui ont juste appris à coder en C++ /Java.
De cours, l'étudiant argument fonctionne aussi contre des langages comme LISP et OcaML ou ProLog. Qui est des langues, qui sont beaucoup utilisés dans l'IA domaines, mais dans le monde en général les étudiants sont les plus susceptibles d'être à l'apprentissage et à les utiliser.
Grands concours autres que google support de plusieurs langues, mais cela n'explique pas pourquoi Pascal ou .net ne sont pas près de le niveau de Java (Car ils ont tendance à être également pris en charge dans les grands concours, événements).
Beaucoup des meilleurs programmeurs dans ces compétitions sais que beaucoup de langues. Mais ils préfèrent encore utiliser C++ pendant les tours il doit être pour une plus grande raison que "appris le C++" en premier.
Je dirais encontre de la demande que d'autres langues que le C++ ou le Java sont de meilleurs outils pour le travail. Si directe des données indique que les finalistes sont plus susceptibles d'utiliser le C++ et Java, il est en contradiction directe avec la demande.
Google IA concurrence de données n'est pas réellement en contradiction avec aucune prémisse concernant le code de la confiture. C'est en fait de montrer que les codeurs de top sont en mesure d'utiliser les langues comme Common Lisp quand il est vraiment le meilleur outil pour le travail. Si nous voulons utiliser ces données à supposer que CLISP est un excellent outil pour l'IA des compétitions, nous devrions nous supposons que C++ est un excellent outil pour l'algorithme de compétitions telles que le GCJ.