Linguagem de Programação PureScript
Pontos principais
- Linguagem puramente funcional e fortemente tipada que transpila para JavaScript, C++11, Erlang e Go.
- Criada por Phil Freeman em 2013 como alternativa a transpiladores de Haskell.
- Utiliza avaliação estrita (strict evaluation), diferindo da avaliação preguiçosa do Haskell.
- Suporta polimorfismo de linha e registros extensíveis.
O PureScript é uma linguagem de programação puramente funcional e fortemente tipada, projetada para ser transpilada principalmente para JavaScript, embora possua backends alternativos que permitem a geração de código em C++11, Erlang e Go. Devido a essa versatilidade, a linguagem é amplamente utilizada no desenvolvimento de aplicações web, aplicações de servidor e softwares de desktop (através de Electron ou compiladores C++11 e Go com bibliotecas adequadas).
Origens e Desenvolvimento
O PureScript foi concebido inicialmente por Phil Freeman em 2013. A motivação para a criação da linguagem surgiu da insatisfação de Freeman com as tentativas existentes de transpilar Haskell para JavaScript, como Fay, Haste ou GHCJS. Desde a sua criação, o projeto tornou-se aberto e é desenvolvido colaborativamente pela comunidade via GitHub.
Para apoiar o ecossistema da linguagem, a comunidade desenvolveu ferramentas essenciais, incluindo:
- Pulp: Uma ferramenta de build dedicada.
- Pursuit: Um diretório de documentação.
- Spago: O gerenciador de pacotes oficial.
Características Técnicas
O PureScript adota uma sintaxe fortemente inspirada em Haskell, mas diverge em pontos fundamentais de execução. Ao contrário do Haskell, que utiliza a avaliação preguiçosa (lazy evaluation), o PureScript é definido por uma estratégia de avaliação estrita (strict evaluation), embora existam backends não conformes que implementem a avaliação preguiçosa.
Sistema de Tipos e Estruturas
A linguagem oferece um sistema de tipos robusto que inclui:
- Inferência de tipos: Reduz a necessidade de anotações explícitas.
- Tipos de dados algébricos (ADTs) e Pattern Matching: Facilitam a definição de estruturas de dados complexas e a manipulação de fluxos de controle.
- Polimorfismo de linha (Row Polymorphism) e Registros Extensíveis: Recursos que permitem maior flexibilidade na manipulação de registros de dados.
- Tipos de alta ordem (Higher Kinded Types), Classes de Tipo e Polimorfismo de Alta Ordem: Recursos avançados de abstração comuns em linguagens funcionais.
É importante notar que o PureScript não suporta algumas funcionalidades avançadas do Haskell, como as Famílias de Tipos (Type Families) e os Tipos Algébricos Generalizados (GADTs).
Interoperabilidade e Ferramentas
Os transpiladores do PureScript são projetados para gerar código legível. A linguagem disponibiliza uma Interface de Função Estrangeira (FFI - Foreign Function Interface), que permite a reutilização de código existente em JavaScript, C++11 e Go, geralmente atuando como uma representação intermediária.
O desenvolvimento é otimizado por meio de compilação incremental e a existência de plugins para editores de texto populares, como Visual Studio Code, Vim, Emacs, Sublime Text e Atom. Além disso, a linguagem suporta o desenvolvimento orientado a tipos através do recurso de "buracos tipados" (typed holes), onde o programador deixa subexpressões ausentes e o transpilador infere os tipos necessários para preencher esses espaços, reportando-os ao usuário.
Licenciamento
O PureScript é um software livre e de código aberto, distribuído sob a Licença BSD de 3 cláusulas.
Perguntas frequentes
O que é o PureScript?
É uma linguagem de programação puramente funcional e fortemente tipada que transpila principalmente para JavaScript, permitindo a criação de aplicações web e de servidor.
Qual a diferença principal entre PureScript e Haskell?
Embora a sintaxe seja similar, o PureScript utiliza avaliação estrita (strict evaluation) por padrão, enquanto o Haskell utiliza avaliação preguiçosa (lazy evaluation).
O PureScript pode ser usado para criar apps desktop?
Sim, através do uso de Electron ou via compiladores para C++11 e Go com as bibliotecas apropriadas.
O que são 'typed holes' no PureScript?
É um recurso de desenvolvimento orientado a tipos que permite ao programador deixar lacunas no código; o compilador então infere e informa qual tipo de expressão é necessário para preencher aquela lacuna.