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


48

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.


5
Seja o que for que você escolher, escreva muito código para algo nele.

8
Não pensou em Scala ?
Ykombinator

@ykombinator: Já ouvi falar, mas não procurei mais. Não sei se teria algo a oferecer sobre os que listei, ou talvez traga uma combinação de opções interessantes de cada um deles ... Não sei. Parece-me um idioma de perfil bastante baixo, embora pareça estar ganhando popularidade.
Joanis

11
Não sei onde você ouviu dizer que o mundo Java está "no limite" - atualmente está passando por um grande renascimento, em grande parte graças a) OpenJDK se tornando a implementação padrão b) novas linguagens JVM como Scala e Clojure ec) fato de que os projetos de big data / nuvem estão aumentando, escolhendo a JVM como plataforma de destino e d) Android. A partir do início de 2012, é provavelmente a única plataforma mais excitante estar em .....
mikera

11
@mikera: Concordo. Isso tem mais de um ano, logo após a Oracle adquirir a Sun Microsystems, e havia muita preocupação e especulação sobre o futuro do Java ser comprometido por uma empresa mais controladora que assumia o controle ... Felizmente, a JVM parece bastante segura no momento!
Joanis

Respostas:


35

Desde que você quer uma  linguagem prática :

texto alternativo

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:

texto alternativo

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:

texto alternativo

Se você quiser explorar um dialeto realmente chique do Scheme, dê uma olhada no Racket.


Uau, bom post. Raquete é exatamente o que eu estou usando ... PLT-Scheme era o seu nome quando eu comecei a aprender. Essa linha vermelha no último gráfico me incomoda. Nunca pensei que Scheme pudesse ser usado tanto assim. E Clojure com certeza parece estar decolando. Hmm ...
Joanis

@M. Joanis: Pegue os dois últimos gráficos com um grão de sal; a aparência da escada e a volatilidade do último gráfico sugerem que não há muitos pontos de dados no gráfico, embora indique que alguém acha que vale a pena pagar pelos idiomas.
Robert Harvey

@ Robert Harvey, o que mudou do segundo para o terceiro gráfico?
systemovich 12/12/10

@ Geoffrey: Veja as legendas; Adicionei a palavra "desenvolvedor" aos termos de pesquisa.
Robert Harvey

Observe que Haskell e Lisp também são homônimos e que os dados do Indeed não são generalizados para o resto do mundo. O ITJobsWatch lista 79 trabalhos Scala, 55 F #, 47 Haskell, 30 Lisp e 7 Clojure.
quer

17

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.


Acho que você está certo ao escolher uma linguagem funcional pura primeiro. Eu estaria muito interessado em ver uma ordem de linguagens funcionais por pureza.
Joanis

@M. Joanis: dos idiomas listados em sua pergunta, eu diria que Haskell é o mais puro, seguido por Clojure, F # e Lisp.
Larry Coleman

15

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.


2
"A curiosidade criará uma carreira mais duradoura e gratificante do que qualquer outra coisa." Esta afirmação é muito inspiradora. Você está certo. Eu estou muito apressado. Eu sempre sinto que tudo vai levar muito tempo para aprender ... Se eu pudesse voltar 12 anos atrás, quando comecei, eu 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 os idiomas que eu conhecia era suficiente. Naquela época, pensei que estava sabendo de uma quantidade razoável, mas que de maneira tão horrível não era esse.
Joanis

10

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


O fato de F # e Clojure não serem puramente funcionais desempenha um papel importante a seu favor. Talvez F # poderia ser o meu ponto de entrada no dia da família .Net ...
Joanis

11
@MJoanis, você declarou o custo como um ponto contra o F #, mas como Erik aponta, você pode obtê-lo completamente de graça.
Benjol

Se eu li os termos corretamente, você basicamente o obtém gratuitamente, com a 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 usando o Visual Studio. Provavelmente tentarei quando estiver funcional com uma linguagem de programação funcional mais gratuita.
Joanis

11
@M. Joanis: Não, o F # é de código aberto e você pode tentar encontrar o Mono em outras plataformas.
quer

Talvez os tempos tenham mudado desde 2010, mas como alguém que começou a aprender haskell nos últimos meses, não acho que fazer E / S em haskell seja difícil. Para coisas básicas, você só precisa aprender algumas novas sintaxas do tipo. Obter o entendimento fundamental real leva algumas semanas no máximo, mas eu realmente não vejo o que há sobre as mônadas. Eu não acho que eles foram mais difíceis de aprender do que aulas, instâncias, membros estáticos e todo o jazz relacionado ao estado no OOP.
Sara

9

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!


11
Obrigado! Ótimo post! Hoje, eu estava pensando em usá-lo para um projeto interno da empresa que será fortemente baseado em árvores e recursividade. Além disso, temos bastante código Java por aqui que podemos reutilizar com o Clojure.
Joanis

6

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.


Obrigado pelo link TIOBE, que é uma referência interessante. Eu acho que você está escolhendo Haskell por sua pureza em termos de programação funcional?
Joanis

11
@ M.Joanis: Praticamente, embora eu esteja pensando em pegar o Lisp também. Veja programmers.stackexchange.com/questions/18838/…
Zeke

A resposta escolhida faz muito sentido. A pureza parece ser o caminho a percorrer até que eu realmente tenha entendido toda a coisa do paradigma funcional.
Joanis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.