19 pontos por GN⁺ 2026-01-04 | 4 comentários | Compartilhar no WhatsApp
  • Uma linguagem evolutiva que herda a sintaxe e a semântica de C, reforçando segurança e usabilidade, mantendo um ambiente familiar para desenvolvedores de C
  • Compatibilidade completa com a ABI de C, permitindo integração imediata em projetos C/C++; há casos em que parte do código do vkQuake foi convertida para C3 e compilada com o compilador c3c
  • Sistema de módulos, sobrecarga de operadores, macros em tempo de compilação e outros recursos melhoram a estrutura do código e sua expressividade
  • Inclui recursos modernos como programação por contratos (Gradual Contracts), tratamento de erros com zero overhead e reflexão em tempo de execução e em tempo de compilação
  • No modo de depuração, fornece automaticamente verificações de segurança e stack traces detalhados, o que favorece a detecção de bugs e a estabilidade

Visão geral do C3

  • C3 é uma linguagem de programação desenvolvida com base na sintaxe (syntax) e na semântica (semantics) da linguagem C
    • O objetivo é evoluir a linguagem mantendo uma forma familiar para programadores de C
  • Suporta sobrecarga de operadores precisa e orientada a objetivos
    • Sem a estrutura complexa de sobrecarga do C++, é possível expressar naturalmente vetores, matrizes e operações com ponto fixo
  • Suporta programação por contratos, permitindo declarar restrições em tempo de execução e em tempo de compilação
    • Reforça a estabilidade do código e a consistência das especificações
  • Combina as vantagens do tratamento de erros baseado em Result com as de exceções (exception)
    • Oferece uma estrutura de gerenciamento de erros que se integra naturalmente ao código C
  • Suporta consulta de informações de tipo (type introspection) tanto em tempo de compilação quanto em tempo de execução
  • Assembly inline: é possível escrever assembly como código comum, sem strings nem restrições complexas
  • No modo de depuração, insere automaticamente verificações de limite (bound checks) e verificações de valor (value checks) em tempo de execução
  • A biblioteca padrão do C3 fornece por padrão stack traces detalhados em builds de depuração
    • Em vez de um simples “segmentation fault”, é possível identificar a localização exata do erro

Ergonomia e segurança

  • Com Optionals, oferece segurança no tratamento de erros e de null
  • Com a sintaxe defer, dá suporte à automação da limpeza de recursos
  • Com slices e foreach, permite iterações seguras
  • Com contracts baseados em comentários, é possível declarar restrições de código
  • No contexto @pool, oferece liberação automática de memória

Performance por padrão

  • É possível escrever diretamente vetores SIMD para controle em nível de hardware
  • Permite ajuste fino de desempenho com a escolha de diferentes alocadores de memória
  • Adota um design sem overhead para tratamento de erros
  • Aproveita tempos de compilação rápidos e otimizações do backend LLVM
  • Oferece assembly inline fácil de usar

Biblioteca padrão completa

  • Fornece estruturas de dados padrão, incluindo contêineres dinâmicos e strings
  • Garante portabilidade entre plataformas com abstrações multiplataforma
  • Quando necessário, permite acesso nativo à plataforma

Aproveite bibliotecas C ou C++ existentes

  • O C3 é totalmente compatível com a ABI de C, sem necessidade de tipos “compatíveis com C” nem declarações especiais de função
  • É possível linkar código C a partir do C3, e também linkar código C3 a partir de C

Módulos são simples

  • Sistema de módulos simples e intuitivo
    • As configurações padrão são sensatas e não atrapalham o fluxo de desenvolvimento
  • Fornece gerenciamento de namespaces por meio de módulos
  • Simplifica a estrutura de encapsulamento com controle explícito
  • Permite definir comportamentos compartilhados com interfaces
  • Oferece generic modules, que permitem implementar de forma simples e clara a criação de tipos genéricos
  • Suporta reutilização estrutural por meio de subtipagem de structs

Macros sem precisar de doutorado

  • É possível escrever macros em tempo de compilação em uma forma semelhante a funções comuns
  • Suporta macros com reconhecimento de tipo, que entendem as informações de tipo do código
  • Oferece geração de código mais clara e poderosa do que o pré-processador de C

4 comentários

 
kayws426 2026-01-06

Está saindo de várias formas. LONG LIVE C-LANG !!!
Mas, se no futuro surgir o c4, será que ele terá uma popularidade realmente explosiva...

 
bus710 2026-01-05

Como o Zig traz breaking changes todo ano, apesar de eu gostar da linguagem, acabei perdendo a vontade de mexer com ela. Por outro lado, vendo a apresentação do C3, no geral ele passa uma sensação de ser uma mistura de C + Go, fácil de ler e escrever, e parece que o estresse com upgrades de versão seria bem menor.

 
mhcoma 2026-01-05

Estou até apoiando financeiramente... comecei a usar recentemente e estou achando bem divertido.
Gosto dessa proposta de tentar melhorar só os pontos incômodos do C.
A documentação oficial ainda não está muito madura
(para descobrir certos recursos, muitas vezes a explicação aparece em lugares bem aleatórios...)

 
GN⁺ 2026-01-04
Comentários do Hacker News
  • Gosto da direção comedida da filosofia de design do C3
    Não força um novo modelo de memória, nem tenta virar C++
    Principalmente, graças à compatibilidade ABI completa, dá para misturar arquivos C3 diretamente em sistemas de build de C já existentes, sem precisar escrever bindings
    Aplaudo a visão do mantenedor, que busca evolução em vez de revolução
    Parece uma linguagem recomendável para aprender no fim de semana. É mais moderna que C99, mas ainda familiar
    • Fico curioso se dá para escrever uma biblioteca em C3 e exportar símbolos para usar em bindings
      O motivo de eu não conseguir abandonar C totalmente é por causa de cstring e ponteiros não liberados
    • Tenho dúvidas se compatibilidade ABI completa é realmente tão importante
      C em si não é exatamente uma linguagem perigosa; o que é perigoso são as implementações e a ABI
      Com fat pointers, melhorias em varargs, UBSan, MTE etc., fica bem razoável
  • Ao ler a seção de Contracts da documentação oficial do C3, fiquei com uma dúvida
    Se o compilador não precisa necessariamente verificar os contratos, e a violação pode virar comportamento indefinido, não sei muito bem como confiar nisso e usar
    É um recurso legal, mas parece um tanto arriscado
    • Contratos são invariantes que expressam “condições que devem ser sempre verdadeiras”
      Você pode ignorá-los, verificá-los em runtime, ou assumir que são sempre verdadeiros e usá-los para otimização
      Por exemplo, você pode verificar validade de ponteiro e tratar condição de entrada ímpar só como hipótese
    • Contratos são um meio de expressar intenção de forma padronizada
      Equipes grandes podem exigir isso, e ferramentas como o Visual Studio podem apenas emitir avisos, permitindo aprendizado gradual
    • As três frases da documentação significam, respectivamente:
      1. o compilador não precisa necessariamente usar os contratos
      2. a violação pode resultar em comportamento indefinido
      3. no modo seguro, isso é verificado com assert em runtime
        Ou seja, você ativa durante o desenvolvimento e desativa na hora de distribuir, sem impacto em performance
    • No fim, é uma forma de expressar explicitamente no código as otimizações baseadas em suposições que o compilador já faz
    • Entendo contratos como restrições suaves para expressar “condições que quase nunca deveriam ser alcançadas”
      Condições que precisam obrigatoriamente ser verificadas devem ser tratadas diretamente com código dentro da função
  • Há mais detalhes no repositório GitHub do C3
    Entre as diferenças em relação a C estão: sem arquivos de cabeçalho, namespaces baseados em módulos, slices, overloading de operadores, módulos genéricos, tratamento de erros baseado em Result e verificações em runtime no modo seguro
    • Os recursos são bons, mas a composição parece um pouco desequilibrada
      Pessoalmente, sinto falta de overloading de funções, parâmetros padrão e retorno de tupla
  • Em C3, chamar Result ou Expected de Optional é confuso
    Isso deveria significar “T ou E”, não “T ou vazio”; o nome parece inadequado
    Link para a documentação relacionada
    • O Optional do C3 é diferente de Option<T> ou Result<T, E>
      O tipo de erro é limitado a um único código inteiro, o que combina bem com a filosofia de “evolução, não revolução”
      A sintaxe type? também é intuitiva
    • A palavra “Optional” não é usada diretamente no código
      É um design que mantém o significado de C enquanto reduz a carga dos out params
    • Não gosto muito de renomear conceitos arbitrariamente, mas se só um dos dois for suportado, Optional é o nome mais claro
      Result já carrega o significado mais geral de valor de retorno, então pode causar confusão
    • Ainda assim, “Option” ou “Maybe” têm outro significado, então acho que “Result” ou “Either” seriam mais apropriados
  • Há um vídeo do Tsoding fazendo mais de 30 horas de livestream com C3
    Playlist no YouTube
  • Já interagi com os desenvolvedores de C3, Odin e Zig
    O que me impressionou foi que as três linguagens, em vez de competir, parecem compartilhar trade-offs e aprender umas com as outras
    • Fico curioso sobre qual linguagem é a mais razoável em ambientes embarcados
    • Dizem que é “aprendizado, não competição”, mas no fim penso se isso não é só uma competição educada na forma de se expressar
  • Ao folhear a documentação, duas dúvidas minhas foram resolvidas
    1. é baseado em LLVM, então tem alta portabilidade
    2. não oferece suporte a tagged enum
      Em vez disso, adiciona recursos como macros e reflection
    • Acho tagged union ineficiente em linguagens de sistema
      Ocupa memória conforme o maior tipo, e o fluxo acaba migrando para verificação de tipo em runtime, fazendo perder as vantagens de uma linguagem estaticamente tipada
      Na minha opinião, é melhor implementar isso manualmente quando necessário
  • Fico pensando em quando vale a pena criar uma linguagem nova
    Implementei generics, slices e propagação de erro diretamente em C, mas fazer compilador é complexo demais
    Por isso eu acabo conciliando uma variante de C com Go
    • Graças ao LLVM, é mais fácil do que parece criar linguagens da linha “C melhorado”
      A barreira de entrada é baixa a ponto de dar para fazer um protótipo em um dia
    • Criar uma linguagem sempre vale a pena
      É a única forma de transformar um novo paradigma em realidade
      Linguagem exige coordenar sintaxe, biblioteca padrão, tooling e runtime, então é difícil, mas justamente por isso o impacto no futuro é grande
    • O C3 começou como um projeto independente do Christoffer, que contribuía com o C2 e se frustrou com a lentidão do desenvolvimento
      Graças ao LLVM, ele pôde criar um compilador novo por conta própria
    • O valor de uma linguagem está em criar um entendimento compartilhado com outras pessoas
      Uma variante de C usada sozinho pode funcionar bem, mas para colaborar com outros ou usar bibliotecas externas, é preciso uma linguagem comum
  • No começo achei que seria uma linguagem simples, mas me surpreendi com a lista rica de recursos
    E é fofo e espirituoso chamarem exceções de “Excuses
  • Acho que esse tipo de site é um modelo de como um site de linguagem de programação deveria ser
    • Por outro lado, o design me pareceu infantil e amador
      Principalmente o link para o Discord na navegação reforçou essa impressão