Apresentado linguagem de programação Solod (So), que fornece um subconjunto da linguagem Go, transcompilável para uma representação em linguagem C (C11), adequada para compilação por compiladores GCC, Clang e zig cc. A principal diferença do Solod em relação ao Go é o uso de gerenciamento manual de memória, funcionando sem coletor de lixo, sem alocação automática de memória e sem contagem de referências. O transpilador para Solod é escrito em Go e é distribuído sob a licença BSD. Suporta operações em Linux, macOS e Windows.
A linguagem suporta estruturas, métodos, interfaces, slices, retorno de funções com múltiplos valores (por exemplo, resultado + código de erro), genéricos e chamadas adiadas (defer). Para simplificação, canais, corrotinas e closures não são suportados na linguagem. Durante o desenvolvimento em Solod, podem ser usados servidores LSP existentes, linters, ambientes de desenvolvimento integrados e editores de código que suportam a linguagem Go, além da ferramenta 'go test'.
O código escrito em Solod pode ser integrado a aplicativos em linguagem C (a linguagem C pode chamar funções em Solod e vice-versa) e não requer runtime. As principais áreas de aplicação incluem programação de sistemas com possibilidades próximas ao C, mas com uma sintaxe estilo Go e garantia de verificação de tipos. Solod também pode ser usado para portar bibliotecas Go para uso em projetos em C. Pacotes Go portados para a linguagem C incluem:
- strings
- io (antonz.org)
- bytes
- mem
- slices
e etc. Além de um conjunto as bibliotecas Go portadas podem ser utilizadas em programas escritos em Solod wrappers sobre a biblioteca padrão C libc.
Por padrão, toda a memória é alocada na pilha, mas através das funções Alloc / Free da biblioteca padrão, é possível alocar memória na heap. A coleta de lixo e a contagem de referências não são usadas, mas em Solod são fornecidas capacidades para verificação de tipos e falhas em caso de acesso fora dos limites do array. No entanto, não são realizadas verificações para evitar ponteiros pendentes (dangling pointers) e a falta de liberação de memória. O principal método para detectar problemas com a memória é citada a utilização do AddressSanitizer -fsanitize=address em compiladores modernos.
Em termos de desempenho, programas compilados em Solod são na maioria das vezes mais rápidos do que programas em Go:
- O desempenho das funções do pacote Byte é 1,5 vezes mais rápido com o mesmo consumo de memória;
- O trabalho com buffers de bytes é 1,3 vezes mais rápido na leitura e de 2 a 4 vezes na gravação;
- No pacote Map, a busca por chave inteira é 3,4 vezes mais rápida, mas a modificação das chaves é 1,6 vezes mais lenta;
- A busca por chaves de string está no mesmo nível da linguagem Go, mas a modificação é 1,5 vezes mais lenta;
- O parsing e a formatação de números inteiros são 2 vezes mais rápidos, e os de ponto flutuante — 1,5/1,2 vezes;
- As funções de string são 1,3 vezes mais rápidas, e a criação de strings é 2 a 4 vezes mais rápida com uma redução no consumo de memória de 10 a 20%.
Fonte: linux.org.ru
