Haskell (linguagem de programação): diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
m v1.43b - Corrigido usando WP:PCW (Cabeçalho termina com dois pontos)
m Atualização da página da linguagem Haskell
Linha 43:
 
A linguagem continua evoluindo, sendo as implementações [[Hugs]] e [[Glasgow Haskell Compiler|GHC]] consideradas os padrões ''[[de facto]]''. A partir de 2006 começou o processo de definição de um sucessor do padrão 98, conhecido informalmente por Haskell′ ("Haskell Prime").<ref>{{citar web|url=http://haskell.org/haskellwiki/Future|titulo=Future development of Haskell|publicado=Sítio oficial|acessodata=29 de setembro de 2008|lingua=inglês}}</ref>
 
=== Haskell 1.0 até 1.4 ===
A primeira versão do Haskell (“Haskell 1.0”) foi definido em 1990. Os esforços do comitê resultaram em uma série de definições da linguagem (1.0, 1.1, 1.2, 1.3 e 1.4).
 
=== Haskell 98 ===
No final de 1997, as séries culminaram em Haskell 98, com a intenção de especificar uma versão mais estável e portátil da linguagem acompanhada de uma biblioteca padrão para ensino, e como base para extensões futuras. O comitê expressou satisfação em criar extensões e variantes de Haskell 98 a partir da adição e incorporação de atributos experimentais.
 
Em fevereiro de 1999, o padrão da linguagem foi originalmente publicado em um relatório chamado de The Haskell 98 Report. Em janeiro de 2003, uma versão revisada foi publicada como Haskell 98 Language and Libraries: The Revised Report. A linguagem continuou a evoluir rapidamente, com a implementação do Compilador Glascow Haskell representando o padrão atual.
 
=== Haskell 2010 ===
No começo de 2006, o processo de definir um sucessor para o padrão Haskell 98, informalmente chamado de Haskell Prime, começou. A intenção era de ser um processo incremental para revisar a definição da linguagem, produzindo uma revisão nova anualmente. A primeira revisão, chamada de Haskell 2010, foi anunciada em novembro de 2009, e publicado em julho de 2010.
 
Haskell 2010 é uma atualização incremental da linguagem, incorporando atributos muito utilizados e não controversos previamente ativados por bandeiras específicas do compilador.
 
* Módulos hierárquicos. Módulos consistem de sequências de identificadores em maiúsculo separadas por pontos, ao invés de apenas um identificador. Dessa maneira é possível nomear os módulos de maneira hierárquica (Data.List ao invés de List), apesar de que módulos técnicos ainda estão em um espaço monolítico. Essa extensão foi especificada como um adendo do Haskell 98 e na prática foi universalmente usado.
* A interface de função estrangeira (FFI), permite ligações para outras linguagens de programação. Apenas ligações para C são especificadas no relatório, mas o design permite para outras ligações de linguagens. Para suportar isso, declarações de tipos de dados não permitem conter construtores, admitindo tipos para dados estrangeiros que não podem ser feitos em Haskell. Essa extensão foi previamente especificada no adendo do relatório de Haskell 98 e vastamente utilizado.
* Os chamados padrões n+k (definições da forma fact (n+1) = (n+1) * fact n) não são mais permitidos. Esta sintaxe enganava a semântica, onde no código parecia ter sido usado o operador (+), na realidade utilizava-se (-) e (>=).
* As regras de inferência de tipo foram afrouxadas para permitir que mais programas chequem o tipo.
* Alguns assuntos da sintaxe (mudança na gramática formal) foram corrigidos: proteções de padrões foram adicionadas, permitindo correspondências entre padrões e proteções; a ordem de operações matemáticas foi especificada de uma maneira mais simples do que na prática; um caso na interação de operadores e comentários da sintaxe léxica da linguagem foi endereçada; e a interação da notação do e if-then-else foi ajustada para eliminar erros inesperados de sintaxe.
* A diretriz da linguagem foi especificada. Por volta de 2010, dúzias de extensões da linguagem estavam sendo vastamente utilizadas, e GHC (entre outros compiladores) permitiram a diretriz especificar extensões com uma lista de identificadores. Compiladores de Haskell 2010 necessitavam da extensão Haskell2010, e eram encorajadas a suportar outras várias que correspondiam a extensões adicionadas no Haskell 2010.
 
== Características ==
Linha 179 ⟶ 199:
Os pontos fortes da linguagem Haskell têm sido bem aplicados em alguns projetos. É cada vez mais utilizada em aplicações comerciais.<ref>{{citar web|url=http://www.haskell.org/haskellwiki/Haskell_in_industry|título=Haskell in Industry}}</ref> O compilador e interpretador [[Pugs]] criado por [[Audrey Tang]] é uma versão completa da linguagem [[Perl 6]]. [[Darcs]] é um sistema de controle de versões baseado em mudanças (change-based) com várias características inovadoras. A [[Linspire]] GNU / Linux escolheu Haskell para desenvolvimento das ferramentas do sistema .<ref>{{citar web|url=http://urchin.earth.li/pipermail/debian-haskell/2006-May/000169.html|título=Linspire/Freespire Core OS Team and Haskell|obra=Debian Haskell mailing list|ano=2006|month=May}}</ref> [[Xmonad]] é um gerenciador de janelas "tile-based" para o [[X Window System]] escrito inteiramente em Haskell. [[Bluespec SystemVerilog]] é uma linguagem feita como uma extensão do Haskell.
 
* Darcs é um sistema de controle de revisão escrito em Haskell, com vários atributos inovadores, como mais precisão no controle de patches.
* Cabal é uma ferramenta para a construção e empacotamento das bibliotecas e programas em Haskell.
* Linspire GNU/Linux escolheu Haskell para o desenvolvimento de ferramentas de sistema.
* Xmonad é um administrador de janelas para o X Window System, escrito completamente em Haskell.
* Git-annex é uma ferramenta para administrar (grandes) arquivos de dado sob o controle de versão do Git. Provém também um sistema distribuído de sincronização de arquivo (assistente do git-annex).
* GHC é geralmente utilizado como teste para funções avançadas de programação funcional e otimização em outras linguagens de programação.
* Pandoc é uma ferramenta de conversão de formato de marcação em outra.
* O sistema de compilação The Shake aspira em ser confiável, robusto e rápido.
* ShellCheck – uma ferramenta de análise estática de shell script.
 
<br />
 
==== '''Indústria''' ====
 
* Facebook implementa seus programas anti-spam em Haskell, como um software de código aberto.
* Swift Navigation, um fabricante de GPS de alta precisão, implementa porções significantes de seus produtos em Haskell, gerando alguns softwares de código aberto.
* Bluespec SystemVerilog (BSV) é uma linguagem para design de semicondutores que possui uma extensão em Haskell. Além disso, as ferramentas da Bluespec Inc. são implementadas em Haskell.
* Cryptol, uma linguagem e ferramenta para desenvolver e verificar algoritmos de criptografia, é implementada em Haskell.
* seL4, o primeiro microkernel formalmente verificado, usou Haskell como protótipo de linguagem para o desenvolvedor de SO. Ao mesmo tempo, o código em Haskell definiu uma  especificação executável para a tradução automática pela ferramenta de demonstração de teoremas. O código em Haskell serviu também como um protótipo intermediário antes do refinamento final de C.
 
<br />
 
==== Web ====
Frameworks de web em Haskell existem, incluindo:
 
* Yesod
* Snap
* Miso
 
<br />
== Exemplos ==
O difundido caso do [[Programa Olá Mundo]] pode ser exemplificado em Haskell da seguinte forma:
Linha 279 ⟶ 329:
|acessodata=1 de maio de 2011
}}</ref> é um novo dialeto do Haskell. O foco é na facilidade de aprendizado. Atualmente carece de ''typeclasses'', tornando-o incompatível com muitos programas Haskell.
 
<br />
 
== Crítica ==
Jan-Wilem Maessen, em 2002, e Simon Peyton Jones, em 2003, discutiram problemas relacionados à avaliação preguiçosa, enquanto estudavam motivos teóricos para isso. Além de considerações práticas como melhor performance, eles perceberam que, além da sobrecarga de desempenho, a avaliação preguiçosa deixava mais difícil para os programadores considerarem o desempenho do código (particularmente o uso de espaço).
 
Bastiaan Heeren, Daan Leijen e Arjan van IJzendoorn em 2003, observaram alguns obstáculos para quem quer aprender Haskell: “ a sutil sintaxe e o sofisticado sistema de tipos de Haskell são uma faca de 2 gumes – extremamente apreciada por programadores experientes, mas também uma fonte de frustação entre iniciantes, já que em geral a linguagem Haskell leva a mensagens de erro enigmáticas”. Para resolver isso, pesquisadores da Universidade de Utrecht desenvolveram um interpretador moderno chamado de Helium, que facilitou o entendimento das mensagens de erro limitando a generalidade de algumas funções, em particular remover o suporte para classes.
 
Bem Lippmeier criou o Disciple como um dialeto estrito por padrão (preguiçosa por notação explícita) de Haskell com um sistema de tipo-e-efeito para resolver dificuldades da avaliação preguiçosa e em usar estruturas de dados tradicionais como arrays mutáveis. Ele discute que “atualizações destrutivas fornecem ao programador 2 ferramentas importantes e poderosas [...] um conjunto de estruturas de dados eficientes parecidos com array para administrar coleções de objetos, e [...] a habilidade de transmitir um novo valor para todas as partes do programa com carga mínima no programador”.
 
Robert Harper, um dos autores do Standard ML, deu razões para não usar Haskell como linguagem para programação introdutória. Entre essas razões estão: a dificuldade de discorrer sobre recursos com avaliação não-estrita, a avaliação preguiçosa complica a definição de tipos de dados e raciocínio induzido e a “inferioridade” do (antigo) sistema de classe do Haskell comparado com o sistema de módulos do ML.
 
Foi constantemente criticado por desenvolvedores por causa da falta de boa administração de diferentes versões da mesma biblioteca pela ferramenta padrão de construção, Cabal. Foi resolvido pelo lançamento do Stack, que administra o Cabal, para fazer o trabalho na construção.
<br />
 
== Linguagens relacionadas ==
Clean é um relativo mais próximo e antigo do Haskell. Esse desvio se dá devido aos tipos únicos ao invés do E/S e seus efeitos colaterais.
 
Uma série de linguagens inspiradas pelo Haskell, mas com sistemas de diferentes tipos, foram desenvolvidas, incluindo:
 
* Agda, uma linguagem funcional com tipos dependentes
* Idris, uma linguagem funcional de propósito geral com tipos dependentes, desenvolvido pela Universidade de St Andrews
* Epigram, uma linguagem funcional com tipos dependentes adequada para provar propriedades de programas
* Cayenne, com tipos dependentes
* Ωmega, compilador estrito
* Elm, uma linguagem funcional para criar apps de wb em front-end
 
Máquina Virtual de Java (JVM) baseado em:
 
* Frege, uma linguagem semelhante a Haskell, com tipos escalares de Java e com boa integração a Java.
* Jaskell, uma linguagem funcional de script que roda em JVM.
* Eta-lang, que tem como intenção ser um Haskell em JVM.
 
Outras linguagens relacionadas incluem:
 
* Curry, uma linguagem funcional/lógica baseada em Haskell
 
Haskell serviu como teste para muitas novas ideias em design de linguagem. Houve muitas variações de Haskell produzidas, explorando novas ideias de linguagem, incluindo:
 
* Haskell Paralelo:
** Da Universidade de Glascow, que suporta clusters de máquinas ou multiprocessadores únicos. Além disso Haskell é suporte para o paralelismo em Multiprocessadores Simétricos.
** Do MIT
 
* Haskell distribuída (antigamente Goffin) e Eden.
* Haskell ansioso, baseado em avaliações especulativas.
* Versões com orientação a objetos, como Haskell++ e Mondrian.
* Haskell genérico, uma versão de Haskell com suporte de tipo de sistema para programação genérica.
* O’Haskell, uma extensão de Haskell adicionando orientação a objetos e programação concorrente.
* Disciple, um dialeto estrito por padrão de Haskell que suporta atualizações destrutivas, esforços computacionais, tipo de projeções de campos direcionados e aspectos funcionais.
* Hume, uma linguagem funcional estrita para sistemas embarcados baseados em processos como autômatos sem estados sobre um tipo de tuplas de canais de caixa de correio de um elemento onde o estado é mantido pelo feedback nas caixas de correio, e uma descrição de mapeamento de saídas para canais como cabeamento de caixa, com uma linguagem de expressão e sintaxe semelhantes a Haskell.
 
== Leitura adicional ==