1 pontos por GN⁺ 27 일 전 | 1 comentários | Compartilhar no WhatsApp
  • 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 List foi 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++
  • 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
  • Como direção futura de expansão, foi mencionado suporte a Rust
    • Foi dito que, quando Rust concluir o impl specialization parcial, será possível executar programas OCaml

Reações e discussões da comunidade

  • Testes de funcionalidade e feedback

    • redianthus perguntou se há suporte a tipos de dados recursivos não homogêneos
    • stedolan corrigiu um erro causado pela falta de implementação de %predint e confirmou que esse tipo funciona normalmente
  • Humor e reações

    • avsm deixou a piada: “Precisávamos de C--, mas veio C++, então vamos fazer um meio-termo com C#”
    • stedolan respondeu: “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

    • AdelKS sugeriu uma alternativa usando avaliação com constexpr em vez de templates
      • Compartilhou um exemplo de código que calcula primos em tempo de compilação e os inclui diretamente no binário
    • LoganDark respondeu de forma bem-humorada que “isso seria diversão pura”, explicando por que usar templates
  • Discussões adicionais

    • redianthus comentou que “agora C++ se tornou uma verdadeira linguagem funcional”
      • Destacando que estruturas de dados puramente funcionais do OCaml podem ser implementadas em C++
    • dzmitry-lahoda mencionou 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 → gera primes.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

 
GN⁺ 27 일 전
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, range e filter para evitar estouro de pilha
    Implementar 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

    • Em grande parte concordo, mas trechos como typedef I<((I<((n::val (p::val))>::val) != (I<0>::val))> res; são realmente truques de template em nível de magia
      Foi 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