language agnostic - ¿Por qué los concursantes de competencia de programación usan C++ y Java?
language-agnostic (11)
¿Por qué todos hablamos inglés y no Esperanto ? Bueno, simplemente sucedió así. Aunque el inglés es inconsistente e hinchado y el esperanto está intencionalmente diseñado como "mejor herramienta".
Por lo tanto, una razón es una tradición. En la mayoría de las escuelas, la programación todavía se enseña en C / C ++, Java, Pascal o incluso Básico. Y participa en esos concursos principalmente estudiantes, que eligen el idioma que conocen mejor.
Además, puede observar que la mayoría de los libros algorítmicos tienen pseudocódigo en el estilo de Pascal o Ada, y muy raramente, Lisp. No sé por qué, tal vez también una tradición. O quizás no sea tan bueno para los algoritmos.
Otra razón sería la velocidad. Aunque no es un problema para Google Code Jam, en casi todos los concursos, la brecha de velocidad de 2x es una diferencia entre los veredictos de ''Aceptado'' y ''Límite de tiempo''.
En otras palabras, si el algoritmo óptimo en C ++ se ejecuta 10 veces más rápido que en Ruby, puede significar que el algoritmo subóptimo en C ++ seguirá siendo más rápido que uno bueno en Ruby. Y los autores del concurso generalmente no quieren permitir O (n ^ 2) presentaciones, si O (n * logn) se puede lograr.
Después de competir y seguir la competencia Google Code Jam de este año, no pude dejar de notar el increíble número de concursantes [exitosos] que usaron C / C ++ y Java. La distribución de los idiomas utilizados a lo largo de la competencia se puede ver here .
Después de programar en C / C ++ durante varios años, recientemente me enamoré de Python por su naturaleza legible / directa. Más recientemente, aprendí idiomas funcionales como OCaml, Scheme e incluso lenguajes lógicos como Prolog. Estos lenguajes ciertamente tienen sus méritos y, en mi opinión, se pueden aplicar más fácilmente que C ++ y Java para ciertas situaciones. Por ejemplo, el uso de Scheme de call / cc simplifica el backtracking (una herramienta necesaria para responder varios problemas) y la especificación lógica de Prolog, aunque ineficiente debido a su naturaleza de fuerza bruta, puede simplificar drásticamente (e incluso resolver automáticamente) ciertos problemas que son difíciles de envuelve el cerebro.
Está claro que un concursante de la competencia debe usar las herramientas más adecuadas para el desafío. Incluso el ensamblaje x86 está completo, eso no justifica resolver problemas con él. En este caso, ¿por qué los concursantes que utilizan lenguajes menos comunes como Scheme / Lisp, Prolog e incluso Python tienen menos éxito que los concursantes que usan C / C ++ y Java? En términos diferentes, ¿por qué los concursantes exitosos no usan lenguajes que, aunque pueden ser menos convencionales, son posiblemente mejores herramientas para el trabajo?
Hay varias motivaciones para mi pregunta. Lo que es más importante, me gustaría convertirme en un mejor programador, tanto en el aspecto práctico como en el aspecto de la competencia. Después de haber sido introducido a paradigmas tan bellos como la programación funcional y lógica, es desalentador ver a tanta gente descartarlos a favor de C / C ++ y Java. Incluso me hace cuestionar mi admiración por dichos paradigmas, preocupándome por no poder tener éxito como programador de Lisp / Scheme / Prolog en una competencia de programación.
En casi todas las rondas de Google Code Jam, más de los concursantes de mayor rendimiento codifican en C ++.
A continuación se muestran las estadísticas del idioma de Google Code Jam 2012 Ronda 1A, 1B y 1C (enumeradas de arriba a abajo). El número de concursantes en cada ronda es de 3,686, 3,281 y 3,189 respectivamente.
En primer lugar, como has señalado, C++
y Java
son lenguajes principales. Esto significa automáticamente que primero se les presentará a las personas que comienzan a hacer competiciones de programación, por cierto, que aprenden Lisp
como lengua materna :) También participo regularmente en tales competiciones. Utilizo C++
para competir, aunque mi idioma favorito es Java
. Es solo que quiero practicar otro idioma aparte de Java
, también C++
es un poco menos detallado y funciona más rápido, lo cual es importante para la programación de competiciones. Ahora, en mi opinión, las personas se convierten primero en expertos en los principales idiomas. Para participar en competiciones de programación debes tener una buena comprensión del idioma que estás utilizando. No tienes tiempo para buscar cosas estúpidas en Internet, como haber olvidado una construcción. Es solo que la velocidad es un factor importante allí. Para usar Lisp
en una competencia, debes ser aficionado. No creo que haya tanta gente por ahí. Corrígeme si estoy equivocado. Y, sinceramente, los pros que mencionaste simplifican el retroceso: en cualquier idioma que retroceda es fácil: declara un método y llámalo nuevamente para cada posible resultado. No podría ser más simple. Hasta ahora no había sentido que el lenguaje que estoy usando esté tratando de hacerme perder el control de los concursos de programación.
En primer lugar, cuestionaría tu premisa [edit: o lo que considero una premisa: que a los concursantes que usan C ++ y Java les va igual de bien]. Por ejemplo, estos son los idiomas que se usaron para las entradas que llegaron en los primeros 100 lugares y los last 100 lugares en el reciente concurso de IA de Google:
Los concursantes que usaban C ++ y Java no parecían tener el mismo éxito en ese concurso. Los concursantes que usaban Python tampoco parecían tener un buen desempeño, aunque hubo muchos menos, debilitando cualquier conclusión al respecto.
En segundo lugar, por supuesto, una gran parte de la explicación (como han señalado otros) es, sin duda, solo el número de personas que están familiarizadas con cada idioma. Probablemente haya más personas tomando un curso en Java ahora que la cantidad total de personas que alguna vez han escrito Lisp, Scheme o Prolog.
Edición: creo que una tercera posibilidad es simplemente versatilidad. Para tomar un ejemplo extremo, Prolog es muy adecuado para algunos problemas, pero igualmente inadecuado para muchos otros. Pocas personas pueden (o al menos lo hacen) aprender más de uno o dos idiomas lo suficientemente bien como para usarlos en un concurso, por lo que la mayoría de las personas que están interesadas en tales cosas probablemente elijan idiomas que pueden funcionar razonablemente bien para casi cualquier cosa, en lugar de intentando aprender un idioma especializado para cada problema que pueda ser elegido.
Gran pregunta! Como alguien que ha incursionado un poco en los concursos de programación, quizás tenga algo que decir.
[Eliminemos el descargo de responsabilidad estándar: la programación de los concursos está vagamente relacionada con la "programación en el mundo real", y al mismo tiempo prueba las habilidades algorítmicas y de resolución de problemas y la capacidad de generar códigos de trabajo rápidos y libres de errores la presión del tiempo, no se correlaciona necesariamente con la capacidad de crear grandes proyectos de software, escribir código que se pueda mantener, etc. (más allá del hecho de que los programas bien estructurados son más fáciles de depurar).]
Ahora para algunas respuestas:
C ++ / Java también son más comunes que otros lenguajes en el mundo real, por lo que esperaría ver una mayor proporción en cualquier lugar. (Pero es aún mayor en la población del concurso).
Muchos de estos participantes son estudiantes o participan en concursos como estudiantes, y C ++ / Java son los "primeros idiomas" más comunes que los estudiantes aprenden. (Los estudiantes de pregrado en estos días pueden comenzar con Scheme, Haskell, Python, etc., pero los de secundaria (a menudo de forma autodidacta) con menor frecuencia). De hecho, muchos de los participantes de Europa del Este todavía usan Pascal, y son más increíbles con él que el resto de nosotros alguna vez estará con cualquier idioma.
Los concursos de nivel escolar y universitario generalmente usan estos idiomas. La Olimpiada Internacional en Informática (IOI) solo permite C, C ++ y Pascal (o tal vez ahora permite Java, no lo he mantenido), y el Concurso de Programación Intercolegial de ACM (ACM ICPC) solo permite C, C ++ y Java. TopCoder permite C ++, Java, C # y VB (realmente: p); y recientemente, Python. Entonces, podría decirse que el "ecosistema del concurso" tiene más programadores de C ++ / Java. Google Code Jam e IPSC están entre los pocos concursos que permiten código en cualquier idioma, en realidad.
Ahora la pregunta es, en GCJ donde los concursantes son libres de elegir un idioma, ¿por qué no elegirían Python o Scheme? El factor más relevante es que estos lenguajes son lentos . Claro, para la mayoría de la programación del mundo real son bastante rápidos, pero para los lazos estrechos que a menudo están involucrados en hacer que un programa se ejecute bajo el límite de n-segundo para todos los casos de prueba, estos lenguajes no se cortan para ninguno de los problemas algorítmicamente más involucrados. (Un problema diseñado para aceptar soluciones O (n log n) pero no soluciones Θ (n 2 ) para C / C ++ descarta con frecuencia incluso soluciones O (n log n) óptimas en lenguajes lentos. Incluso a Java se le daba una discapacidad en USACO; no estoy seguro de que este sea todavía el caso).
Otro factor son las bibliotecas: C ++ y Java tienen mejores bibliotecas para algoritmos y estructuras de datos frecuentemente útiles (por ejemplo, árboles rojo-negro, próxima_permutación de C ++), mientras que las bibliotecas de Python (lo suficientemente buenas para el mundo real) son menos útiles aquí, y Prolog and Scheme ... No sé sobre sus bibliotecas. Este es un factor relativamente menor, ya que estos programadores pueden escribir su propio código cuando sea necesario. :-)
Los lenguajes multi-paradigma de propósito general son más útiles para simplemente hacer las cosas dentro de las limitaciones de tiempo del concurso, que los lenguajes que fuerzan una filosofía o una forma de hacer las cosas contigo. Es por eso que Prolog siempre será impopular, por ejemplo. (Filosofía general: algunos idiomas son lenguajes "habilitantes" que te permiten hacer cualquier cosa, incluso dispararte en el pie, algunos están "dirigiendo" que te obligan a hacer las cosas de la manera correcta). Esta es también la razón por la cual C ++ es tres veces más popular que Java en los participantes del concurso general, y mucho más popular entre los principales concursantes. Como el código no tiene que ser leído por nadie más, está bien e incluso es útil tener macros de bucle como
FOR(i,n)
(menos código para escribir y, lo que es más importante, menos posibilidades de cometer un error cuando tiene prisa). Nada en contra de Java, hay algunos mejores programadores que también usan Java. :-)Finalmente, aunque muchos de estos programadores principales pueden tener C ++ / Java / Pascal como su "primer idioma", no son buenos debido a su idioma, por lo que no tiene que desesperarse por eso. Muchos de estos mismos programadores han ganado concursos como el concurso de ICFP incluso con el uso intencional de lenguajes locos como scripts de shell, m4 (usado en autoconf) y ensamblaje (el equipo llamado "No se puede escribir impresionante sin ASM").
Las grandes bibliotecas fueron un punto de venta para Java en ACM ICPC. Es útil poder darse cuenta de que quiere alguna estructura de datos aleatoria o algoritmo y simplemente sacarlo de las bibliotecas estándar.
Me gustó la idea de Jerry Coffin de trazar concursantes del concurso de Google AI, así que tomé todos los resultados y los tracé (media calculada, desviación estándar, y luego gráficas las curvas de distribución normales en Excel).
Con Lua y JS, obtuve esto:
Sin (hubo pocos concursantes, por lo que tal vez los resultados estén sesgados):
Parece que los participantes de Java hicieron notablemente peor que el resto, mientras que Go, Common Lisp y C están en el mejor de los casos.
OMG ... ¡¡La gente está pasando por las estadísticas y las estadísticas !!
No olvidemos los conceptos básicos. ¡Estos son los dos únicos idiomas (en su mayoría) que se enseñan a las personas en la universidad / escuelas ...!
¡Eso podría responder a las fuertes prisas!
Tenga en cuenta que C ++ no solo es la mayoría de todos los concursantes, sino que a medida que avanzan las rondas, su porcentaje simplemente se mantiene y sigue mejorando.
Diría que es cierto que la mayoría de los participantes son estudiantes (sin embargo, dado que es un torneo abierto con posibilidades de una entrevista de trabajo con Google, debes tener en cuenta que muchos de los que participan están graduados). Pero las últimas rondas son solo para personas con mucha experiencia. No son solo estudiantes que aprendieron a codificar en C ++ / Java.
Por supuesto, el argumento del alumno también funciona contra idiomas como LISP y OcaML o ProLog. Eso es idiomas, que se usan mucho en áreas de IA, pero en el mundo general, los estudiantes son los más propensos a aprender y usarlos.
Grandes concursos distintos de google admiten pocos idiomas, pero eso aún no explicaría por qué Pascal o .net no están cerca del nivel de Java (ya que tienden a ser igualmente compatibles en los principales eventos del concurso).
Muchos de los mejores codificadores en estos concursos conocen muchos idiomas. Pero aún prefieren usar C ++ durante las rondas, debe ser por una razón mayor que "C ++ aprendido" primero.
Yo argumentaría en contra de la afirmación de que los lenguajes que no sean C ++ o Java son mejores herramientas para el trabajo. Si los datos directos dicen que los finalistas son más propensos a usar C ++ y Java, es una contradicción directa con esa afirmación.
Los datos de competencia de Google AI en realidad no contradicen ninguna premisa con respecto al atasco de código. De hecho, muestra que los codificadores superiores pueden usar lenguajes como Common Lisp cuando realmente es la mejor herramienta para el trabajo. Si queremos utilizar esta información para suponer que CLISP es una gran herramienta para competiciones de IA, entonces también deberíamos suponer que C ++ es una gran herramienta para competiciones de algoritmos como GCJ.
Una razón vital podría ser que cada concurso no admite idiomas como Python o Prolog. Especialmente ACM ICPC World Finals es compatible con C / C ++ y Java . Y TopCoder también solo es compatible con C ++, Java, C #, VB y ahora Python . Es natural que los concursantes elijan un idioma que esté disponible en cada concurso. Otra razón podría ser la velocidad de ejecución. Y sí, otra razón es que estos son los idiomas que la mayoría de la gente aprende primero.
pregunta divertida, probablemente debería ser wiki de la comunidad.
Mire el número de finalistas por países: http://www.go-hero.net/jam/10/regions . aviso número de personas de Europa del Este y Rusia. esos lugares tienen comunidades de C ++ muy fuertes, así como Java, por varias razones.
mira los idiomas numéricos en los calificadores: http://www.go-hero.net/jam/10/languages/0 y finales: here . C ++ comienza con menos de la mitad y tiene un 75 por ciento en finales. cualquiera de los buenos programadores prefieren C ++ o C ++ hace que los programadores. Probablemente, para cuando domine C ++, otras cosas se vuelven triviales.
Sin embargo, eres libre de sacar tus propias conclusiones.