Ultimamente, tenho lido muitos tópicos sobre linguagens de programação funcional (quase no ano passado). Eu realmente gostaria de escolher um e aprendê-lo completamente.
No último semestre, fui apresentado ao Scheme. Eu amei. Adorei a extrema simplicidade de sintaxe, o princípio da homoiconicidade , as macros ( higiênicas e não higiênicas), a n-aridade de procedimentos etc.
O problema com o Scheme é que é uma linguagem acadêmica. Não acho que seja realmente usado em ambientes de produção. Também não acredito que seja particularmente bom ter em nosso currículo. Então, eu tenho procurado alternativas. Existem muitos deles e, de alguma forma, todos parecem ter um nível semelhante de popularidade.
Algumas reflexões sobre outras linguagens funcionais que já considerei:
- Clojure: Parece ótimo porque pode acessar o mundo Java, ele é orientado para a escalabilidade e simultaneidade, mas o mundo Java não está no limite agora? Eu já conheço Java muito bem, mas seria aconselhável 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: Existe desde sempre. Parece ter o que mais gosto no Scheme. Tem uma grande comunidade. Pelo que eu [acho que sei], é provavelmente a linguagem de programação funcional mais usada na indústria (?).
- F #: Realmente não considerou isso. Eu não sou um grande fã de coisas de MS. Não tenho dinheiro para pagar por seus softwares (eu poderia tê-los livres de alianças universitárias, mas estou mais inclinado a usar soluções orientadas pela comunidade). Embora ... eu acho que seria a melhor escolha orientada para a carreira.
Hoje à noite, estou inclinado para Lisp. Há uma semana, era Haskell. Antes disso, era Clojure. No ano passado, eu estava fazendo algum esquema por diversão, sem insistir no motivo pelo qual você sabe. Agora eu gostaria de levar a sério (sobre aprender um, sobre fazer projetos reais com ele, sobre talvez trabalhar profissionalmente com ele). Meu problema é que eu precisaria aprendê-los todos em profundidade antes de poder escolher um.
Respostas:
Desde que você quer uma linguagem prática :
Observe que Haskell e Lisp são usados mais que os outros na indústria, embora tenha havido algum interesse recente em Clojure e F #.
Mas veja o que acontece quando adicionamos o esquema à mistura:
Hmm, agora não parece mais uma linguagem acadêmica, parece?
Na verdade, o gráfico acima é provavelmente uma mentira; a palavra "esquema" pode aparecer nos anúncios de ajuda em outros contextos além das linguagens de programação. :)
Então, aqui está outro gráfico que é provavelmente (um pouco) mais representativo:
Se você quiser explorar um dialeto realmente chique do Scheme, dê uma olhada no Racket.
fonte
Se você quiser aprender programação funcional, talvez seja melhor aprender primeiro o Haskell e depois usar o idioma que desejar. 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á a programação funcional mais rapidamente, 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 levar ao idioma de sua escolha. Os conceitos parecem mapear especialmente bem para Scheme.
fonte
Na verdade, se você fosse capaz de implementar um sistema razoavelmente complexo no Scheme, seria bastante desejável em empresas nas quais provavelmente desejaria trabalhar. No início de minha carreira, encontrei alguns estudantes que haviam realizado bastante trabalho no Scheme, e a única vez que houve uma desvantagem foi quando eles não conseguiram explicar seu trabalho ou realmente não o entenderam 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 pensavam que eram melhores no Scheme que conseguiram lutar um pouco com coisas que deveriam ser fáceis, como adicionar um elemento a uma lista vinculada, o que me deixou intrigado.
Mas se você fosse capaz de "obter" o Scheme bem o suficiente para escrever até mesmo um aplicativo Web comum, esse seria um bom ponto de venda nas empresas de software mais sérias.
Se você estava entrevistando em uma loja de blub e os desenvolvedores pensaram que você era estranho por causa de sua proficiência em Scheme, Haskell ou F #, provavelmente não gostaria de trabalhar lá. Na maioria dos casos, os desenvolvedores competentes podem escolher entre os shows, portanto, não exagere na "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 é realmente útil, mesmo que você acabe escrevendo software comum para o resto de sua carreira.
Dito isto, não vejo por que você desejaria limitar apenas uma dessas opções tão cedo. Você pode facilmente entender todos os quatro idiomas em cerca de 4 semanas e escolher um para se concentrar nas malhas melhor com seus caprichos atuais. Volte para outra das suas opções e tente implementar algo semelhante. Vá para algo mais complexo e considere suas opções novamente. Experimentação é boa. A menos que você esteja tentando ganhar a vida no próximo mês, ainda não precisa se tornar um especialista.
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 especialista em nenhum deles, 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 criará uma carreira mais duradoura e gratificante do que qualquer outra coisa.
fonte
Eu mergulhei em Haskell por um tempo, mas a conclusão a que cheguei foi que era um pouco acadêmico. Foi muito difícil fazer algo prático. Em uma linguagem funcional pura, coisas como IO simplesmente não se encaixam no modelo, então você precisa lidar com mônadas. Decidi 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 são realmente perturbadores / irritantes. Difícil voltar a isso depois de usar linguagens como Python.
Recentemente, estive explorando o F #. É funcional, mas também pode ser imperativa e orientada a objetos quando você desejar. Isso, além de poder usar qualquer biblioteca .NET, torna possível misturar facilmente suas partes funcionais puras com coisas mais práticas, como GUIs, IO e redes. 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
fonte
Avaliei todas as principais linguagens funcionais há um ou dois anos, da perspectiva de querer uma linguagem de programação funcional de uso geral e prática.
Acabei escolhendo Clojure , que posteriormente provou ser uma excelente escolha.
Em termos gerais, os principais motivos foram:
Ecossistema de bibliotecas - para que um idioma seja útil, você precisa acessar boas bibliotecas. Estar na JVM significa que você tem acesso fácil à maior biblioteca de código-fonte aberto e ao ecossistema de ferramentas, portanto, optar por uma linguagem da JVM foi um acéfalo de uma perspectiva pragmática. Scala também marcou muito aqui.
Macro-metaprogramação - Esse aspecto do Lisp sempre me atraiu, principalmente porque eu esperava fazer bastante geração de código. Apreciei muito os argumentos apresentados no pequeno ensaio de Paul Graham " Beating The Averages ". Os vários Lisps marcaram fortemente aqui.
O desempenho foi "bom o suficiente" - o Clojure é sempre compilado e obtém os benefícios do otimizador JVM 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 primitivas do Java e tipagem estática opcional para as situações em que você precisa). Minha estimativa é que o Clojure é 2 a 5 vezes mais lento do que você poderia obter com código Java ou C ++ otimizado, o que é consistente com o que você vê nos benchmarks defeituosos e, com o tempo, espero que essa lacuna diminua ainda mais. Além disso, é fácil o suficiente escrever apenas um código particularmente sensível ao desempenho em Java puro e chamá-lo do Clojure.
Simultaneidade - O Clojure possui uma abordagem bastante única e poderosa da simultaneidade, principalmente para simultaneidade com vários núcleos. É um pouco difícil de explicar, mas este vídeo é excelente para dar uma amostra dos princípios. Acho que o 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 de idiomas - Clojure é IMO, um design de idiomas muito bem pensado. Exemplos incluem literais vetoriais [] e mapeados {}, além dos parênteses regulares do Lisp, uso de estruturas de dados persistentes imutáveis, suporte à preguiça em todo o idioma através da abstração de sequência e fornecendo ao programador uma variedade de recursos ortogonais para resolver problemas diferentes . Veja a arte da abstração e o simples facilitado .
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 muitas pessoas de Clojure (incluindo o próprio Rich Hickey) provêm de um histórico de construção de sistemas empresariais complexos. O fato de a comunidade Clojure também ter fortes vínculos com a comunidade Java 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, elas 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 mais fortes. Principalmente, isso é atenuado por ter um bom conjunto de testes automatizado, mas se você gosta de seus tipos validados estaticamente pelo compilador, Haskell ou Scala podem ser mais sua xícara de chá.
Vanguarda - o Clojure está se desenvolvendo muito rapidamente e há muita inovação - a desvantagem disso é que há muita experimentação, algumas bibliotecas e ferramentas ainda são imaturas e há ocasionais alterações nas versões principais do Clojure que você precisa ficar de olho.
No geral, porém, acho que você não pode dar errado com o Clojure se quiser uma linguagem funcional moderna excelente e pragmática!
fonte
Parece que você fez sua lição de casa, então provavelmente já sabe disso, mas Scheme é um dialeto do Lisp, assim como o Common Lisp. Se você gosta de muitas coisas sobre o Scheme, mas não gosta de sua natureza acadêmica, tente o Common Lisp. De acordo com o índice TIOBE , é o 13o idioma mais popular em comparação com o esquema na posição 26.
Poucos dos idiomas que você mencionou aparecem nas descrições de cargo que vi recentemente, embora esse possa ser apenas meu pequeno conjunto de amostras. Pessoalmente, aprenderei Haskell, embora não espere usar esse idioma diretamente no meu trabalho. Os conceitos de programação funcional são mais valiosos para os projetos futuros do que a comercialização direta da própria linguagem.
fonte