Perguntas de Entrevista sobre o Build System de Zig

Perguntas de Entrevista sobre o Build System de Zig

O build system de Zig é reconhecido como um dos mais elegantes e poderosos entre linguagens de sistemas. Diferente de Make, CMake ou Cargo, o build system de Zig é um programa Zig completo, permitindo lógica arbitrária de build sem linguagens adicionais. Entrevistadores testam esse conhecimento especialmente para posições de DevOps e infraestrutura.

Perguntas Fundamentais

Como funciona o build system de Zig?

O build system de Zig é baseado em build.zig, um arquivo Zig que define o grafo de build. É executado em tempo de compilação usando o compilador Zig como runtime. Comandos como zig build executam a função pub fn build() em build.zig.

pub fn build(b: *std.Build) void {
    const target = b.standardTargetOptions(.{});
    const optimize = b.standardOptimizeOption(.{});

    const exe = b.addExecutable(.{
        .name = "meu-app",
        .root_source_file = b.path("src/main.zig"),
        .target = target,
        .optimize = optimize,
    });
    b.installArtifact(exe);

    const run_cmd = b.addRunArtifact(exe);
    const run_step = b.step("run", "Executar o aplicativo");
    run_step.dependOn(&run_cmd.step);
}

Explique cross-compilation em Zig.

Zig pode compilar para qualquer target suportado sem toolchains adicionais. Basta especificar o target na linha de comando ou no build.zig:

zig build -Dtarget=aarch64-linux-gnu
zig build -Dtarget=x86_64-windows-msvc
zig build -Dtarget=wasm32-wasi

Isso é possível porque Zig inclui internamente os headers de libc para múltiplas plataformas e usa LLVM como backend. É especialmente valioso para embedded e DevOps.

Como integrar código C no build system?

const exe = b.addExecutable(.{ .name = "app", .root_source_file = b.path("src/main.zig") });
exe.addCSourceFiles(.{
    .files = &.{ "src/legacy.c", "src/utils.c" },
    .flags = &.{ "-Wall", "-O2" },
});
exe.linkLibC();
exe.addIncludePath(b.path("include"));

Zig pode compilar C e Zig no mesmo build, facilitando migração gradual de C para Zig. Veja interop com C para mais detalhes.

Como funciona o gerenciador de pacotes?

O package manager de Zig usa build.zig.zon para declarar dependências:

// build.zig.zon
.{
    .name = "meu-projeto",
    .version = "0.1.0",
    .dependencies = .{
        .httpz = .{
            .url = "https://github.com/...",
            .hash = "...",
        },
    },
}

E em build.zig, as dependências são importadas e linkadas ao build.

Perguntas Avançadas

Quais são os níveis de otimização e quando usar cada um?

  • Debug: Sem otimizações, símbolos de debug, safety checks ativados. Use durante desenvolvimento.
  • ReleaseSafe: Otimizações com safety checks mantidos. Bom para produção com diagnóstico.
  • ReleaseFast: Máxima performance, sem safety checks. Use quando performance é prioridade absoluta.
  • ReleaseSmall: Menor tamanho de binário. Ideal para embedded e WASM.

Como criar steps customizados no build?

const gen_step = b.addSystemCommand(&.{ "python3", "gen_code.py" });
exe.step.dependOn(&gen_step.step);

Steps customizados permitem integrar geradores de código, processadores de assets e qualquer ferramenta externa no pipeline de build.

Complemente com o estudo do ecossistema de build e pratique com projetos e tutoriais.

Continue aprendendo Zig

Explore mais tutoriais e artigos em português para dominar a linguagem Zig.