Por que os participantes da competição de programação usam C ++ e Java? [fechadas]

93

Depois de competir e seguir a competição Google Code Jam deste ano , não pude deixar de notar o incrível número de concorrentes [bem-sucedidos] que usaram C / C ++ e Java. A distribuição das línguas utilizadas ao longo do concurso pode ser consultada aqui .

Depois de programar em C / C ++ por vários anos, recentemente me apaixonei por Python por sua natureza legível / direta. Mais recentemente, aprendi linguagens funcionais como OCaml, Scheme e até linguagens lógicas como Prolog. Essas linguagens certamente têm seus méritos e, na minha opinião, podem ser aplicadas mais facilmente do que C ++ e Java para determinadas situações. Por exemplo, o uso do Scheme de call / cc simplifica o retrocesso (uma ferramenta necessária para responder a vários problemas) e a especificação da lógica do Prolog, embora ineficiente devido à sua natureza de força bruta, pode simplificar drasticamente (e até mesmo resolver automaticamente) certos problemas que são difíceis de envolver o cérebro.

É claro que um competidor deve usar as ferramentas mais adequadas para o desafio. Até mesmo a montagem x86 é Turing completa - isso não justifica a solução de problemas com ela. Nesse caso, por que os concorrentes que usam linguagens menos comuns como Scheme / Lisp, Prolog e até Python são significativamente menos bem-sucedidos do que os concorrentes que usam C / C ++ e Java? Em outras palavras, por que os concorrentes bem-sucedidos não usam linguagens que, embora possam ser menos convencionais, são sem dúvida ferramentas melhores para o trabalho?

Existem várias motivações para a minha pergunta. Mais importante ainda, gostaria de me tornar um programador melhor - tanto no aspecto prático quanto no aspecto competitivo. Depois de conhecer paradigmas tão belos como programação funcional e lógica, é desanimador ver tantas pessoas descartá-los em favor de C / C ++ e Java. Até me faz questionar minha admiração por tais paradigmas, preocupando-me que não possa ter sucesso como programador Lisp / Scheme / Prolog em uma competição de programação.

advait
fonte
11
Acho que a velocidade de execução pode ser um fator.
Zaki
Pergunta interessante; seria bom obter algumas respostas dos participantes, no Code Jam ou em outras competições (ACM, etc). Limites de tempo de execução podem
influenciar
11
Linguagens dinâmicas têm um grande problema de desempenho: consulte o benchmark
NullUserException
Para Topcoder, é puramente porque eles têm uma regra que proíbe o uso de qualquer coisa, exceto as bibliotecas padrão do Python, o que torna impossível qualquer coisa além de tarefas triviais. Procurando por asteróides em imagens espaciais? Que pena, você nem pode usar o NumPy.
endolith

Respostas:

68

Ótima pergunta! Como alguém que já se envolveu um pouco em concursos de programação, posso ter algo a dizer.

[Vamos tirar a isenção de responsabilidade padrão do caminho: a programação do concurso está apenas vagamente relacionada à "programação no mundo real" e, embora teste as habilidades de algoritmos e resolução de problemas e a capacidade de criar um código de trabalho rápido e livre de bugs em pressão de tempo, não necessariamente se correlaciona com a capacidade de construir grandes projetos de software, escrever código sustentável, etc (além do fato de que programas bem estruturados são mais fáceis de depurar).]

Agora, algumas respostas:

  • C ++ / Java também são mais comuns do que outras linguagens do mundo real, então você esperaria ver uma proporção maior em qualquer lugar. (Mas é ainda maior na população do concurso.)

  • Muitos desses participantes são alunos ou participaram de competições como alunos, e C ++ / Java são as "primeiras linguagens" mais comuns que os alunos aprendem. (Os alunos de graduação atualmente podem começar com Scheme, Haskell, Python, etc., mas os do ensino médio (muitas vezes autodidatas) com menos frequência.) Na verdade, muitos dos participantes do Leste Europeu ainda usam Pascal e são mais incríveis com ele do que o resto de nós jamais será com qualquer idioma.

  • As competições de nível escolar e universitário geralmente usam esses idiomas. A Olimpíada Internacional de Informática (IOI) permite apenas C, C ++ e Pascal (ou talvez permita Java agora; não acompanhei), e o Concurso de Programação Intercolegial ACM (ACM ICPC) permite apenas C, C ++ e Java. TopCoder permite C ++, Java, C # e VB (realmente: p); e recentemente, Python. Portanto, você poderia dizer que o "ecossistema de competição" tem mais programadores C ++ / Java. Google Code Jam e IPSC estão entre os poucos concursos que permitem código em qualquer idioma, na verdade.

  • Agora a questão é, no GCJ, onde os competidores são livres para escolher uma linguagem, por que eles não escolheriam Python ou Scheme? O fator mais relevante é que essas linguagens são lentas . Claro, para a maioria da programação do mundo real, eles são facilmente rápidos o suficiente, mas para os loops apertados que muitas vezes estão envolvidos em fazer um programa rodar abaixo do limite de n segundos para todos os casos de teste, essas linguagens não servem para nenhum dos os problemas algoritmicamente mais envolvidos. (Um problema projetado para aceitar soluções O (n log n), mas não soluções Θ (n 2 ) para C / C ++ frequentemente exclui até mesmo soluções O (n log n) ideais em linguagens mais lentas. Mesmo Java costumava ter uma desvantagem em USACO; não tenho certeza de que ainda seja o caso.)

  • Outro fator são as bibliotecas: C ++ e Java têm bibliotecas melhores para algoritmos e estruturas de dados frequentemente úteis (por exemplo, árvores vermelhas e pretas, next_permutation do C ++), enquanto as bibliotecas do Python (boas o suficiente para o mundo real) são menos úteis aqui, e Prolog e Scheme ... Eu não sei sobre suas bibliotecas. Este é um fator relativamente menor, porque esses programadores podem escrever seu próprio código quando necessário. :-)

  • Linguagens multiparadigmáticas de propósito geral são mais úteis apenas para fazer as coisas dentro dos limites de tempo do concurso, do que linguagens que impõem uma filosofia ou maneira de fazer as coisas em você. É por isso que Prolog sempre permanecerá impopular, por exemplo. (Filosofia geral: algumas linguagens são linguagens "habilitadoras" que permitem que você faça qualquer coisa, incluindo dar um tiro no próprio pé, algumas são "direcionadoras" que o forçam a fazer as coisas da maneira certa.) É também por isso que C ++ é três vezes mais popular do que Java nos participantes do concurso geral e muito mais popular entre os principais concorrentes. Uma vez que o código não precisa ser lido por ninguém, é ok e até mesmo útil ter macros de loop comoFOR(i,n)(menos código para digitar e, mais importante, menos chance de fazer um bug quando estiver com pressa). Nada contra o Java, existem alguns programadores de topo que também usam o Java. :-)

  • Finalmente, embora muitos desses principais programadores possam ter C ++ / Java / Pascal como sua "primeira linguagem", eles não são bons por causa de sua linguagem, então você não precisa se desesperar com isso. Muitos desses mesmos programadores ganharam concursos como o concurso ICFP, mesmo usando intencionalmente linguagens malucas como scripts de shell, m4 (usado em autoconf) e assembly (a equipe chamada "Você não consegue soletrar impressionante sem ASM").

ShreevatsaR
fonte
2
Concordo; como eu disse, a existência de bibliotecas é um problema relativamente menor. Posso removê-lo se você achar que exagerei.
ShreevatsaR
2
Aquela parte sobre Java no penúltimo ponto não é bem verdade. Muitos dos principais concorrentes do GCJ usam Java.
NullUserException
1
[O outro participante da final ("linguo") usou Python e, por meio do concurso, usou idiomas incluindo LOLCODE, Piet, FALSE, Whitespace e FRACTRAN!]
ShreevatsaR
4
Eu gostaria apenas de acrescentar um pouco à parte sobre velocidade. A "velocidade" em competições como o GCJ é a complexidade do tempo de execução do código (ou seja, big-O). No GCJ geralmente o algoritmo correto é aceito mesmo em uma linguagem lenta (portanto, há muitos envios Python aceitos), enquanto um algoritmo lento leva uma eternidade, mesmo em conjunto. Existem exceções, mas geralmente se você usar o algoritmo / técnica correta, estará seguro mesmo com uma linguagem mais lenta.
MAK
1
@EvgeniSergeev O que você diz é verdade para a maioria dos concursos de programação, como IOI / TopCoder, mas no GCJ especificamente, os limites de tempo são geralmente de 8 minutos para grandes entradas e os problemas geralmente são projetados para que as soluções Python também passem. Mesmo há 10 anos, a regra era ~ 10 ^ 9 operações "simples" por segundo, então, por exemplo, para distinguir O (n ^ 2) de Ω (n ^ 3), precisamos apenas de n ^ 2 <10 ^ 9 * 60 * 8 <n ^ 3, ou aproximadamente 8000 <n <692000. Você pode pegar n = 20000 e n ^ 2 algo, mesmo em uma linguagem 400x mais lenta (10 ^ 9/400 por s) levará apenas 160 segundos, enquanto mesmo rápido n ^ 3 levará 8.000 segundos.
ShreevatsaR
14

Gostei da ideia de Jerry Coffin de plotar os competidores do concurso Google AI, então peguei todos os resultados e plotei-os (média calculada, desvio padrão e, a seguir, representei as curvas de distribuição normal no Excel).

Com Lua e JS, conseguiu isso:

Sem (havia poucos concorrentes, então talvez os resultados sejam distorcidos):

Parece que os participantes Java se saíram notavelmente pior do que o resto, enquanto Go, Common Lisp e C estão na extremidade melhor.

Tatiana Racheva
fonte
No entanto, a pergunta feita sobre o Google Code Jam e não sobre o concurso Google AI (sua resposta é o primeiro lugar que ouvi falar), então pode ser mais relevante desenhar esses gráficos para o Google Code Jam. Na verdade, a pergunta já menciona tais estatísticas (2010) ; ver também 2011 , 2012 , 2013 e 2014 (em andamento no momento) .
ShreevatsaR
12

Por que todos nós falamos inglês e não esperanto ? Bem, simplesmente aconteceu assim. Mesmo que o inglês seja inconsistente e inchado e o Esperanto seja intencionalmente projetado como 'ferramenta melhor'.

Portanto, uma das razões é a tradição. Na maioria das escolas, a programação ainda é ensinada em C / C ++, Java, Pascal ou mesmo Basic. E participam desses concursos principalmente de estudantes, que escolhem um idioma que conhecem melhor.
Além disso, você pode notar que a maioria dos livros algorítmicos apresenta psedudocódigo no estilo Pascal ou Ada, e muito raramente - Lisp. Não sei por quê, talvez também seja uma tradição. Ou talvez não seja tão bom para os algoritmos.

Outro motivo seria a velocidade. Embora não seja um problema para o Google Code Jam, em quase todas as competições a diferença de velocidade de 2x é uma diferença entre os veredictos 'Aceito' e 'Limite de tempo'.
Em outras palavras, se o algoritmo ideal em C ++ é executado 10 vezes mais rápido do que em Ruby, pode significar que um algoritmo abaixo do ideal em C ++ ainda será mais rápido do que um bom em Ruby. E os autores do concurso geralmente não querem permitir O (n ^ 2) envios, se O (n * logn) puder ser alcançado.

Nikita Rybak
fonte
7
Apenas um comentário sobre sua analogia: o Esperanto falha miseravelmente em seus objetivos. Seus sons são praticamente iguais aos do dialeto polonês de Zamenhof, e sua gramática não é natural e complicada. Não é de forma alguma uma boa linguagem universal; O Klingon, em muitos aspectos, faz um trabalho melhor em parecer uma linguagem humana natural. Pode-se, suponho, argumentar que há semelhanças nisso com C ++ e Java, mas isso seria injusto :) (Veja também xibalba.demon.co.uk/jbr/ranto .)
Antal Spector-Zabusky
1
@Antal Bem, a analogia pode ser falha, mas você entendeu. Entre você e eu, eu também não falo Esperanto :)
Nikita Rybak
a linguagem (natural) é um símbolo de associação tribal , e as linguagens de programação são influenciadas por muitas das mesmas pressões
trapézio
12

Primeiro, eu questionaria sua premissa [editar: ou o que considero ser uma premissa - que os competidores que usam C ++ e Java se saem igualmente bem]. Por exemplo, veja quais idiomas foram usados ​​para as entradas que vieram nos primeiros 100 lugares e nos últimos 100 lugares no recente concurso de IA do Google:

texto alternativo

Os competidores que usam C ++ e Java não parecia estar em qualquer lugar próximo a igualmente bem sucedido nesse concurso. Os competidores usando Python também não pareceram se sair muito bem, embora houvesse consideravelmente menos deles, enfraquecendo qualquer conclusão a esse respeito.

Em segundo lugar, é claro, uma grande parte da explicação (como outros apontaram) é, sem dúvida, apenas o número de pessoas que estão familiarizadas com cada idioma. Provavelmente há mais pessoas fazendo um curso em Java agora do que o número total de pessoas que já escreveram qualquer Lisp, Scheme ou Prolog.

Edit: Eu acho que uma terceira possibilidade é simplesmente versatilidade. Para pegar um exemplo extremo, Prolog é muito bem adequado para alguns problemas, mas igualmente mal adequado para muitos outros. Poucas pessoas podem (ou pelo menos aprendem) aprender mais de um ou dois idiomas bem o suficiente para usá-los em um concurso, então a maioria das pessoas que estão interessadas em tais coisas provavelmente escolherão idiomas que podem funcionar razoavelmente bem para quase tudo, ao invés de tentando aprender uma linguagem especializada para cada problema que possa ser escolhido.

Jerry Coffin
fonte
1
Bem, parece que a maioria dos principais participantes usava C ++ / C # e menos deles usava Python / Haskell / Lisp / Scheme / Ruby / Prolog, o que fortalece a premissa da questão, não é? A questão não era comparar C ++ e Java entre si (embora isso seja interessante, obrigado), mas algo como: ”Por que as linguagens" legais "têm menos sucesso no topo? Por que os bons competidores (que provavelmente sabem muitos idiomas) não escolhem um desses? ” Mas concordo que a familiaridade é uma das principais razões.
ShreevatsaR
Minha impressão (talvez errada) foi que a questão presumida que os competidores usando C ++ e Java tiveram o mesmo sucesso. Isso pode ser verdade em algumas competições, mas certamente não parecia ser neste. Embora seja verdade que havia menos deles, os concorrentes usando Go, Haskell, Lua e CL pareciam ter mais sucesso do que aqueles que usavam Java (embora, reconhecidamente, em termos de taxa de sucesso, C ++ certamente parecesse dominar, pelo menos em neste caso particular).
Jerry Coffin
5
Perdoe minha picuinha, mas isso realmente deveria ser um gráfico de barras ao invés de um gráfico de linha ...
tzaman
Oh meu. Estou lutando para fazer um gráfico que faça sentido há uma hora e não estou progredindo. As planilhas do Excel e do Google me fazem sentir estúpido.
Tatiana Racheva
O Lisp não pode ser tecnicamente usado como um pré-processador de macro C / C ++ ...? Você poderia fazer parecer que enviou um programa C ++, mas na verdade você codificou em Lisp!
aoeu256
12

Em quase todas as rodadas do Google Code Jam, mais dos concorrentes de melhor desempenho codificam em C ++.

Abaixo estão as estatísticas de idioma do Google Code Jam 2012, Rodadas 1A, 1B e 1C (listadas de cima para baixo). O número de competidores em cada rodada é 3.686, 3.281 e 3.189, respectivamente.

Estatísticas de idioma do Google Code Jam 2012, rodada 1A Estatísticas de idioma do Google Code Jam 2012, rodada 1B Estatísticas de idioma do Google Code Jam 2012, rodada 1C

Rose Perrone
fonte
8

pergunta divertida, provavelmente deveria ser wiki da comunidade.

Veja o número de finalistas por país: http://www.go-hero.net/jam/10/regions . observe o número de pessoas da Europa Oriental e da Rússia. esses lugares têm comunidades C ++ muito fortes, assim como Java, por vários motivos.

veja os idiomas dos números nas eliminatórias: http://www.go-hero.net/jam/10/languages/0 e finais: http://www.go-hero.net/jam/10/languages/6 . C ++ começa com menos da metade e tem 75 por cento nas finais. ou bons programadores preferem C ++ ou C ++ torna os programadores. Provavelmente, no momento em que você domina C ++, outras coisas se tornam triviais.

Você é livre para tirar suas próprias conclusões.

Anycorn
fonte
5

Primeiro de tudo, como você tem pontas C++e Javasão linguagens tradicionais. Isso significa automaticamente que as pessoas que começam a fazer competições de programação serão apresentadas a eles primeiro - aliás, quem aprende Lispcomo primeira língua :) Eu também participo regularmente dessas competições - eu costumava C++competir, embora meu idioma favorito seja Java. Só quero praticar outro idioma além de Java- tambémC++é um pouco menos prolixo e funciona mais rápido, o que é importante para competições de programação. Agora, ao meu ponto - as pessoas se tornam especialistas primeiro nas línguas convencionais. Para participar de competições de programação, você deve ter um bom domínio da linguagem que está usando. Você não tem tempo para pesquisar coisas estúpidas na Internet - como esquecer um constructo. É que a velocidade é um fator importante aqui. UsarLispem uma competição, você deve gostar. Não acho que haja tantas pessoas por aí. Corrija-me se eu estiver errada. E honestamente, os profissionais que você mencionou simplificam o retrocesso: em qualquer idioma, retroceder é fácil - declare um método e apenas chame-o novamente para cada resultado possível. Não poderia ser mais simples. Não senti até agora que a linguagem que estou usando está tentando me fazer tropeçar em competições de programação.

Petar Minchev
fonte
O plural de anedota pode não ser um dado, mas aprendi Scheme como meu primeiro idioma e meu curso de introdução à ciência da computação foi em Haskell. Eu concordo que isso parece ser incomum, no entanto: C / C ++ / Java / Python parecem ser os mais populares.
Wang
Bom ponto; Acho que isso vai ao cerne da questão. Para programadores com prática suficiente em fazer as coisas que freqüentemente surgem, não há realmente nenhum grande benefício em outras linguagens. (E recursos como, digamos, a capacidade de processamento de texto do Perl raramente têm qualquer utilidade nesses concursos.)
ShreevatsaR
3

OMG ... As pessoas estão analisando as estatísticas e números !!

Não vamos esquecer o básico .. Estas são as únicas duas línguas (principalmente) que são ensinadas às pessoas na faculdade / escolas ...!

Isso pode responder à pressa!

Arpit
fonte
2

Grandes bibliotecas foram um ponto de venda de Java no ACM ICPC. É útil ser capaz de perceber que você deseja alguma estrutura ou algoritmo de dados aleatório e simplesmente retirá-lo das bibliotecas padrão.

Wang
fonte
2

Lembre-se de que C ++ não é apenas a maioria entre todos os competidores, mas conforme o andamento das rodadas, sua porcentagem continua e continua melhorando.

Diria que é verdade que a maioria dos participantes são estudantes (Porém, por se tratar de um torneio aberto com possibilidade de entrevista de emprego no google, então há que considerar que muitos dos participantes são formados). Mas as últimas rodadas são apenas para pessoas com muita experiência. Eles não são apenas alunos que aprenderam a codificar em C ++ / Java.

Claro, o argumento do aluno também funciona contra linguagens como LISP e OcaML ou ProLog. Ou seja, idiomas, que são muito usados ​​em áreas de IA, mas no mundo regular os alunos são os que mais provavelmente os aprendem e usam.

Grandes concursos além do Google suportam poucos idiomas, mas isso ainda não explicaria por que Pascal ou .net não estão perto do nível de Java (já que eles tendem a ser igualmente suportados nos principais eventos do concurso).

Muitos dos melhores programadores nesses concursos sabem muitas línguas. Mas eles ainda preferem usar C ++ durante as rodadas, deve ser por um motivo maior do que "aprender C ++" primeiro.

Eu argumentaria contra a afirmação de que linguagens diferentes de C ++ ou Java são ferramentas melhores para o trabalho. Se os dados diretos dizem que os finalistas são mais propensos a usar C ++ e Java, é uma contradição direta a essa afirmação.

Os dados de competição do Google AI não contradizem nenhuma premissa a respeito do code jam. Na verdade, mostra que os melhores codificadores são capazes de usar linguagens como Common Lisp quando é realmente a melhor ferramenta para o trabalho. Se quisermos usar esses dados para assumir que CLISP é uma ótima ferramenta para competições de IA, então devemos também assumir que C ++ é uma ótima ferramenta para competições de algoritmo como GCJ.

UltraAwesomeAnonymousSpy
fonte