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.
fonte
Respostas:
Ó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 como
FOR(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").
fonte
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.
fonte
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.
fonte
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:
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.
fonte
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.
fonte
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.
fonte
Primeiro de tudo, como você tem pontas
C++
eJava
sã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 aprendeLisp
como primeira língua :) Eu também participo regularmente dessas competições - eu costumavaC++
competir, embora meu idioma favorito sejaJava
. Só quero praticar outro idioma além deJava
- 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. UsarLisp
em 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.fonte
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!
fonte
Uma razão vital pode ser que todos os concursos não suportam linguagens como python ou prólogo. Especialmente ACM ICPC World Finals suporta C / C ++ e Java . E o TopCoder também suporta apenas C ++, Java, C #, VB e agora Python . É natural que os competidores escolham um idioma disponível em cada concurso. Outro motivo pode ser a velocidade de execução. E sim, outra razão é que essas são as línguas que a maioria das pessoas aprende primeiro.
fonte
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.
fonte
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.
fonte