- 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
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...
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.
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...)
Comentários do Hacker News
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
O motivo de eu não conseguir abandonar C totalmente é por causa de cstring e ponteiros não liberados
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
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
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
Equipes grandes podem exigir isso, e ferramentas como o Visual Studio podem apenas emitir avisos, permitindo aprendizado gradual
Ou seja, você ativa durante o desenvolvimento e desativa na hora de distribuir, sem impacto em performance
Condições que precisam obrigatoriamente ser verificadas devem ser tratadas diretamente com código dentro da função
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
Pessoalmente, sinto falta de overloading de funções, parâmetros padrão e retorno de tupla
ResultouExpectedde Optional é confusoIsso deveria significar “T ou E”, não “T ou vazio”; o nome parece inadequado
Link para a documentação relacionada
Option<T>ouResult<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É um design que mantém o significado de C enquanto reduz a carga dos out params
Resultjá carrega o significado mais geral de valor de retorno, então pode causar confusãoPlaylist no YouTube
O que me impressionou foi que as três linguagens, em vez de competir, parecem compartilhar trade-offs e aprender umas com as outras
Em vez disso, adiciona recursos como macros e reflection
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
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
A barreira de entrada é baixa a ponto de dar para fazer um protótipo em um dia
É 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
Graças ao LLVM, ele pôde criar um compilador novo por conta própria
Uma variante de C usada sozinho pode funcionar bem, mas para colaborar com outros ou usar bibliotecas externas, é preciso uma linguagem comum
E é fofo e espirituoso chamarem exceções de “Excuses”
Principalmente o link para o Discord na navegação reforçou essa impressão