Novo backend em C++ para o compilador OCaml
(github.com/ocaml)- Foi proposto um novo backend com suporte à geração de código C++ para o compilador OCaml, complementando as limitações do backend existente em C
- O código convertido é escrito em estilo puramente funcional, sem estado mutável nem uso da biblioteca padrão, reimplementando parte do módulo
List - A execução requer um compilador C++ (
g++), com suporte a opções para remover o limite de profundidade de templates e passar argumentos - O desempenho varia conforme o compilador, e a aplicação de um algoritmo de crivo baseado em fila de prioridade melhorado aumenta a velocidade e a eficiência de memória
- A comunidade avalia isso como um experimento de combinação entre linguagem funcional e metaprogramação com templates, e também menciona possibilidade de expansão para Rust
Proposta de adição de backend em C++
- Foi proposto um patch para adicionar um backend em C++ ao compilador OCaml (
ocamlc)- É uma forma aprimorada do backend incremental em C já usado no runtime e na FFI
- Com o comando
ocamlc -incr-c primes.ml, é possível converter código OCaml em C++
- O código C++ convertido é escrito em estilo puramente funcional e não oferece suporte a estado mutável
- Por isso, não é possível usar a biblioteca padrão e, no exemplo, parte do módulo
Listfoi reimplementada de forma puramente funcional - A saída é representada como uma estrutura aninhada no formato
Cons<hd, tl>, usando uma estrutura separada para evitar conflito com o operador::do C++
- Por isso, não é possível usar a biblioteca padrão e, no exemplo, parte do módulo
- A execução requer um compilador C++ (
g++), e é possível passar argumentos com a opção-Dlimit=100- O resultado da execução é exibido no formato de mensagens de erro do compilador
- Em cálculos de grande porte, é possível remover o limite de profundidade de templates com a opção
-ftemplate-depth=999999
- O desempenho varia conforme o compilador
- O
g++leva cerca de 30 segundos para calcular primos até 10000, usando 11GiB de memória - O
clang++emite um aviso em menos de 1 segundo e depois encerra com erro de segmentação - Com a aplicação do algoritmo de crivo de O’Neill baseado em fila de prioridade, houve melhora para 8 segundos e 3.1GiB
- O
- Como direção futura de expansão, foi mencionado suporte a Rust
- Foi dito que, quando Rust concluir o
impl specializationparcial, será possível executar programas OCaml
- Foi dito que, quando Rust concluir o
Reações e discussões da comunidade
-
Testes de funcionalidade e feedback
redianthusperguntou se há suporte a tipos de dados recursivos não homogêneosstedolancorrigiu um erro causado pela falta de implementação de%predinte confirmou que esse tipo funciona normalmente
-
Humor e reações
avsmdeixou a piada: “Precisávamos de C--, mas veio C++, então vamos fazer um meio-termo com C#”stedolanrespondeu: “No ano que vem vou tentar os números complexos ℂ”- Muitas reações com emojis como 😂, ❤️ e 🚀 mostram a recepção positiva da comunidade
-
Propostas técnicas
AdelKSsugeriu uma alternativa usando avaliação comconstexprem vez de templates- Compartilhou um exemplo de código que calcula primos em tempo de compilação e os inclui diretamente no binário
LoganDarkrespondeu de forma bem-humorada que “isso seria diversão pura”, explicando por que usar templates
-
Discussões adicionais
redianthuscomentou que “agora C++ se tornou uma verdadeira linguagem funcional”- Destacando que estruturas de dados puramente funcionais do OCaml podem ser implementadas em C++
dzmitry-lahodamencionou que já existe um projeto capaz de executar OCaml em Rust (contextgeneric/cgp)
Desempenho e exemplos de execução
- Exemplo básico: programa de cálculo de números primos
ocamlc -incr-c primes.ml→ geraprimes.cpp- Ao executar
g++ -Dlimit=100 primes.cpp, a lista de primos é exibida
-
Configuração de alto desempenho
g++ -ftemplate-depth=999999 -Dlimit=10000 primes.cpp- Cerca de 30 segundos, com uso de 11GiB de memória
-
Ao aplicar o algoritmo melhorado
- O desempenho melhora para 8 segundos e 3.1GiB
Conclusão
- Este PR é um experimento de novo backend que converte OCaml para C++, mostrando a possibilidade de combinar linguagens funcionais com metaprogramação por templates
- A comunidade o recebeu como um caso de união entre humor técnico e experimento criativo, reagindo de forma ativa
- Também foi apresentada a possibilidade de expansão para outras linguagens, como Rust
1 comentários
Comentários no Hacker News
Conteúdo realmente excelente. Quero dar uma dica ao escrever código C++ de longa execução
Estranhamente, interpretadores de C++ não têm tail call optimization nenhuma
Por isso, a maior parte do código C++ idiomático implementa diretamente funções como
reverse,map,rangeefilterpara evitar estouro de pilhaImplementar assim tornará a vida de quem for fazer manutenção muito mais fácil. É melhor usar uma abordagem portátil do que depender de flags de linha de comando
Ri ao ler a frase: “Ao usar essas estruturas de dados avançadas, o g++ calcula os primos abaixo de 10000 em apenas 8 segundos, usando só 3.1GiB de memória”
Finalmente ficou possível calcular números primos no meu notebook
Concordei muito quando li: “Este código é traduzido para um C++ idiomático e fácil de ler”
Como alguém que gosta de C++, acho que isso é mesmo código C++ agradável de ler
typedef I<((I<((n::val (p::val))>::val) != (I<0>::val))> res;são realmente truques de template em nível de magiaFoi a primeira vez que vi uma expressão condicional dentro de uma definição de tipo em C++
Depois percebi que isso não era código real, mas parte da lógica de avaliação de templates
Ou seja, parte da lógica do compilador de uma linguagem de alto nível foi, na prática, terceirizada para o mecanismo de templates
Essa abordagem talvez seja mais eficiente do que gastar mais tempo no parser
Por isso, agora estou pensando em usar C++ como alvo de lowering no framework de compilador elevate que estou desenvolvendo
Quando li a frase “C++ is a purely functional language”, no começo achei que fosse um erro de digitação e levantei a sobrancelha
Mas, ao descobrir que não era erro, fiquei ainda mais intrigado. O restante do texto também foi excelente
Este texto deixou meu dia mais feliz. Obrigado
Stephen Dolan realmente nunca decepciona. Sempre surpreende
Ao ler a parte “C++ é uma linguagem puramente funcional e não oferece suporte a estado mutável. Para executar um programa em C++, é necessário um interpretador de C++”
Por um instante, achei que fosse uma piada de 1º de abril. Mesmo já tendo passado abril