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.
fuente
Respuestas:
¡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 como
FOR(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").
fuente
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.
fuente
¿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).
fuente
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:
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.
fuente
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.
fuente
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.
fuente
En primer lugar, como ha señalado
C++
yaJava
son 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 aprendeLisp
como primer idioma :) También participo regularmente en dichos concursos, que sueloC++
competir, aunque mi idioma favorito esJava
. Es solo que quiero practicar otro idioma además deJava
- 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í. UsarLisp
en 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.fuente
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!
fuente
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.
fuente
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.
fuente
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.
fuente