![Pré-visualização do WASI 0.2: um novo amanhecer para WebAssembly](https://optimuscloud.com.br/wp-content/uploads/2024/01/1706318345_Pre-visualizacao-do-WASI-02-um-novo-amanhecer-para-WebAssembly-150x150.png)
Pré-visualização do WASI 0.2: um novo amanhecer para WebAssembly
26 de janeiro de 2024![Como planejar sua atualização do MongoDB](https://optimuscloud.com.br/wp-content/uploads/2024/01/Como-planejar-sua-atualizacao-do-MongoDB-150x150.jpg)
Como planejar sua atualização do MongoDB
29 de janeiro de 2024Faz muito tempo que não uso C. No início dos meus dias de computação, eu via código de máquina em um austero computador escolar. Quando meus amigos escreveram seus primeiros jogos de 8 bits, eles usaram linguagem assembly. Depois de um pouco de BASIC, passei para C. (e depois para C++)
Zig é o novo C. Mas como você pode ter pouca ou nenhuma utilidade para o que hoje é uma linguagem de baixo nível, este post apenas vislumbra o mundo que existe mais próximo do metal. O conselho geral para desenvolvedores é aprender bem uma linguagem, mas compreender os padrões e estruturas que permitirão que você adote qualquer linguagem que precisar.
Zig se descreve como uma “linguagem de programação de uso geral e conjunto de ferramentas para manter software robusto, ideal e reutilizável”. Quando usamos o termo nível baixo linguagem, significa apenas que você está a menos abstrações da manipulação de números hexadecimais diretamente nos registros. Eles estão mais intimamente ligados ao modo como um computador realmente funciona a cada momento. E não existem ‘objetos’.
Uma linguagem de baixo nível é necessariamente rápida e provavelmente pequena – por outro lado, linguagens de nível superior são sobrecarregadas de gerenciamento interno para torná-las mais fáceis de usar. Se a velocidade ou o tamanho são importantes para você, então você deve ir para um nível baixo. Muitos dispositivos são tecnicamente “programáveis”, mas não podem conter sistemas operacionais completos. Em algum momento de sua carreira, você pode precisar inserir bits em um dispositivo que não pode programar com Java. O inventor do Zig, Andrew Kelley, estava tentando trabalhar com dispositivos de áudio em um estúdio de música e percebeu que teria que reescrever bibliotecas C para adicionar recursos que achava necessários.
Linguagens de baixo nível não cuidam do gerenciamento de memória para você. Isso agora é um pouco como um Rubicão, já que muitos desenvolvedores nunca tiveram que alocar e liberar sua própria memória. O comportamento não confiável dos coletores de lixo, por outro lado, é considerado pelos programadores de baixo nível um bom exemplo de estorvo. E claro, C não é “orientado a objetos”, então nos referimos a isso funçõesnão métodos.
Zig é uma cadeia de construção completa e também um compilador C. As bibliotecas C estão abaixo de muitas outras linguagens, portanto o alto grau de interoperabilidade do Zig com C e C++ aumentará sua popularidade. Podemos ver isso imediatamente.
Testando Zig
Instalei o Zig pela primeira vez no meu confiável Mac:
> brew install zig
Se Zig for de fato um compilador C, então devo ser capaz de construir o bom e velho código C. O “olá mundo” oficial para C é este:
#include <stdio.h> int main(int argc, char **argv) { printf("Hello worldn"); return 0; }
Então você usa o principal função para definir o ‘ponto de entrada’ para o executável. Os parâmetros incluem o número de argumentos (contagem) e um ponteiro para o conjunto de argumentos da linha de comando. Na parte superior, colocamos um cabeçalho que faz referência aos comandos io padrão, como imprimir.
Para relembrar rapidamente, se eu quiser criar um executável que possa ser executado no meu Mac, minha cadeia de construção segue estas etapas:
![](https://optimuscloud.com.br/wp-content/uploads/2024/01/Introducao-a-Zig-um-potencial-herdeiro-de-C.png)
Compilando um arquivo C
- Meu código C atende ao pré-processador, que adiciona o código dos arquivos de cabeçalho (aqueles com o sufixo .h), remove comentários e geralmente garante que você fique com código simples.
- O compilador então transforma o código C em linguagem assembly ou em um equivalente intermediário.
- O montador então cria “código objeto” ou binário. Agora estamos nos aproximando.
- Finalmente, o vinculador traz todo o código da biblioteca necessário para realmente fazer algo útil em minha máquina.
E, de fato, Zig construiu meu executável C:
(Ignore o tempo que levou para construir – meu Mac tem quase uma década). Zig afirma ser mais rápido que C, mas esses tipos de afirmações são melhor examinados com melhores detalhes técnicos para a área que você precisa.
OK, esse é C. Mas e o “olá mundo” para Zig?
const std = @import("std"); pub fn main() void { std.debug.print("Hello, world!n", .{}); }
OK, isso parece mais moderno. Importamos algum tipo de referência para uma biblioteca ‘std’, que usamos diretamente. O principal é uma função pública que não retorna nada. Eu acho’. {}’ significa que não há argumentos extras. E essa função de depuração na biblioteca padrão provavelmente permite o uso do console. Então vamos construir:
Sim, apenas substituiu minha versão C do Olá.
Mas aqui está o legal. Sem ferramentas extras, posso fazer compilação cruzada para, digamos, Windows:
Isso é uma coisa e tanto. Como descreve Zig, “a compilação cruzada é um caso de uso de primeira classe”. (Não testei este arquivo em uma máquina Windows, então YMMV.)
Mas vamos dar uma olhada no que mais o Zig está oferecendo.
Teste e construção de segurança
Zig entende que depurar código de baixo nível é traiçoeiro, por isso tem várias maneiras de combater isso. Zig vem com um executor de teste e um bloco de teste integrados. Isso lhe dá a chance de isolar áreas de preocupação:
const std = @import("std"); test "expect addOne adds one to 41" { try std.testing.expect(addOne(41) == 42); } fn addOne(number: i32) i32 { return number + 1; }
Isso funciona assim:
Temos um vislumbre da declaração de variáveis: o Adicione um função espera um número inteiro de 32 bits e emite um em troca.
Zig define quatro sinalizadores de construção:
- O Debug padrão. Isso compila rapidamente e permite verificações de segurança, sacrificando a velocidade e o tamanho pela conveniência do teste.
- Liberação rápida. Isso otimiza a velocidade, mas sacrifica a velocidade e o tamanho da compilação.
- LiberarSeguro. Para testes ao vivo, isso mantém as verificações de segurança ativadas.
- LançamentoPequeno. Mantém o binário pequeno.
Naturalmente, uma mensagem de erro em tempo de compilação é consideravelmente melhor de receber em comparação com o “comportamento indefinido” de uma compilação com as rodinhas desligadas.
Você se lembra? Porque Zig não
O motivo pelo qual você não está usando C no momento tem a ver principalmente com a falta de gerenciamento de memória, como já mencionei. Linguagens de baixo nível não possuem coleta de lixo e deixam você fazer a limpeza. Ou acidente. No entanto, Zig fornece adiar como uma cápsula de fuga para consertar as coisas se elas derem errado:
const std = @import("std"); const expect = std.testing.expect; test "allocation" { const allocator = std.heap.page_allocator; const memory = try allocator.alloc(u8, 100); defer allocator.free(memory); try expect(memory.len == 100); try expect(@TypeOf(memory) == ()u8); }
Então, para começar, estamos pedindo para alocar uma página de memória diretamente da pilha. Então o alocar função tenta reservar um array de 100 inteiros de 8 bits sem sinal (u8). Como isso está em um bloco de teste, podemos verificar se o array tem realmente 100 comprimentos e se é realmente do tipo u8.
A instrução defer é executada imediatamente após o término do escopo atual, porém ele termina. Portanto, aconteça o que acontecer com a nossa alocação, a memória será limpa. Se, em vez disso, a linha defer fosse executada imediatamente a partir de sua posição no código, todos os testes falhariam. Mas eles não o fazem.
Corrida para o fundo
Então Zig está, por assim dizer, tentando vencer a corrida até o fundo, para ser a nova base da computação. O herdeiro de C. Também tenta ser mais simples (com menos palavras-chave) e uma plataforma mais segura. A comparação oculta que pareço estar fazendo é com Ferrugem, mas provavelmente já têm públicos diferentes. Assim como Rust, Zig tem uma comunidade de colaboradores muito ativa, então já tem futuro garantido. Mas cuidado: a simplicidade é bastante difícil.
O post Introdução ao Zig, um potencial herdeiro de C apareceu pela primeira vez em The New Stack.