- Flix é uma linguagem orientada a efeitos desenvolvida pela Aarhus University e pela comunidade open source, combinando programação funcional, imperativa e lógica em uma única linguagem
- Seu núcleo é um sistema de efeitos que trata efeitos colaterais no nível de tipos, aumentando modularidade e capacidade de raciocínio com rastreamento de pureza, efeitos definidos pelo usuário, handlers e múltiplas retomadas
- A superfície da linguagem é ampla, com tipos de dados algébricos, pattern matching, registros extensíveis, traits, tipos de kind superior, tipos e efeitos associados, concorrência estruturada, interoperabilidade com Java e até Datalog embutido
- A biblioteca padrão oferece mais de 3.100 funções e, com acesso ao ecossistema Java via Maven, busca ir além de uma linguagem apenas para pesquisa
- O compilador tem como alvo bytecode da JVM e possui arquitetura paralela e incremental, destacando ganho de velocidade de 5x–7x em máquinas com 24 núcleos e throughput de 60.159 lines/sec em Apple M2 Pro/OpenJDK 21
Direção da linguagem Flix
- Flix é uma linguagem orientada a efeitos baseada em princípios, que combina programação funcional, imperativa e lógica
- É desenvolvida pela Aarhus University e pela comunidade de contribuidores open source
- O sistema de efeitos modela explicitamente os efeitos colaterais e é um eixo central da linguagem de tipagem estática para ajudar na modularidade e no raciocínio sobre programas
- Com efeitos definidos pelo usuário e handlers, programadores podem implementar diretamente estruturas de controle
- Flix destaca como pontos fortes uma implementação madura entre linguagens orientadas a efeitos, uma biblioteca padrão ampla, documentação detalhada e suporte de ferramentas
Tipos, pureza e sistema de efeitos
- Flix oferece suporte aos elementos básicos da programação funcional, como tipos de dados algébricos e pattern matching
- Há suporte nativo a tuplas e registros, e os registros usam tipagem estrutural e podem ser estendidos
- O compilador rastreia com precisão a pureza de todas as expressões do programa
- Se uma expressão é pura, há garantia de que ela não possui efeitos colaterais e é referencialmente transparente
- Mesmo em funções de ordem superior, a pureza é rastreada com polimorfismo de efeitos
- Por exemplo, a pureza de
List.mapdepende da pureza da funçãofpassada como argumento
- Por exemplo, a pureza de
- Efeitos algébricos permitem efeitos definidos pelo usuário e handlers
- Flix oferece suporte em especial a multi-shot resumptions
- Handlers de efeitos são usados para aumentar o raciocínio sobre programas, a modularidade e a testabilidade
Mutação local baseada em regiões e reflexão de pureza
- Flix oferece suporte a mutação local baseada em regiões, permitindo usar estado mutável e operações destrutivas internamente, mas ainda fazer com que a função pareça pura externamente
- Isso é adequado para funções em que escrever com dados mutáveis é mais natural, ou para casos em que estruturas mutáveis são mais eficientes, como algoritmos de ordenação
- A reflexão de pureza é uma estrutura de metaprogramação em que funções de ordem superior inspecionam a pureza de seus argumentos e mudam o comportamento com base nisso
DelayList.mapalterna entre avaliação imediata e avaliação preguiçosa de acordo com a pureza da função argumento- Mesmo que a biblioteca use internamente avaliação preguiçosa ou paralela de forma seletiva, o significado do ponto de vista do cliente pode permanecer inalterado
Paralelismo, concorrência e abstração
- Flix facilita a avaliação paralela de código puro, e é possível escrever uma implementação paralela de
List.mapcom a construçãopar - A construção
parusa internamente VirtualThread leve - Há suporte a concorrência estruturada, de modo que threads criadas dentro de uma determinada região não podem sobreviver além do ciclo de vida dessa região
- No exemplo, duas threads são criadas dentro de uma nova região chamada
rc - O fluxo de controle não sai da região até que ambas as threads terminem
- No exemplo, duas threads são criadas dentro de uma nova região chamada
- Para abstrações de tipo que dão suporte a operações comuns, Flix usa traits
- O trait
Eqexpressa o conceito de igualdade e é usado em toda a biblioteca padrão
- O trait
- Tipos de kind superior permitem abstrair construtores de tipo
OptioneListimplementamFoldable- A biblioteca padrão inclui traits comuns como
Monoid,FunctoreFoldable
Tipos e efeitos associados, e for-yield
- Flix oferece suporte a tipos associados, permitindo que os tipos em assinaturas de instância dependam do tipo da instância
- O exemplo do trait
Collpermite que cada instância de coleção defina seu tipo de elemento por meio do tipo associadoElm
- O exemplo do trait
- Efeitos associados fazem com que o efeito de membros de trait dependa do tipo da instância
- Isso facilita abstrair, ao mesmo tempo, operações puras e com efeitos, assim como estruturas mutáveis e imutáveis
- Ao adicionar o efeito associado
Aefao traitColl, é possível incluir instâncias de coleções mutáveis
forM-yield é uma construção monádica semelhante aofor-comprehension do Scala e à notaçãododo Haskell- Trata-se de açúcar sintático para usar
pointeflatMapfornecidos pelo traitMonad
- Trata-se de açúcar sintático para usar
forAé uma expressão aplicativa baseada no traitApplicative- É uma construção que ajuda a escrever com facilidade código de tratamento de erros usando o tipo de dado
Validation[e, t]
- É uma construção que ajuda a escrever com facilidade código de tratamento de erros usando o tipo de dado
Interoperabilidade com Java e Datalog
- Flix oferece interoperabilidade com Java para reutilizar a Java Standard Library e código do ecossistema Java
- Isso inclui acesso ao ecossistema via Maven
- Há suporte a criação de objetos, chamadas de métodos, exceções e extensão de classes e interfaces
- O suporte embutido a Datalog é um dos recursos distintivos do Flix
- Datalog pode expressar de forma concisa vários problemas de ponto fixo, incluindo problemas de alcançabilidade em grafos
- Restrições Datalog são valores de primeira classe
- Podem ser passadas para funções ou retornadas por funções
- Podem ser armazenadas em estruturas de dados
- Podem ser compostas com outras restrições Datalog e resolvidas
- Isso permite expressar famílias de programas Datalog
- Flix também oferece suporte a restrições Datalog enriquecidas com semântica de reticulado
- Há um exemplo de cálculo da data de entrega de componentes e subcomponentes
- Um carro depende de chassi e motor, e só pode ser montado depois que a montagem de cada componente terminar
- Subcomponentes também podem depender de outros subcomponentes, então o problema é recursivo
- Restrições Datalog com semântica de reticulado são um dos recursos avançados do Flix e exigem conhecimento prévio de teoria de reticulados e ponto fixo
Biblioteca padrão e lista de recursos
- Flix inclui uma biblioteca padrão com mais de 3.100 funções
- O módulo
Listoferece mais de 100 funções - O trait
Foldableoferece mais de 47 funções - Toda a biblioteca pode ser explorada em api.flix.dev
- O módulo
- A lista de recursos inclui o seguinte
- Tipos de dados algébricos, pattern matching e funções de primeira classe
- Registros extensíveis e polimorfismo paramétrico
- Traits, tipos de kind superior, tipos e efeitos associados
- Polimorfismo de efeitos, subefeitos e reflexão de pureza
- Concorrência no estilo CSP, com canais com buffer e sem buffer
- Restrições Datalog de primeira classe e interoperabilidade com Java
- Tipos primitivos unboxed e sintaxe baseada em palavras-chave
forM,forAe expression holes- Compilação para bytecode da JVM e eliminação completa de tail calls
- Arquitetura de compilador resiliente e paralela, com erros fáceis de ler
Arquitetura do compilador e desempenho
- O compilador do Flix tem arquitetura resiliente, incremental e paralela
- Todas as fases do compilador são paralelas e podem aproveitar ganho de velocidade em cada etapa em máquinas com 24 núcleos
- Em máquinas multicore, é possível obter ganho de velocidade de 5x–7x
- Ao recompilar código já compilado na mesma instância do compilador, a compilação incremental pode trazer ganhos significativos
- Os números de desempenho, com base em Apple M2 Pro de 10 núcleos e OpenJDK 21, são os seguintes
- Throughput geral do compilador: 60.159 lines/sec
- Throughput apenas do frontend: 140.382 lines/sec
- Os comandos para reproduzir são
java -jar flix.jar Xperf --n 21ejava -jar flix.jar Xperf --frontend --n 21
- Esse desempenho foi alcançado mesmo com recursos de linguagem custosos, como inferência de tipos e efeitos, monomorfização e otimização de programa inteiro
- O desempenho do compilador é determinado principalmente pela performance da CPU e pela largura de banda de memória
Suporte ao Visual Studio Code e integração de ferramentas
- O compilador do Flix é integrado ao Visual Studio Code para oferecer um ambiente de desenvolvimento
- A extensão do VSCode usa o compilador real do Flix, então há uma correspondência 1:1 entre extensão e compilador
- Se o VSCode não reporta erro, então não há erro
- Quando não há erro, o VSCode não reporta erros falsos
- A extensão do VSCode oferece os seguintes recursos
- Destaque semântico de sintaxe
- Diagnóstico inline de erros do compilador
- Autocompletar durante a digitação, autocompletar com reconhecimento de contexto, autocompletar de instâncias de trait e preenchimento de holes baseado em tipos
- Snippets e inlay hints
- Hover exibindo o tipo e o efeito das expressões
- Ir para definição de funções, variáveis locais e enums
- Encontrar referências de funções, variáveis locais e enums, e encontrar implementações de traits
- Lista de símbolos de documento e de workspace
- Renomear variáveis locais e nomes de funções
- Executar
maine testes a partir do editor
- Flix embute muitas ferramentas diretamente no compilador
- OCaml usa
ocaml-lspcomo LSP,utopcomo REPL,dunecomo ferramenta de build eopamcomo gerenciador de pacotes - Haskell usa
HLScomo LSP,ghcicomo REPL,cabalestackcomo ferramenta de build e gerenciadores de pacotes, eHackagecomo repositório de pacotes - Flix fornece compilador, LSP, REPL, ferramenta de build e gerenciador de pacotes todos como
flix, e usa o GitHub como repositório de pacotes
- OCaml usa
Estado de desenvolvimento, alvo JVM e escala do projeto
- Flix é desenvolvido e mantido por pesquisadores de linguagens de programação da Aarhus University, na Dinamarca
- As instituições colaboradoras são a University of Waterloo, no Canadá, a University of Tubingen, na Alemanha, e a Copenhagen University, na Dinamarca
- A participação da comunidade global de contribuidores open source vem crescendo, e novas contribuições são bem-vindas
- As estatísticas do projeto são as seguintes
- Pull requests mesclados: mais de 4.900
- Issues resolvidas: mais de 3.100
- Contribuidores: mais de 70
- Base de código do compilador: mais de 272.000 linhas
- Flix tem a JVM como alvo
- A JVM conta com implementações open source e comerciais já consolidadas, como OpenJDK, J9, Azul e Graal
- Pode ser usada em Mac, Linux e Windows
- JVMs modernas oferecem vários coletores de lixo atualizados
- Há bom suporte a concorrência e paralelismo, incluindo threads leves no Java 21
- Há suporte de ferramentas, incluindo depuradores e profilers
- A integração com Maven dá acesso ao rico ecossistema de pacotes da plataforma Java
- O financiamento total é de 1,1 milhão de euros, ajudando a garantir a continuidade e a independência do projeto
Ainda não há comentários.