¿Por qué los concursantes de la competencia de programación usan C ++ y Java? [cerrado]

93

Después de competir y seguir la competencia Google Code Jam de este año , no pude evitar notar la increíble cantidad de concursantes [exitosos] que usaron C / C ++ y Java. La distribución de idiomas utilizados a lo largo del concurso se puede ver aquí .

Después de programar en C / C ++ durante varios años, recientemente me enamoré de Python por su naturaleza legible / sencilla. Más recientemente, aprendí lenguajes 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 determinadas situaciones. Por ejemplo, el uso de Scheme de call / cc simplifica el retroceso (una herramienta necesaria para responder a varios problemas) y la especificación lógica de Prolog, aunque ineficaz debido a su naturaleza de fuerza bruta, puede simplificar drásticamente (e incluso resolver automáticamente) ciertos problemas que son difíciles de resolver. envolver el cerebro de uno.

Está claro que un concursante de la competencia debe utilizar las herramientas que mejor se adapten al desafío. Incluso el ensamblaje x86 es Turing completo, eso no justifica resolver problemas con él. En este caso, ¿por qué los concursantes que usan lenguajes menos comunes como Scheme / Lisp, Prolog e incluso Python son significativamente menos exitosos que los concursantes que usan C / C ++ y Java? Dicho de otra manera, ¿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 más importante es que me gustaría convertirme en un mejor programador, tanto en el aspecto práctico como en el competitivo. Después de haber sido introducido a paradigmas tan hermosos 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 de no poder tener éxito como programador Lisp / Scheme / Prolog en una competencia de programación.

advait
fuente
11
Supongo que la velocidad de ejecución podría ser un factor.
Zaki
Interesante pregunta; Sería bueno obtener algunas respuestas de los participantes, en Code Jam u otras competencias (ACM, etc.). Los límites de tiempo de ejecución pueden sesgar en contra de los idiomas interpretados, aunque ...
tzaman
11
Los lenguajes dinámicos tienen un gran problema de rendimiento: consulte el punto de referencia
NullUserException
Para Topcoder, es simplemente porque tienen una regla que prohíbe el uso de cualquier cosa que no sean las bibliotecas estándar de Python, lo que hace imposible cualquier otra cosa que no sean tareas triviales. ¿Buscando asteroides en imágenes espaciales? Lástima, ni siquiera puedes usar NumPy.
endolito

Respuestas:

68

¡Gran pregunta! Como alguien que ha incursionado un poco en los concursos de programación, puede que tenga algo que decir.

[Dejemos de lado el descargo de responsabilidad estándar: la programación de concursos solo está vagamente relacionada con la "programación en el mundo real", y si bien prueba las habilidades algorítmicas y de resolución de problemas y la capacidad de crear un código de trabajo rápido y sin errores en presión de tiempo, no necesariamente se correlaciona con la capacidad de construir grandes proyectos de software, escribir código mantenible, 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 proporción mayor en cualquier lugar. (Pero es aún más alto en la población del concurso).

  • Muchos de estos participantes son estudiantes, o participaron 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 estudiantes de secundaria (a menudo autodidactas) con menos frecuencia). De hecho, muchos de los participantes de Europa del Este todavía usan Pascal, y son más sorprendentes con él. de lo que el resto de nosotros jamás será con cualquier idioma.

  • Los concursos de nivel escolar y universitario suelen utilizar estos idiomas. La Olimpiada Internacional de Informática (IOI) solo permite C, C ++ y Pascal (o tal vez ahora permita Java; no he seguido el ritmo), y el Concurso de Programación Intercolegial ACM (ACM ICPC) solo permite C, C ++ y Java. TopCoder permite C ++, Java, C # y VB (en realidad: p); y recientemente, Python. Así que podría decirse que el "ecosistema de concursos" tiene más programadores en C ++ / Java. Google Code Jam e IPSC se encuentran 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 lo suficientemente rápidos, pero para los bucles estrechos que a menudo están involucrados en lograr que un programa se ejecute por debajo del límite de n segundos para todos los casos de prueba, estos lenguajes no son suficientes para ninguno de los problemas algorítmicamente más complicados. (Un problema diseñado para aceptar soluciones O (n log n) pero no soluciones Θ (n 2 ) para C / C ++ con frecuencia descarta incluso las soluciones óptimas O (n log n) en lenguajes más lentos. Incluso Java solía tener una desventaja en USACO; no estoy seguro de que este siga siendo 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, next_permutation de C ++), mientras que las bibliotecas de Python (lo suficientemente buenas para el mundo real) son menos útiles aquí, y Prolog y Scheme ... No sé de sus bibliotecas. Este es un factor relativamente menor, porque estos programadores pueden escribir su propio código cuando sea necesario. :-)

  • Los lenguajes multi-paradigma de propósito general son más útiles para hacer las cosas dentro de las limitaciones de tiempo del concurso, que los lenguajes que imponen una filosofía o una forma de hacer las cosas. Por eso, Prolog siempre seguirá siendo impopular, por ejemplo. (Filosofía general: algunos lenguajes son lenguajes "habilitadores" que te permiten hacer cualquier cosa, incluso dispararte a ti mismo en el pie, otros son "direccionales" que te obligan a hacer las cosas de la manera correcta). Esta es también la razón por la que C ++ es tres veces más popular que Java en los participantes del concurso general, y mucho más popular entre los mejores concursantes. Dado que el código no tiene que ser leído por nadie más, está bien e incluso es útil tener macros de bucle comoFOR(i,n)(menos código para escribir y, lo que es más importante, menos posibilidades de cometer un error cuando se tiene prisa). Nada en contra de Java, hay algunos programadores importantes que también usan Java. :-)

  • Finalmente, aunque muchos de estos importantes programadores pueden tener C ++ / Java / Pascal como su "primer idioma", no son buenos debido a su lenguaje, por lo que no debe desesperarse por eso. Muchos de estos mismos programadores han ganado concursos como el concurso 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 deletrear genial sin ASM").

ShreevatsaR
fuente
2
Estoy de acuerdo; como dije, la existencia de bibliotecas es un problema relativamente menor. Puedo eliminarlo si cree que lo exagero.
ShreevatsaR
2
Esa parte sobre Java en la penúltima viñeta no es del todo cierto. Muchos de los mejores concursantes de GCJ usan Java.
NullUserException
1
[El otro participante en la final ("linguo") usó Python, y durante el concurso ha usado lenguajes que incluyen LOLCODE, Piet, FALSE, Whitespace y FRACTRAN!]
ShreevatsaR
4
Solo me gustaría agregar un poco a la parte sobre la velocidad. La "velocidad" en concursos como el GCJ es la complejidad en tiempo de ejecución del código (es decir, big-O). En el GCJ generalmente se acepta el algoritmo correcto incluso en un lenguaje lento (por lo tanto, hay muchas presentaciones de Python aceptadas) mientras que un algoritmo lento tomará una eternidad incluso en asm. Hay excepciones, pero en general, si usa el algoritmo / técnica correcta, está seguro incluso con un lenguaje más lento.
MAK
1
@EvgeniSergeev Lo que dice es cierto para la mayoría de los concursos de programación, como IOI / TopCoder, pero en GCJ específicamente, los límites de tiempo suelen ser de 8 minutos para la entrada grande, y los problemas generalmente están diseñados para que las soluciones de Python también puedan pasar. Incluso hace 10 años, la regla era ~ 10 ^ 9 operaciones "simples" por segundo, por lo que, por ejemplo, para distinguir O (n ^ 2) de Ω (n ^ 3), solo necesitamos n ^ 2 <10 ^ 9 * 60 * 8 <n ^ 3, o aproximadamente 8000 <n <692000. Puede tomar n = 20000 y n ^ 2 algo incluso en un lenguaje 400 veces más lento (10 ^ 9/400 por s) tomará solo 160 segundos, mientras que incluso fast n ^ 3 tardará 8000 segundos.
ShreevatsaR
14

Me gustó la idea de Jerry Coffin de trazar a los concursantes del concurso de IA de Google, así que tomé todos los resultados y los tracé (media calculada, desviación estándar y luego tracé las curvas de distribución normal en Excel).

Con Lua y JS, obtuve esto:

Sin (hubo pocos concursantes, por lo que tal vez los resultados estén sesgados):

Parece que a los participantes de Java les fue notablemente peor que al resto, mientras que Go, Common Lisp y C están en el mejor extremo.

Tatiana Racheva
fuente
Sin embargo, la pregunta se hizo sobre Google Code Jam y no sobre el concurso de Google AI (su respuesta es el primer lugar que escucho de ella), por lo que podría ser más relevante dibujar estos gráficos para Google Code Jam. En realidad, la pregunta ya menciona tales estadísticas (2010) ; ver también 2011 , 2012 , 2013 y 2014 (en proceso en este momento) .
ShreevatsaR
12

¿Por qué todos hablamos inglés y no esperanto ? Bueno, simplemente sucedió así. Aunque el inglés es inconsistente e inflado y el esperanto está diseñado intencionalmente como una "mejor herramienta".

Por 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 Basic. Y participar en esos concursos en su mayoría estudiantes, que eligen el idioma que conocen mejor.
Además, puede notar que la mayoría de los libros algorítmicos presentan psedudocódigo al estilo de Pascal o Ada, y muy, muy raramente, Lisp. No sé por qué, quizás también sea una tradición. O tal vez simplemente 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 diferencia de velocidad 2x es una diferencia entre los veredictos 'Aceptados' 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 se puede lograr O (n * logn).

Nikita Rybak
fuente
7
Solo un comentario sobre su analogía: el esperanto fracasa miserablemente en sus objetivos. Sus sonidos son casi exactamente los del dialecto polaco de Zamenhof, y su gramática es poco natural y complicada. De ninguna manera es un buen lenguaje universal; El klingon, en muchos sentidos, hace un mejor trabajo al parecer un lenguaje humano natural. Supongo que se podría argumentar que hay similitudes en esto con C ++ y Java, pero eso sería injusto :) (Ver también xibalba.demon.co.uk/jbr/ranto .)
Antal Spector-Zabusky
1
@Antal Bueno, la analogía puede ser defectuosa, pero entiendes mi punto. Entre tú y yo, tampoco hablo esperanto :)
Nikita Rybak
El lenguaje (natural) es una insignia de pertenencia tribal , y los lenguajes de programación están influenciados por muchas de las mismas presiones
trapezoide
12

Primero, cuestionaría su premisa [editar: o lo que yo 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 últimos 100 lugares en el reciente concurso de IA de Google:

texto alternativo

Los concursantes utilizando C ++ y Java no parecían estar en cualquier lugar cerca de el mismo éxito en ese concurso. Los concursantes que usaban Python tampoco parecían tener un desempeño particularmente bueno, aunque hubo muchos menos, lo que debilitó 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 hay más personas tomando un curso en Java en este momento que el número total de personas que alguna vez han escrito Lisp, Scheme o Prolog.

Editar: Creo que una tercera posibilidad es simplemente versatilidad. Para elegir un ejemplo extremo, Prolog se adapta muy bien a algunos problemas, pero no se adapta muy bien a 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 es probable que la mayoría de las personas interesadas en tales cosas elijan idiomas que puedan funcionar razonablemente bien para casi cualquier cosa, en lugar de intentando aprender un lenguaje especializado para cada problema que se pueda elegir.

Jerry Coffin
fuente
1
Bueno, parece que la mayoría de los participantes principales usaron C ++ / C # y menos de ellos usaron Python / Haskell / Lisp / Scheme / Ruby / Prolog, lo que refuerza la premisa de la pregunta, ¿no es así? La pregunta no era comparar C ++ y Java entre ellos (aunque esto es interesante, gracias), sino algo como: ”¿Por qué los lenguajes" agradables "son menos exitosos en la parte superior? ¿Por qué los buenos concursantes (que presumiblemente saben muchos idiomas) no eligen uno de estos? " Pero estoy de acuerdo en que la familiaridad es una de las principales razones.
ShreevatsaR
Mi impresión (quizás equivocada) fue que la pregunta asumía que los concursantes que usaban C ++ y Java tenían casi el mismo éxito. Eso puede ser cierto en algunos concursos, pero ciertamente no pareció serlo en este. Aunque es cierto que había menos de ellos, los concursantes que usaban Go, Haskell, Lua y CL parecían tener más éxito que los que usaban Java (aunque, es cierto, en términos de tasa de éxito, C ++ ciertamente parecía dominar, al menos en este caso particular).
Jerry Coffin
5
Disculpe mi quisquilloso, pero esto realmente debería ser un gráfico de barras en lugar de un gráfico de líneas ...
tzaman
Oh mi. He estado luchando para hacer un gráfico que tenga sentido durante una hora y no estoy progresando. Excel y las hojas de cálculo de Google me hacen sentir estúpido.
Tatiana Racheva
Sin embargo, ¿no se puede usar Lisp técnicamente como un preprocesador de macros C / C ++ ...? Podrías hacer que parezca que enviaste un programa C ++, ¡pero de hecho codificaste en Lisp!
aoeu256
12

En casi todas las rondas de Google Code Jam, la mayoría de los concursantes de mayor rendimiento codifican en C ++.

A continuación, se muestran las estadísticas de idiomas de las rondas 1A, 1B y 1C de Google Code Jam 2012 (enumeradas de arriba a abajo). El número de concursantes en cada ronda es 3.686, 3.281 y 3.189 respectivamente.

Estadísticas de idiomas de Google Code Jam 2012 Ronda 1A Estadísticas de idiomas de Google Code Jam 2012 Round 1B Estadísticas de idiomas de Google Code Jam 2012 Round 1C

Rosa Perrone
fuente
8

pregunta divertida, probablemente debería ser la wiki de la comunidad.

Mire el número de finalistas por países: http://www.go-hero.net/jam/10/regions . observe el número de personas de Europa del Este y Rusia. esos lugares tienen comunidades C ++ muy fuertes, así como Java, por varias razones.

mire los idiomas numéricos en los clasificatorios: http://www.go-hero.net/jam/10/languages/0 y finales: http://www.go-hero.net/jam/10/languages/6 . C ++ comienza menos de la mitad y tiene el 75 por ciento en las finales. los buenos programadores prefieren C ++ o C ++ hace a los programadores. Probablemente, para cuando domines C ++, otras cosas se vuelvan triviales.

Sin embargo, eres libre de sacar tus propias conclusiones.

Anycorn
fuente
5

En primer lugar, como ha señalado C++ya Javason lenguajes convencionales. Esto significa automáticamente que las personas que comienzan a participar en concursos de programación los conocerán primero, por cierto, ¿quién aprende Lispcomo primer idioma :) También participo regularmente en dichos concursos, que suelo C++competir, aunque mi idioma favorito es Java. Es solo que quiero practicar otro idioma además de Java- tambiénC++es un poco menos detallado y se ejecuta más rápido, lo cual es importante para los concursos de programación. Ahora, a mi punto, la gente se convierte primero en expertos en los lenguajes convencionales. Para participar en concursos de programación, debe tener un buen conocimiento del lenguaje que está utilizando. No tienes tiempo para buscar en Internet cosas estúpidas, como olvidar una construcción. Es solo que la velocidad es un factor importante allí. UsarLispen una competición, debe gustarle. No creo que haya tanta gente ahí fuera. Corrígeme si estoy equivocado. Y, sinceramente, los pros que mencionaste simplifican el retroceso: en cualquier idioma, el retroceso es fácil: declara un método y vuelve a llamarlo para cada resultado posible. No puede ser más sencillo. No he sentido hasta ahora que el lenguaje que estoy usando está tratando de hacerme tropezar con los concursos de programación.

Petar Minchev
fuente
Puede que el plural de anécdota no sea un dato, pero aprendí Scheme como mi primer idioma y mi curso de introducción a la informática fue en Haskell. Sin embargo, estoy de acuerdo en que esto parece ser inusual: C / C ++ / Java / Python parecen ser los más populares.
Wang
Buen punto; Creo que esto llega al meollo del asunto. Para los programadores con suficiente práctica en hacer las cosas que surgen con frecuencia, realmente no hay grandes beneficios en otros lenguajes. (Y características como, digamos, la capacidad de procesamiento de texto de Perl rara vez son de utilidad en estos concursos).
ShreevatsaR
3

Dios mío ... ¡¡La gente está revisando las estadísticas y cifras !!

No olvidemos lo básico ... ¡Estos son los únicos dos idiomas (en su mayoría) que se enseñan a las personas en la universidad / escuelas ...!

¡Eso podría responder a la gran prisa!

Arpit
fuente
3

Una razón vital podría ser que todos los concursos no admiten lenguajes como Python o Prolog. Especialmente las Finales Mundiales de ACM ICPC son compatibles con C / C ++ y Java . Y TopCoder también admite solo 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.

taskinoor
fuente
2

Las grandes bibliotecas fueron un punto de venta para Java en ACM ICPC. Es útil poder darse cuenta de que desea una estructura o algoritmo de datos aleatorios y simplemente extraerlo de las bibliotecas estándar.

Wang
fuente
2

Tenga en cuenta que C ++ no solo es la mayoría entre todos los concursantes, sino que a medida que avanzan las rondas, su porcentaje se mantiene y sigue mejorando.

Yo 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, entonces hay que considerar que muchos de los que participan son egresados). Pero las últimas rondas son solo para personas con mucha experiencia. No son solo estudiantes que acaban de aprender a codificar en C ++ / Java.

Por supuesto, el argumento del estudiante también funciona contra lenguajes como LISP y OcaML o ProLog. Es decir, los idiomas, que se usan mucho en las áreas de IA, pero en el mundo general, los estudiantes son los más propensos a aprenderlos y usarlos.

Los grandes concursos además del de Google admiten pocos idiomas, pero eso todavía 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 programadores de estos concursos conocen muchos idiomas. Pero todavía prefieren usar C ++ durante las rondas, debe ser por una razón más importante que "aprendió C ++" primero.

Yo argumentaría en contra de la afirmación de que los lenguajes distintos de C ++ o Java son mejores herramientas para el trabajo. Si los datos directos dicen que es más probable que los finalistas usen 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 código de bloqueo. De hecho, muestra que los mejores codificadores pueden usar lenguajes como Common Lisp cuando realmente es la mejor herramienta para el trabajo. Si queremos usar estos datos para asumir que CLISP es una gran herramienta para las competiciones de IA, entonces también deberíamos asumir que C ++ es una gran herramienta para las competiciones de algoritmos como GCJ.

UltraImpresionanteAnónimoEspía
fuente