Tecnologia

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.