Zig para Desenvolvimento Mobile (Android/iOS)

Zig para Desenvolvimento Mobile (Android/iOS)

Zig não é uma linguagem para desenvolvimento de UI mobile — Swift/Kotlin continuam ideais para isso. Mas Zig brilha como linguagem para componentes nativos compartilhados: engines de processamento, codecs, criptografia e lógica de negócio que precisa rodar com alta performance tanto no Android quanto no iOS.

Cross-Compilation para Plataformas Mobile

A compilação cruzada trivial de Zig é sua maior vantagem no mobile:

// build.zig — compilar biblioteca para Android e iOS
const std = @import("std");

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

    const mobile_targets = [_]struct {
        query: std.Target.Query,
        nome: []const u8,
    }{
        // Android
        .{ .query = .{ .cpu_arch = .aarch64, .os_tag = .linux, .abi = .android }, .nome = "android-arm64" },
        .{ .query = .{ .cpu_arch = .x86_64, .os_tag = .linux, .abi = .android }, .nome = "android-x86_64" },
        // iOS
        .{ .query = .{ .cpu_arch = .aarch64, .os_tag = .ios }, .nome = "ios-arm64" },
        // iOS Simulator
        .{ .query = .{ .cpu_arch = .x86_64, .os_tag = .ios }, .nome = "ios-simulator-x86_64" },
    };

    for (mobile_targets) |mt| {
        const target = b.resolveTargetQuery(mt.query);
        const lib = b.addSharedLibrary(.{
            .name = "minha_lib",
            .root_source_file = b.path("src/lib.zig"),
            .target = target,
            .optimize = optimize,
        });
        b.installArtifact(lib);
    }
}

Biblioteca Compartilhada para Mobile

// src/lib.zig — lógica compartilhada entre Android e iOS
const std = @import("std");

// API exportada com convenção C para interop
export fn calcularHash(dados: [*]const u8, len: usize) u64 {
    const slice = dados[0..len];
    return std.hash.Wyhash.hash(0, slice);
}

export fn comprimirDados(
    entrada: [*]const u8,
    entrada_len: usize,
    saida: [*]u8,
    saida_len: *usize,
) bool {
    const src = entrada[0..entrada_len];
    var dest = saida[0..saida_len.*];

    var stream = std.compress.zlib.compressor(.{}, std.io.fixedBufferStream(dest).writer());
    stream.writer().writeAll(src) catch return false;
    stream.finish() catch return false;

    saida_len.* = stream.bytesWritten();
    return true;
}

export fn validarCPF(cpf_ptr: [*]const u8, cpf_len: usize) bool {
    const cpf = cpf_ptr[0..cpf_len];
    if (cpf.len != 11) return false;

    // Verificar se todos os dígitos são iguais
    const primeiro = cpf[0];
    var todos_iguais = true;
    for (cpf[1..]) |c| {
        if (c != primeiro) { todos_iguais = false; break; }
    }
    if (todos_iguais) return false;

    // Calcular primeiro dígito verificador
    var soma: u32 = 0;
    for (0..9) |i| {
        soma += (cpf[i] - '0') * @as(u32, @intCast(10 - i));
    }
    var resto = (soma * 10) % 11;
    if (resto == 10) resto = 0;
    if (resto != cpf[9] - '0') return false;

    // Calcular segundo dígito verificador
    soma = 0;
    for (0..10) |i| {
        soma += (cpf[i] - '0') * @as(u32, @intCast(11 - i));
    }
    resto = (soma * 10) % 11;
    if (resto == 10) resto = 0;
    return resto == cpf[10] - '0';
}

Usando no Android (Kotlin via JNI)

class ZigLib {
    companion object {
        init { System.loadLibrary("minha_lib") }
    }
    external fun calcularHash(dados: ByteArray): Long
    external fun validarCPF(cpf: String): Boolean
}

// Uso
val hash = ZigLib().calcularHash("dados".toByteArray())
val valido = ZigLib().validarCPF("12345678909")

Usando no iOS (Swift)

// Bridging header
import Foundation

@_silgen_name("calcularHash")
func zigCalcHash(_ data: UnsafePointer<UInt8>, _ len: Int) -> UInt64

@_silgen_name("validarCPF")
func zigValidarCPF(_ cpf: UnsafePointer<UInt8>, _ len: Int) -> Bool

// Uso
let dados = "teste".data(using: .utf8)!
let hash = dados.withUnsafeBytes { zigCalcHash($0.baseAddress!, dados.count) }

Conclusão

Zig é excelente para bibliotecas nativas compartilhadas no mobile. A compilação cruzada trivial para ARM64, x86_64, Android e iOS permite manter uma única codebase de lógica de negócio e processamento de alta performance, reutilizada em ambas as plataformas.

Conteúdo Relacionado

Continue aprendendo Zig

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