2 pontos por GN⁺ 2025-07-11 | Ainda não há comentários. | Compartilhar no WhatsApp
  • 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.map depende da pureza da função f passada como argumento
  • 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.map alterna 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.map com a construção par
  • A construção par usa 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
  • Para abstrações de tipo que dão suporte a operações comuns, Flix usa traits
    • O trait Eq expressa o conceito de igualdade e é usado em toda a biblioteca padrão
  • Tipos de kind superior permitem abstrair construtores de tipo
    • Option e List implementam Foldable
    • A biblioteca padrão inclui traits comuns como Monoid, Functor e Foldable

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 Coll permite que cada instância de coleção defina seu tipo de elemento por meio do tipo associado Elm
  • 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 Aef ao trait Coll, é possível incluir instâncias de coleções mutáveis
  • forM-yield é uma construção monádica semelhante ao for-comprehension do Scala e à notação do do Haskell
    • Trata-se de açúcar sintático para usar point e flatMap fornecidos pelo trait Monad
  • forA é uma expressão aplicativa baseada no trait Applicative
    • É uma construção que ajuda a escrever com facilidade código de tratamento de erros usando o tipo de dado Validation[e, t]

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 List oferece mais de 100 funções
    • O trait Foldable oferece mais de 47 funções
    • Toda a biblioteca pode ser explorada em api.flix.dev
  • 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, forA e 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 21 e java -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 main e testes a partir do editor
  • Flix embute muitas ferramentas diretamente no compilador
    • OCaml usa ocaml-lsp como LSP, utop como REPL, dune como ferramenta de build e opam como gerenciador de pacotes
    • Haskell usa HLS como LSP, ghci como REPL, cabal e stack como ferramenta de build e gerenciadores de pacotes, e Hackage como 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

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.

Ainda não há comentários.