2 pontos por GN⁺ 2025-03-14 | 1 comentários | Compartilhar no WhatsApp
  • Estudou por 5 anos em uma escola de computação na França e atuou por 20 anos como desenvolvedor freelancer
  • Trabalhou principalmente em projetos de clientes com Ruby on Rails
  • Ao começar a aprender Common Lisp, escreveu um protocolo de administração de servidores que gera um parser ASN.1
    • Gerou código C a partir de Common Lisp para desenvolver um servidor SNMP
  • Depois disso, escreveu vários projetos baseados em Common Lisp:
    • cl-unix-cybernetics – projeto com mais estrelas no GitHub
    • Desenvolvimento de cl-streams e cffi-posix
    • cl-facts – um triple store que funciona como banco de dados de grafos em Common Lisp
      • Rápido, com transações atômicas e suporte a transações aninháveis
      • Compatível com unwind-protect
      • Pode ser usado aprendendo apenas 3 macros
      • Apresentado no European Lisp Symposium (ELS)
  • Ao se concentrar no desenvolvimento em Common Lisp, perdeu clientes, mas passou a ter uma forte convicção no potencial do Lisp

Limitações de máquinas virtuais (VMs) e contêineres

  • Especialistas apontam problemas em VMs e contêineres:
    • VMs desperdiçam CPU e largura de banda desnecessariamente
    • Contêineres Linux baseados em cgroups têm vulnerabilidades de execução remota de código (RCE) e elevação de privilégio
    • Novas vulnerabilidades de segurança são descobertas todos os anos
  • Ao preferir OpenBSD, evita problemas de ferramentas DevOps como Terraform e Ansible

Limitações do Common Lisp e problemas de desempenho

  • Em Clojure e outras linguagens, surgem problemas de desempenho por causa do GC (coletor de lixo):
    • Houve um caso de fracasso ao desenvolver um jogo de estratégia que processava milhares de unidades
    • O GC da JVM traz problemas de desempenho e custo

Decisão de migrar para C

  • Reconheceu os limites de desempenho e portabilidade do Common Lisp:
    • Linux, OpenBSD, GTK+ e GNOME são todos escritos em C
    • No fim, migrou para C para resolver os problemas de desempenho e portabilidade

Desenvolvimento da nova linguagem KC3

  • Desenvolvimento da biblioteca utilitária libc3 → linguagem C3 → renomeada para KC3
  • Características do KC3:
    • Possui interpretador (ic3) e compilador (c3c)
    • Cria estruturas de dados a partir de buffers UTF-8 e faz a conversão inversa
    • Programação defensiva → minimização de bugs desde o início
    • Sem problemas de segurança
    • Sistema de tipos baseado em unions com tag via enum

Resultados obtidos com KC3

  • Portou o cl-facts para C89:
    • Desenvolvimento concluído durante o período da Covid-19
    • Implementou adição de triplas, remoção, sistema de consultas recursivas, transações, logging, persistência etc.
  • Escreveu parser e gerador para tipos algorítmicos:
    • Inclui structs, listas ligadas, mapas, tabelas hash, números complexos, tuplas, blocos de código etc.
    • Recebeu grande inspiração de José Valim (criador do Elixir)
  • ikc3 – REPL que exibe o resultado da avaliação do KC3
  • kc3_httpd – desenvolvimento de um servidor web baseado em framework MVC
    • A página atual do blog também é servida por kc3_httpd
  • Criou um site de documentação → usando o conversor de Markdown para HTML do KC3

Conclusão

  • Migrou para C com base na experiência adquirida em Common Lisp
  • O KC3 apresenta excelentes resultados em desempenho, segurança e portabilidade
  • Pretende fornecer mais macros e exemplos relacionados ao KC3 no futuro

1 comentários

 
GN⁺ 2025-03-14
Comentários do Hacker News
  • Tenho a opinião contrária. Usei muito VB quando era jovem, depois aprendi Java, C e C++ na faculdade, e usei principalmente C.

    • Tornei-me desenvolvedor principal do Xfce e trabalhei nisso por 5 anos
    • Depois migrei para desenvolvimento backend e usei Java, Scala e Python. Essas linguagens trazem outros problemas, mas gostei da biblioteca padrão e dos sistemas de gerenciamento de dependências
    • Voltei ao Xfce 12 anos depois, e C continua difícil. Há muitos problemas como vazamentos de memória, dereferência de ponteiros NULL e condições de corrida
    • Ao usar Rust, fui mais produtivo do que com C
  • Concordo completamente com esse sentimento. Por alguns anos senti um forte impulso de desenvolver algo em C puro

    • Minha linguagem principal é C++, mas é realmente prazeroso usar bibliotecas antigas em C. As interfaces são simples e básicas
    • Quando desenvolvo métodos em C puro, gosto de poder me concentrar 100% no algoritmo
    • C me força a fazer o trabalho sozinho. Não esconde mágica nem complexidade
    • As pessoas ao meu redor tentam usar recursos modernos de C++, mas eu estou cada vez mais tentando remover recursos de C++
  • Comecei a programar em C há muito tempo e, ainda hoje, às vezes quero voltar àquela época

    • Mas quando realmente tento escrever uma aplicação de nível de produção em C, percebo por que parei
    • Há trabalho demais que você precisa fazer por conta própria, sem a ajuda do computador
    • Se eu tivesse de escolher uma linguagem de baixo nível hoje, provavelmente escolheria Ada. É parecida com C, mas com mais suporte do compilador
  • Depois de ler o post do blog, fiquei confuso sobre o que o autor estava tentando transmitir

    • Fiquei me perguntando se o motivo de o programa do autor não ser usado era realmente a linguagem
    • Pode haver problemas relacionados ao consumo de memória
    • O autor não mencionou lições aprendidas nem estatísticas de usuários
    • Nenhum recurso novo foi adicionado; parece que ele apenas reescreveu como exercício
  • Foi apresentado um exemplo de código do kc3

  • C foi minha primeira linguagem, e fiz apps simples de console e pequenos jogos

    • Mas não quero voltar. As ferramentas de build e o gerenciamento de dependências são antiquados
    • Zig é meu novo C. Ele inclui um compilador C e permite usar headers C sem wrappers
    • Uso Go quando preciso de uma linguagem simples, e Rust quando preciso de desempenho e segurança
  • Às vezes programo em C como hobby. Mas há trabalho repetitivo demais, e isso fica entediante

    • Escrever um compilador em C é como lidar com tagged unions
    • Pensei em escrever um gerador para reduzir o trabalho repetitivo, mas ainda não fiz isso
    • Ao desenvolver um projeto em C, considerei usar uma linguagem embutida para prototipagem
  • C foi bem-sucedida porque era prática

    • Não é segura, mas permite fazer o que você quiser
  • Não entendi nada

    • Fico me perguntando o que é o killer app, quais são os problemas relacionados ao CL e se C é realmente a única opção
    • Fico me perguntando se há mesmo certeza de que executar código KC3 não traz problemas de segurança
  • Este texto parece uma história de advertência sem final feliz