Escolhendo uma linguagem de programação funcional [fechada]

Fechada. Esta pergunta está fora do tópico . Atualmente não está aceitando respostas.

Comentários

  • Seja o que for que você escolher, escreva um lote de código que usará para algo nele.
  • Não ' Quer pensar sobre Scala ?
  • @ykombinator: I ' ve ouvi falar, mas não procurei mais. Eu não ' não sei se teria algo a oferecer sobre os que listei, ou talvez traria uma combinação de opções interessantes de cada um deles … Não ' não sei. Parece-me uma linguagem bastante discreta, embora pareça estar ganhando popularidade.
  • Eu não ' não sei onde você ouviu que o mundo Java está " no limite " – ' está atualmente passando por um grande renascimento, em grande parte graças a) OpenJDK tornando-se a implementação padrão b) novas linguagens JVM como Scala e Clojure ec) O fato de os projetos de big data / nuvem estarem cada vez mais escolhendo a JVM como plataforma de destino ed) Android. No início de 2012, ela ' é provavelmente a plataforma mais empolgante para se estar …..
  • @mikera: Concordo. Isso faz mais de um ano, logo depois que a Oracle adquiriu a Sun Microsystems e havia toda aquela preocupação e especulação sobre o futuro do Java ser comprometido por uma corporação mais controladora assumindo o controle … A JVM parece bem segura no momento, felizmente!

Resposta

Já que você deseja um prático   idioma:

texto alternativo

Observe que Haskell e Lisp são mais usados do que outros na indústria, embora existam tem havido algum interesse recente em Clojure e F #.

Mas veja o que acontece quando adicionamos Scheme à mistura:

texto alternativo

Hmm, não se parece tanto com uma linguagem acadêmica agora, não é?

Na verdade, o gráfico acima é provavelmente uma mentira; a palavra “esquema” pode aparecer como ajuda anúncios desejados em outros contextos além das linguagens de programação. 🙂

Então aqui está outro gráfico que é provavelmente (um pouco) mais representativo:

texto alternativo

Se você quiser explorar um dialeto realmente fantástico do Scheme, dê uma olhada em Racket.

Comentários

  • Uau, boa postagem. Racket é exatamente o que eu ' m usando … PLT-Scheme era seu nome quando comecei a aprendê-lo. Essa linha vermelha no último gráfico me preocupa. Nunca pensei que Scheme pudesse ser usado tanto. E Clojure parece estar decolando. Hmm …
  • @M. Joanis: Considere os dois últimos gráficos com um grão de sal; a aparência de escada e a volatilidade do último gráfico sugerem que não há muitos pontos de dados no gráfico, embora isso indique que alguém acha que vale a pena pagar pelas línguas.
  • @Robert Harvey, o que mudou do segundo para o terceiro gráfico?
  • @Geoffrey: Olhe as legendas; Eu adicionei a palavra " desenvolvedor " aos termos de pesquisa.
  • Observe que Haskell e Lisp também são homônimos e que os dados do De fato ' s não generalizam para o resto do mundo. ITJobsWatch lista 79 trabalhos Scala, 55 F #, 47 Haskell, 30 Lisp e 7 trabalhos Clojure.

Resposta

Se você quiser aprender programação funcional, talvez seja melhor aprender Haskell primeiro e, em seguida, usar a linguagem que desejar. Você pode aprender programação funcional usando outras linguagens, mas elas ainda permitem código imperativo e orientado a objetos. Se você escrever um programa real em Haskell, aprenderá a programação funcional mais rápido porque os outros paradigmas não estarão disponíveis para recorrer.

Depois de escrever seu programa Haskell, você terá ferramentas como mônadas e técnicas como codificação sem pontos para trazer para a linguagem de sua escolha. Os conceitos parecem mapear especialmente bem para Scheme.

Comentários

  • Acho que você ' acertou em escolher uma linguagem funcional pura primeiro. Eu estaria muito interessado em ver uma ordenação de linguagens funcionais por pureza.
  • @M. Joanis: de os idiomas listados em sua pergunta, eu diria que Haskell é o mais puro, seguido por Clojure, F # e Lisp.

Resposta

Na verdade, se você fosse capaz de implementar um sistema razoavelmente complexo no Scheme, você “seria bastante desejável em empresas onde você provavelmente gostaria de trabalhar. No início da minha carreira, encontrei alguns alunos que haviam feito uma boa quantidade de trabalho no Scheme, e a única vez que foi uma desvantagem foi quando eles foram incapazes de explicar seu trabalho ou não o entendiam bem o suficiente para implementar dados básicos estruturas e algoritmos dentro de um período de tempo razoável. Eu sempre deixo os candidatos responderem a essas perguntas em seu idioma preferido; encontrei algumas pessoas que pensaram que eram os melhores na Scheme, que conseguiram lutar bastante com coisas que deveriam ser fáceis, como adicionar um elemento a uma lista vinculada, o que me deixou perplexo.

Mas se você fosse capaz de “obter” o Scheme bem o suficiente para escrever até mesmo um aplicativo da web médio, isso seria um bom argumento de venda empresas sérias de software.

Se você estivesse entrevistando em uma loja “blub” e os desenvolvedores apenas achassem que você era estranho por causa de sua proficiência em Scheme ou Haskell ou F #, provavelmente não gostaria de trabalhar lá. Na maioria dos casos, os desenvolvedores competentes têm sua escolha de shows, então não se preocupe com a “praticidade”, a menos que as únicas opções que você possa imaginar no futuro sejam corporativas. Trabalhe para ser competente, flexível e resolver problemas.

A faculdade não tem a ver com praticidade. Trata-se de criar um ambiente seguro para explorar e aprender. Isso é, de fato, útil, mesmo se você acabar escrevendo um software comum para o resto de sua carreira.

Dito isso, eu não ” Não vejo por que você deseja limitar a apenas uma dessas opções tão cedo. Você pode facilmente ter uma noção de todos os quatro idiomas em cerca de 4 semanas e, em seguida, escolher um para se concentrar melhor nas malhas com seus caprichos atuais. volte para outra de suas opções e tente implementar algo semelhante. Passe para algo mais complexo e considere suas opções novamente. A experimentação é boa. A menos que você esteja tentando ganhar a vida no próximo mês, não precisa torne-se um especialista ainda.

Eu escrevi alguns em Scheme, F #, Emacs Lisp e Common Lisp, e li pelo menos um pouco de Haskell, pelo menos ocasionalmente nos últimos anos. Não posso dizer que sou um especialista em qualquer uma delas, mas cada excursão nessas linguagens me beneficiou em todas as outras linguagens em que trabalho profissionalmente (C #, Java, Ruby e ocasionalmente Boo, Perl e Python). A curiosidade construirá uma carreira mais duradoura e gratificante do que qualquer outra coisa.

Comentários

  • " Curiosidade irá construir para você uma carreira mais duradoura e gratificante do que qualquer outra coisa. " Esta declaração é muito inspiradora. Você ' está certo. Eu ' estou muito apressado. Sempre sinto que vai levar muito tempo para aprender … Se eu pudesse voltar 12 anos, quando comecei, ' saberia não perder todo o meu tempo em VB e C ++. Eu sinto que esses anos foram muito desperdiçados. Eu não estava ' curioso o suficiente. Eu queria codificar coisas. Usar as línguas que eu conhecia era o suficiente. Naquela época, pensei que sabia bastante, mas não era ' o caso de forma tão horrível.

Resposta

Mergulhei em Haskell por um tempo, mas a conclusão a que cheguei foi que era um pouco acadêmico demais. Era muito difícil fazer qualquer coisa prática. Em uma linguagem puramente funcional, coisas como IO simplesmente não se encaixam no modelo, então você tem que lidar com mônadas. Eu determinei que teria que dedicar uma quantidade enorme de tempo para ser apenas pouco competente, então segui em frente .

Eu fiz Scheme na faculdade. Pode parecer trivial, mas todos os parênteses realmente me distraem / irritam. É difícil voltar a isso depois de usar linguagens como Python.

Recentemente, eu tenho explorando o F #. É funcional, mas também pode ser imperativo e orientado a objetos quando você quiser. Isso, junto com a capacidade de usar qualquer biblioteca .NET, torna possível misturar facilmente suas partes puramente funcionais com coisas mais práticas como GUIs, IO e rede. Você pode obter uma versão autônoma do F #.

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang=en

Comentários

  • O fato de F # e Clojure não serem puramente funcionais desempenha um papel importante a seu favor. Talvez F # possa ser meu ponto de entrada no Família .Net algum dia …
  • @MJoanis, você declarou o custo como um ponto em relação ao F #, mas, como Erik aponta, você pode obtê-lo totalmente de graça.
  • Se eu li os termos corretamente, você basicamente consegue de graça na condição de não usá-lo (ou comprar licenças). Mas eu entendo que ainda pode ser uma coisa muito boa para aprender caso eu acabe em uma empresa que usa o Visual Studio.Eu ' provavelmente tentarei uma vez que ' esteja funcional com uma linguagem de programação funcional mais livre.
  • @M. Joanis: Não, o F # é até de código aberto e você pode tentar rodar no Mono em outras plataformas.
  • Talvez os tempos tenham mudado desde 2010, mas como alguém que começou a aprender haskell nos últimos meses, eu não ' não pense que fazer IO em haskell seja difícil. Para coisas básicas, você só precisa aprender um pouco da nova sintaxe do. Obter o verdadeiro entendimento fundamental leva algumas semanas no máximo, mas eu realmente não ' não vejo o que é a confusão sobre mônadas. Eu não ' não acho que eles eram mais difíceis de aprender do que classes, instâncias, membros estáticos e todo o jazz relacionado ao estado em OOP.

Resposta

Avaliei todas as principais linguagens funcionais há um ou dois anos atrás, do ponto de vista de querer uma linguagem de programação funcional prática e de propósito geral.

Acabei escolhendo Clojure , que subsequentemente provou ser uma excelente escolha.

De um modo geral, os principais motivos foram:

  • Ecossistema de bibliotecas – para que uma linguagem seja útil, você precisa de acesso a boas bibliotecas. Estar na JVM significa que você tem acesso fácil à maior biblioteca de software livre e ecossistema de ferramentas, portanto, optar por uma linguagem JVM foi um acéfalo de uma perspectiva pragmática. Scala também obteve alta pontuação aqui.

  • Macro-metaprogramação – Este aspecto de Lisp sempre me atraiu, especialmente porque eu antecipei fazer um pouco de geração de código. Apreciei muito os argumentos apresentados no breve ensaio de Paul Graham “ Superando as médias “. Os vários Lisps pontuaram fortemente aqui.

  • Desempenho foi “bom o suficiente “- Clojure é sempre compilado e obtém os benefícios do otimizador JVM JIT e excelente GC. Como sempre, há alguma sobrecarga no uso de uma linguagem funcional, mas com Clojure ficou claro que cada um pode se aproximar da velocidade do Java com um pouco de esforço (Clojure oferece suporte a primitivos Java e tipagem estática opcional para aquelas situações em que você precisa). Minha estimativa é que Clojure é aproximadamente 2 a 5 vezes mais lento do que você poderia conseguir com código Java ou C ++ otimizado, o que é consistente com o que você vê nos benchmarks falhos e, com o tempo, espero que essa lacuna diminua ainda mais. Além disso, é fácil escrever código particularmente sensível ao desempenho em Java puro e chamá-lo de Clojure.

  • Simultaneidade – Clojure tem uma abordagem bastante única e poderosa para simultaneidade, especialmente para simultaneidade altamente multi-core. É “um pouco difícil de explicar, mas este vídeo é excelente para dar uma ideia dos princípios. Acho que Clojure atualmente tem a melhor resposta para a pergunta complicada “como você deve gerenciar o estado compartilhado, simultâneo e mutável em uma linguagem de programação funcional?”.

  • Design da linguagem – Clojure é IMO um design de linguagem muito bem pensado. Os exemplos são ter literais de vetor [] e mapa {} além dos parênteses Lisp regulares, uso de estruturas de dados persistentes imutáveis, suporte à preguiça em toda a linguagem por meio da abstração de sequência e fornecendo ao programador uma variedade de recursos ortogonais para resolver diferentes problemas . Veja a arte da abstração e simplificado e fácil .

  • Comunidade – sempre subjetiva, mas gostei do que vi na comunidade Clojure. A atitude foi muito útil, construtiva e pragmática. Há uma forte ênfase em “fazer as coisas”, possivelmente refletindo o fato de que muitas pessoas da Clojure (incluindo o próprio Rich Hickey) têm experiência na construção de sistemas empresariais complexos. O fato de a comunidade Clojure ter fortes vínculos com a comunidade Java também foi importante para me convencer de que Clojure não correria o risco de ficar preso em um “nicho”.

Se eu tivesse que citar algumas desvantagens menores de Clojure, estas seriam:

  • Tipagem dinâmica – frequentemente isso é uma vantagem em termos de produtividade, mas na média acho que trocaria isso por uma verificação de tipo e inferência mais fortes. Geralmente isso é atenuado por ter um bom conjunto de testes automatizados, mas se você gosta de seus tipos validados estaticamente pelo compilador, Haskell ou Scala podem ser mais a sua preferência.

  • Vanguarda – Clojure está se desenvolvendo muito rápido e há “sa muitas inovações acontecendo – a desvantagem disso é que há muita experimentação, algumas bibliotecas e ferramentas ainda são imaturas e há mudanças interrompidas ocasionais entre as versões principais do Clojure nas quais você precisa ficar de olho.

No geral, porém, não acho que você possa errar com o Clojure se quiser uma linguagem funcional moderna excelente e pragmática!

Comentários

  • Obrigado! Ótimo post! Eu estava, esses dias, pensando em usá-lo para um projeto interno da empresa que será fortemente baseado em árvores e recursividade. Além disso, temos uma grande quantidade de código Java por aqui que podemos reutilizar com o Clojure.

Resposta

Isso parece que você fez seu dever de casa, então provavelmente já sabe disso, mas Scheme é um dialeto do Lisp assim como o Lisp comum. Se você gosta de muitas coisas sobre o Scheme, mas não gosta de sua natureza acadêmica, tente Common Lisp. De acordo com o índice TIOBE , é o 13º idioma mais popular em relação ao Scheme na posição 26.

Poucos idiomas que você Os mencionados aparecem nas descrições de cargos que vi recentemente, embora possa ser apenas meu pequeno conjunto de amostra. Pessoalmente, estarei aprendendo Haskell, embora não espere usar essa linguagem diretamente em meu trabalho. Os conceitos de programação funcional são mais valiosos para projetos de programas futuros do que a comercialização direta da linguagem em si.

Comentários

  • Obrigado pelo TIOBE link, isso é uma referência interessante. Acho que você está escolhendo Haskell por sua pureza em termos de programação funcional?
  • @ M.Joanis: Basicamente, embora eu ' esteja pensando em escolher mais tarde Lisp também. Consulte programmers.stackexchange.com/questions/18838/…
  • A resposta escolhida faz muito sentido. Pureza parece ser o caminho a percorrer até que eu realmente tenha compreendido todo o paradigma funcional.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *