Nachdem ich an dem diesjährigen Google Code Jam- Wettbewerb teilgenommen und ihm gefolgt war, bemerkte ich die unglaubliche Anzahl [erfolgreicher] Teilnehmer, die C / C ++ und Java verwendeten. Die Verteilung der während des Wettbewerbs verwendeten Sprachen ist hier zu sehen .
Nachdem ich einige Jahre in C / C ++ programmiert hatte, habe ich mich kürzlich in Python verliebt, weil es lesbar und unkompliziert ist. In jüngerer Zeit habe ich funktionale Sprachen wie OCaml, Scheme und sogar Logiksprachen wie Prolog gelernt. Diese Sprachen haben sicherlich ihre Vorzüge und können meiner Meinung nach in bestimmten Situationen einfacher angewendet werden als C ++ und Java. Beispielsweise vereinfacht die Verwendung von call / cc durch Scheme das Backtracking (ein Tool, das zur Beantwortung mehrerer Probleme erforderlich ist), und die Logikspezifikation von Prolog kann, obwohl sie aufgrund ihrer Brute-Force-Natur ineffizient ist, bestimmte Probleme, die schwer zu lösen sind, drastisch vereinfachen (und sogar automatisch lösen) das Gehirn umhüllen.
Es ist klar, dass ein Wettbewerbsteilnehmer die Werkzeuge verwenden sollte, die für die Herausforderung am besten geeignet sind. Sogar die x86-Assembly ist vollständig - das rechtfertigt nicht die Lösung von Problemen damit. Warum sind in diesem Fall die Teilnehmer, die weniger gebräuchliche Sprachen wie Scheme / Lisp, Prolog und sogar Python verwenden, signifikant weniger erfolgreich als Teilnehmer, die C / C ++ und Java verwenden? Anders ausgedrückt, warum verwenden erfolgreiche Teilnehmer keine Sprachen, die zwar weniger Mainstream sind, aber wohl bessere Werkzeuge für den Job sind?
Für meine Frage gibt es mehrere Gründe. Vor allem möchte ich ein besserer Programmierer werden - sowohl im praktischen als auch im Wettbewerbsbereich. Nach der Einführung in so schöne Paradigmen wie funktionale und logische Programmierung ist es entmutigend zu sehen, dass so viele Leute sie zugunsten von C / C ++ und Java verwerfen. Ich stelle sogar meine Bewunderung für diese Paradigmen in Frage und mache mir Sorgen, dass ich als Lisp / Scheme / Prolog-Programmierer in einem Programmierwettbewerb nicht erfolgreich sein kann.
quelle
Antworten:
Gute Frage! Als jemand, der sich selbst ein bisschen mit Programmierwettbewerben beschäftigt hat, kann ich etwas zu sagen haben.
[Lassen Sie uns den Standard-Haftungsausschluss aus dem Weg räumen: Die Programmierung von Wettbewerben hängt nur lose mit der "Programmierung in der realen Welt" zusammen und testet dabei algorithmische Fähigkeiten und Fähigkeiten zur Problemlösung sowie die Fähigkeit, schnell fehlerfreien Arbeitscode zu entwickeln Zeitdruck, es korreliert nicht unbedingt mit der Fähigkeit, große Softwareprojekte zu erstellen, wartbaren Code zu schreiben usw. (abgesehen von der Tatsache, dass gut strukturierte Programme einfacher zu debuggen sind).]
Nun zu einigen Antworten:
C ++ / Java sind auch in der realen Welt häufiger als andere Sprachen, sodass Sie überall einen höheren Anteil erwarten würden. (Aber es ist noch höher in der Wettbewerbspopulation.)
Viele dieser Teilnehmer sind Studenten oder haben als Studenten an Wettbewerben teilgenommen, und C ++ / Java sind häufigere "Muttersprachen", die Studenten lernen. (Studenten beginnen heutzutage vielleicht mit Scheme, Haskell, Python usw., aber Highschooler (oft Autodidakten) seltener.) Tatsächlich verwenden viele osteuropäische Teilnehmer immer noch Pascal und sind damit erstaunlicher als der Rest von uns wird jemals mit irgendeiner Sprache sein.
Bei Wettbewerben auf Schul- und Hochschulebene werden diese Sprachen normalerweise verwendet. Die Internationale Olympiade der Informatik (IOI) erlaubt nur C, C ++ und Pascal (oder vielleicht erlaubt sie jetzt Java; ich habe nicht Schritt gehalten), und der ACM Intercollegiate Programming Contest (ACM ICPC) erlaubt nur C, C ++ und Java. TopCoder erlaubt C ++, Java, C # und VB (wirklich: p); und vor kurzem Python. Man könnte also sagen, dass das "Contest-Ökosystem" mehr C ++ / Java-Programmierer enthält. Google Code Jam und IPSC gehören zu den wenigen Wettbewerben, bei denen Code in jeder Sprache zulässig ist.
Nun stellt sich die Frage, warum die Teilnehmer in GCJ, wo sie eine Sprache frei wählen können, nicht Python oder Scheme wählen würden. Der wichtigste Faktor ist, dass diese Sprachen langsam sind . Sicher, für die meisten realen Programme sind sie leicht schnell genug, aber für die engen Schleifen, die häufig dazu führen, dass ein Programm für alle Testfälle unter der Grenze von n Sekunden ausgeführt wird, sind diese Sprachen für keine der beiden Sprachen geeignet die algorithmisch komplizierteren Probleme. (Ein Problem, das entwickelt wurde, um O (n log n) -Lösungen zu akzeptieren, aber nicht Θ (n 2 ) -Lösungen für C / C ++, schließt häufig sogar optimale O (n log n) -Lösungen in langsameren Sprachen aus. Sogar Java hatte früher ein Handicap USACO; Ich bin mir nicht sicher, ob dies immer noch der Fall ist.)
Ein weiterer Faktor sind die Bibliotheken: C ++ und Java haben bessere Bibliotheken für häufig nützliche Algorithmen und Datenstrukturen (z. B. rot-schwarze Bäume, C ++ 's next_permutation), während Pythons Bibliotheken (gut genug für die reale Welt) hier weniger nützlich sind und Prolog und Scheme ... Ich weiß nichts über ihre Bibliotheken. Dies ist ein relativ kleiner Faktor, da diese Programmierer bei Bedarf ihren eigenen Code schreiben können. :-)
Allzweck-Mehrparadigmensprachen sind nützlicher, um Dinge innerhalb der Zeitbeschränkungen des Wettbewerbs zu erledigen, als Sprachen, die Ihnen eine Philosophie oder eine Art und Weise aufzwingen, Dinge zu tun. Deshalb bleibt Prolog zum Beispiel immer unbeliebt. (Allgemeine Philosophie: Einige Sprachen "aktivieren" Sprachen, mit denen Sie alles tun können, einschließlich sich selbst in den Fuß zu schießen, andere "lenken", die Sie dazu zwingen, die Dinge richtig zu machen.) Aus diesem Grund ist C ++ dreimal so beliebt wie Java bei den allgemeinen Wettbewerbsteilnehmern und viel beliebter bei den Top-Teilnehmern. Da Code von niemand anderem gelesen werden muss, ist es in Ordnung und sogar nützlich, Schleifenmakros wie zu haben
FOR(i,n)
(weniger Code zum Eingeben und vor allem weniger Wahrscheinlichkeit, in Eile einen Fehler zu machen). Nichts gegen Java, es gibt einige Top-Programmierer, die auch Java verwenden. :-)Obwohl viele dieser Top-Programmierer C ++ / Java / Pascal als "Muttersprache" haben, sind sie aufgrund ihrer Sprache nicht gut , sodass Sie darüber nicht verzweifeln müssen. Viele dieser Programmierer haben Wettbewerbe wie den ICFP-Wettbewerb gewonnen, obwohl sie absichtlich verrückte Sprachen wie Shell-Skripte, m4 (in Autoconf verwendet) und Assembly (das Team mit dem Namen "Ohne ASM kann man nicht buchstabieren") verwenden.
quelle
Ich mochte Jerry Coffins Idee, Teilnehmer des Google AI-Wettbewerbs zu zeichnen, also nahm ich alle Ergebnisse und zeichnete sie (berechneter Mittelwert, Standardabweichung und grafische Darstellung der Normalverteilungskurven in Excel).
Mit Lua und JS bekam das:
Ohne (es gab nur wenige Teilnehmer, daher sind die Ergebnisse möglicherweise verzerrt):
Es sieht so aus, als ob Java-Teilnehmer deutlich schlechter abschnitten als die anderen, während Go, Common Lisp und C am besseren Ende sind.
quelle
Warum sprechen wir alle Englisch und nicht Esperanto ? Nun, es ist einfach so passiert. Obwohl Englisch inkonsistent und aufgebläht ist und Esperanto absichtlich als "besseres Werkzeug" konzipiert wurde.
Ein Grund ist also eine Tradition. In den meisten Schulen wird Programmieren immer noch in C / C ++, Java, Pascal oder sogar Basic unterrichtet. Und nehmen Sie an diesen Wettbewerben teil, hauptsächlich Studenten, die eine Sprache wählen, die sie besser kennen.
Sie können auch feststellen, dass die meisten algorithmischen Bücher Psedudocode im Stil von Pascal oder Ada enthalten und sehr, sehr selten - Lisp. Ich weiß nicht warum, vielleicht auch eine Tradition. Oder vielleicht ist es einfach nicht so gut für die Algorithmen.
Ein weiterer Grund wäre die Geschwindigkeit. Obwohl es für Google Code Jam kein Problem ist, ist in fast allen Wettbewerben eine doppelte Geschwindigkeitslücke ein Unterschied zwischen den Urteilen "Akzeptiert" und "Zeitlimit".
Mit anderen Worten, wenn der optimale Algorithmus in C ++ zehnmal schneller als in Ruby ausgeführt wird, kann dies bedeuten, dass der suboptimale Algorithmus in C ++ immer noch schneller ist als ein guter in Ruby. Und Wettbewerbsautoren möchten normalerweise keine O (n ^ 2) -Einreichungen zulassen, wenn O (n * logn) erreicht werden kann.
quelle
Zunächst würde ich Ihre Prämisse in Frage stellen [Bearbeiten: oder was ich als Prämisse betrachte - dass Kandidaten, die C ++ und Java verwenden, ungefähr gleich gut abschneiden]. Im Folgenden finden Sie beispielsweise die Sprachen, die für die Einträge verwendet wurden, die an den ersten 100 Stellen und an den letzten 100 Stellen des letzten KI-Wettbewerbs von Google eingegangen sind:
Teilnehmer, die C ++ und Java verwendeten, schienen bei diesem Wettbewerb nicht annähernd gleich erfolgreich zu sein. Kandidaten, die Python verwendeten, schienen ebenfalls nicht besonders gut abzuschneiden, obwohl es erheblich weniger von ihnen gab, was jede Schlussfolgerung in dieser Hinsicht schwächte.
Zweitens ist ein großer Teil der Erklärung (wie andere betont haben) zweifellos nur die Anzahl der Personen, die mit jeder Sprache vertraut sind. Es gibt wahrscheinlich mehr Leute, die gerade einen Kurs in Java belegen, als die Gesamtzahl der Leute, die jemals Lisp, Scheme oder Prolog geschrieben haben.
Edit: Ich denke, eine dritte Möglichkeit ist einfach Vielseitigkeit. Um ein extremes Beispiel zu nennen: Prolog ist für einige Probleme sehr gut geeignet, für viele andere jedoch ebenso schlecht . Nur wenige Menschen können (oder zumindest) mehr als eine oder zwei Sprachen gut genug lernen, um sie in einem Wettbewerb zu verwenden. Daher wählen die meisten Menschen, die sich für solche Dinge interessieren, wahrscheinlich Sprachen, die für fast alles einigermaßen gut funktionieren, anstatt Versuch, für jedes Problem, das ausgewählt werden könnte, eine spezielle Sprache zu lernen.
quelle
In fast allen Google Code Jam-Runden codieren mehr der leistungsstärkeren Teilnehmer in C ++.
Unten finden Sie die Sprachstatistiken aus Google Code Jam 2012, Runde 1A, 1B und 1C (von oben nach unten aufgeführt). Die Anzahl der Teilnehmer in jeder Runde beträgt 3.686, 3.281 bzw. 3.189.
quelle
lustige Frage, sollte wahrscheinlich Community-Wiki sein.
Sehen Sie sich die Anzahl der Finalisten nach Ländern an: http://www.go-hero.net/jam/10/regions . Beachten Sie die Anzahl der Menschen aus Osteuropa und Russland. Diese Orte haben aus mehreren Gründen sehr starke C ++ - Communities sowie Java.
Schauen Sie sich die Zahlensprachen in den Qualifikationsspielen an: http://www.go-hero.net/jam/10/languages/0 und das Finale: http://www.go-hero.net/jam/10/languages/6 . C ++ startet weniger als die Hälfte und hat 75 Prozent im Finale. Entweder bevorzugen gute Programmierer C ++ oder C ++ macht die Programmierer. Wahrscheinlich werden andere Dinge trivial, wenn Sie C ++ beherrschen.
Es steht Ihnen jedoch frei, Ihre eigenen Schlussfolgerungen zu ziehen.
quelle
Zunächst einmal, wie Sie gezeigt haben
C++
undJava
Mainstream-Sprachen sind. Dies bedeutet automatisch, dass Leute, die mit Programmierwettbewerben beginnen, zuerst mit ihnen bekannt gemacht werden - übrigens, werLisp
als Muttersprache lernt :) Ich nehme auch regelmäßig an solchen Wettbewerben teil - ich nehmeC++
an Wettkämpfen teil, obwohl meine Lieblingssprache istJava
. Ich möchte nur eine andere Sprache üben alsJava
- auchC++
ist etwas weniger ausführlich und läuft schneller, was für Programmierwettbewerbe wichtig ist. Nun zu meinem Punkt - Menschen werden zuerst Experten für Mainstream-Sprachen. Um an Programmierwettbewerben teilnehmen zu können, müssen Sie die von Ihnen verwendete Sprache gut verstehen. Sie haben keine Zeit, im Internet nach dummen Dingen zu suchen - wie ein Konstrukt vergessen zu haben. Es ist nur so, dass Geschwindigkeit dort ein wichtiger Faktor ist. BenutzenLisp
In einem Wettbewerb müssen Sie es mögen. Ich glaube nicht, dass es so viele Leute gibt. Korrigieren Sie mich, wenn ich falsch liege. Und ehrlich gesagt vereinfachen die von Ihnen erwähnten Profis das Backtracking: In welcher Sprache auch immer das Backtracking einfach ist - deklarieren Sie eine Methode und rufen Sie sie für jedes mögliche Ergebnis erneut auf. Einfacher geht es nicht. Ich habe bis jetzt nicht das Gefühl gehabt, dass die Sprache, die ich benutze, versucht, meine Füße für Programmierwettbewerbe zu stolpern.quelle
OMG ... Die Leute gehen alle die Statistiken und Zahlen durch !!
Vergessen wir nicht die Grundlagen. Dies sind die einzigen zwei Sprachen (meistens), die Menschen in Colleges / Schulen beigebracht werden ...!
Das könnte den schweren Ansturm beantworten!
quelle
Ein wichtiger Grund könnte sein, dass nicht alle Wettbewerbe Sprachen wie Python oder Prolog unterstützen. Insbesondere ACM ICPC World Finals unterstützen C / C ++ und Java . Und TopCoder unterstützt auch nur C ++, Java, C #, VB und jetzt Python . Für die Teilnehmer ist es selbstverständlich, dass sie eine Sprache auswählen, die in jedem Wettbewerb verfügbar ist. Ein weiterer Grund könnte die Ausführungsgeschwindigkeit sein. Und ja, ein weiterer Grund ist, dass dies die Sprachen sind, die die meisten Menschen zuerst lernen.
quelle
Große Bibliotheken waren ein Verkaufsargument für Java in ACM ICPC. Es ist praktisch zu erkennen, dass Sie eine zufällige Datenstruktur oder einen zufälligen Algorithmus wünschen, und diese einfach aus den Standardbibliotheken zu ziehen.
quelle
Denken Sie daran, dass C ++ nicht nur die Mehrheit unter allen Teilnehmern ist, sondern dass sich der Prozentsatz im Verlauf der Runden immer weiter verbessert.
Ich würde sagen, es ist wahr, dass die meisten Teilnehmer Studenten sind (da es sich jedoch um ein offenes Turnier mit Chancen auf ein Vorstellungsgespräch bei Google handelt, müssen Sie berücksichtigen, dass viele Teilnehmer einen Abschluss haben). Aber die letzten Runden sind nur für Leute mit viel Erfahrung. Sie sind nicht nur Studenten, die gerade gelernt haben, in C ++ / Java zu programmieren.
Natürlich funktioniert das Studentenargument auch gegen Sprachen wie LISP und OcaML oder ProLog. Das sind Sprachen, die in KI-Bereichen häufig verwendet werden, aber in der Mainstream-Welt lernen und verwenden Studenten sie am wahrscheinlichsten.
Andere große Wettbewerbe als Google unterstützen nur wenige Sprachen, aber das würde immer noch nicht erklären, warum Pascal oder .net nicht in der Nähe des Java-Niveaus sind (da sie bei den großen Wettbewerbsereignissen tendenziell gleichermaßen unterstützt werden).
Viele der besten Programmierer dieser Wettbewerbe sprechen viele Sprachen. Aber sie bevorzugen es immer noch, C ++ während der Runden zu verwenden, es muss aus einem größeren Grund sein als "gelerntes C ++" zuerst.
Ich würde gegen die Behauptung argumentieren, dass andere Sprachen als C ++ oder Java bessere Werkzeuge für den Job sind. Wenn direkte Daten besagen, dass die Finalisten eher C ++ und Java verwenden, ist dies ein direkter Widerspruch zu dieser Behauptung.
Die Wettbewerbsdaten von Google AI widersprechen eigentlich keiner Prämisse bezüglich des Code-Staus. Es zeigt tatsächlich, dass Top-Programmierer Sprachen wie Common Lisp verwenden können, wenn es wirklich das bessere Werkzeug für den Job ist. Wenn wir diese Daten verwenden möchten, um anzunehmen, dass CLISP ein großartiges Werkzeug für KI-Wettbewerbe ist, sollten wir auch annehmen, dass C ++ ein großartiges Werkzeug für Algorithmus-Wettbewerbe wie GCJ ist.
quelle