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

48

Eu tenho lido muitos tópicos sobre linguagens de programação funcional ultimamente (quase no ano passado, na verdade). Eu realmente gostaria de escolher um e aprendê-lo completamente.

No último semestre [curso], fui apresentado ao Scheme. Eu amei. Adorei a extrema simplicidade da sintaxe, o princípio homoiconicity , as macros ( higiênico e não higiênico), a n-aridade dos procedimentos, etc.

O problema com o Scheme é uma linguagem acadêmica. Eu não acho que é realmente usado em ambientes de produção. Eu também não acredito que seja particularmente bom ter em nosso currículo. Então, tenho procurado alternativas. Há muitos deles e, de alguma forma, todos parecem ter um nível similar de popularidade.

Algumas reflexões sobre algumas outras linguagens funcionais que já considerei:

  • Clojure: Parece ótimo porque pode acessar o mundo Java, é orientado para escalabilidade e simultaneidade, mas o mundo Java não está no limite agora? Eu já conheço o Java muito bem, mas seria sensato adicionar ainda mais energia dependendo da JVM?
  • Haskell: Parece uma linguagem muito apreciada, mas pelo que li, é também mais uma linguagem acadêmica.
  • Lisp: Já existe desde sempre. Parece ter mais do que eu gosto do Scheme. Tem uma grande comunidade. Pelo que eu acho que sei, é provavelmente a linguagem de programação funcional mais utilizada na indústria (?).
  • F #: Realmente não considerou isso. Eu não sou um grande fã das coisas do MS. Eu não tenho dinheiro para pagar por seus softwares (eu poderia libertá-los de alianças universitárias, mas estou mais inclinado a ir com soluções voltadas para a comunidade). Embora ... eu acho que seria a melhor escolha orientada para a carreira.

Hoje à noite, estou inclinado para Lisp. Uma semana atrás, era Haskell. Antes disso, era o Clojure. No ano passado, eu estava fazendo algum Esquema por diversão, sem forçar o motivo pelo qual você sabe. Agora eu gostaria de levar a sério (sobre aprender um, sobre fazer projetos reais com ele, sobre eventualmente trabalhar profissionalmente com ele). Meu problema é que eu precisaria aprender tudo em profundidade antes de poder escolher um.

    
por Joanis 08.12.2010 / 05:24
fonte

6 respostas

36

Como você quer uma linguagem prática :

ObservequeHaskelleLispsãousadosmaisqueosoutrosnaindústria,emboratenhahavidoalguminteresserecenteemClojureeF#.

MasvejaoqueacontecequandoadicionamosSchemeaomix:

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

Na verdade, o gráfico acima é provavelmente uma mentira; a palavra "esquema" pode aparecer nos anúncios de ajuda desejada em outros contextos além das linguagens de programação. :)

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

SevocêquiserexplorarumdialetorealmentechocantedoScheme,dêumaolhadaem Racket.

    
por 08.12.2010 / 05:54
fonte
18

Se você quer aprender programação funcional, você pode ser melhor servido para aprender Haskell primeiro, então use qualquer idioma que você quiser. Você pode aprender programação funcional usando as outras linguagens, mas elas ainda permitem códigos imperativos e orientados a objetos. Se você escrever um programa real em Haskell, aprenderá programação funcional mais rápido, porque os outros paradigmas não estarão disponíveis para serem usados.

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

    
por 08.12.2010 / 15:14
fonte
15

Na verdade, se você fosse capaz de implementar um sistema razoavelmente complexo no Scheme, seria bastante desejável em empresas onde você provavelmente desejaria trabalhar. No início da minha carreira, encontrei alguns alunos que tinham feito um bom trabalho em Scheme, e a única vez que era uma desvantagem era quando eles não conseguiam explicar seu trabalho ou nã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; Eu encontrei algumas pessoas que achavam que elas eram melhores em Scheme, que conseguiam lutar um pouco com coisas que deveriam ser fáceis, como adicionar um elemento a uma lista encadeada, o que me intrigava.

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 ponto de venda nas empresas de software mais sérias.

Se você estivesse entrevistando em uma loja "blub" e os desenvolvedores pensassem 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, desenvolvedores competentes têm a opção de fazer shows, então não se preocupe com "praticidade" a menos que as únicas opções que você possa imaginar no futuro sejam corporativas. Trabalhe para ser competente, flexível e quebrar problemas.

A faculdade não é sobre praticidade. É sobre criar um ambiente seguro para explorar e aprender. Isso é, de fato, útil, mesmo que você acabe escrevendo softwares comuns para o resto de sua carreira.

Dito isso, não vejo por que você gostaria de 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, depois escolher um para se concentrar nessas malhas melhor com seus caprichos atuais. Em seguida, volte para outra das 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, você não precisa se tornar 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 nenhum deles, mas cada excursão nesses idiomas me beneficiou em todos os outros idiomas 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.

    
por 08.12.2010 / 06:36
fonte
9

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

Eu fiz Scheme na faculdade. Pode parecer trivial, mas todos os parênteses são realmente perturbadores / irritantes. É difícil voltar a isso depois de usar idiomas como o Python.

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

link

    
por 08.12.2010 / 05:59
fonte
9

Eu avaliei todas as principais linguagens funcionais um ano ou dois atrás, da perspectiva de querer uma linguagem de programação funcional, prática e geral.

Acabei escolhendo o Clojure , que posteriormente provou ser uma excelente escolha.

De um modo geral, as principais razões foram:

  • Ecossistema da biblioteca - para que um idioma 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 ao ecossistema de ferramentas, por isso, optar por uma linguagem de JVM não foi difícil de ser feito a partir de uma perspectiva pragmática. Scala também marcou muito bem aqui.

  • Macro-metaprogramação - Este aspecto do Lisp sempre me atraiu, especialmente desde que eu esperava fazer um pouco de geração de código. Apreciei muito os argumentos apresentados no pequeno ensaio de Paul Graham " Beating The Averages ". Os vários Lisps marcaram strongmente aqui.

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

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

  • Design de idioma - Clojure é IMO, um design de linguagem muito bem pensado. Exemplos são ter literais vector [] e map {} além dos parênteses Lisp comuns, uso de estruturas de dados persistentes imutáveis, suporte à preguiça em toda a linguagem através da abstração de sequência e fornecimento ao programador de uma variedade de recursos ortogonais para resolver diferentes problemas . Veja a arte da abstração e simples facilitado .

  • Comunidade - sempre subjetiva, mas gostei do que vi na comunidade Clojure. A atitude foi muito útil, construtiva e pragmática. Há uma ênfase strong em "fazer as coisas acontecerem", possivelmente refletindo o fato de que muitas pessoas do Clojure (incluindo o próprio Rich Hickey) vêm de um histórico de construção de sistemas corporativos complexos. O fato de a comunidade Clojure ter strongs links para a comunidade Java também foi importante para me convencer de que o Clojure não correria o risco de ficar preso em um "nicho".

Se eu tivesse que nomear algumas pequenas desvantagens do Clojure, estas seriam:

  • Digitação dinâmica - muitas vezes isso é uma vantagem em termos de produtividade, mas, em média, acho que eu trocaria isso por verificação e inferência de tipos mais strongs. Principalmente, isso é mitigado por ter uma boa suíte de testes automatizada, mas se você gostar de seus tipos estaticamente validados pelo compilador, então o Haskell ou o Scala podem ser mais sua xícara de chá.

  • Vanguarda - O Clojure está se desenvolvendo muito rápido e há muita inovação acontecendo - a desvantagem disso é que há muita experimentação, algumas bibliotecas e ferramentas ainda são imaturas , e há ocasionais interrupções entre as versões principais do Clojure que 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!

    
por 13.01.2012 / 07:20
fonte
6

Parece que você fez sua lição de casa, então você provavelmente já sabe disso, mas Scheme é um dialeto de Lisp assim como o Common Lisp é. Se você gosta de muitas coisas sobre Scheme, mas não gosta de sua natureza acadêmica, tente Common Lisp. De acordo com o índice TIOBE , é a 13ª linguagem mais popular vs Scheme na posição 26.

Poucos dos idiomas que você mencionou aparecem nas descrições de trabalho que vi recentemente, embora isso possa ser apenas o meu pequeno conjunto de amostras. Eu pessoalmente estarei aprendendo Haskell, mesmo que não espere usar essa linguagem diretamente no meu trabalho. Os conceitos de programação funcional são mais valiosos para mim para futuros projetos de programas do que a comercialização direta da própria linguagem.

    
por 08.12.2010 / 05:30
fonte