Abe Estrada

Zig Cross Compiler

Hace poco conocí sobre Zig , por medio de una presentación de Uber en la cual explicaban como utilizaban el compilador de este lenguaje para C/C++, ya que tiene un modo de compatibilidad que permite compilar este lenguaje y es de menor tamaño que GCC .

Ejemplos:

C

hello.c
#include <stdio.h>
int main() {
  printf("Hello C");
  return 0;
}
zig cc -o hello hello.c -target x86_64-macos

C++

hello.cpp
#include <iostream>
using namespace std;
int main() {
  cout << "Hello C++" << endl;
  return 0;
}
zig c++ -o hello hello.cpp -target x86_64-macos

Zig

hello.zig
const std = @import("std");
pub fn main() !void {
  const stdout = std.io.getStdOut().writer();
  try stdout.print("Hello, {s}!", .{"zig"});
}
zig build-exe hello.zig

WebAssembly

math.zig
extern fn print(i32) void;
export fn add(a: i32, b: i32) void {
  print(a + b);
}
zig build-lib math.zig -target wasm32-freestanding -dynamic
test.js
const fs = require("fs");
const source = fs.readFileSync("./math.wasm");
const typedArray = new Uint8Array(source);
WebAssembly.instantiate(typedArray, {
  env: {
    print: (result) => {
      console.log(`The result is ${result}`);
    },
  },
}).then((result) => {
  const add = result.instance.exports.add;
  add(1, 2);
});
node test.js

Todo esto, me ha abierto un poco el panorama y acercarme más a WASM y ver que opciones existen actualmente para funciones que estan limitadas en JavaScript, como por ejemplo con ZBar , una librería que permite la lectura de códigos de barras por medio de la webcam y que una vez compilada con webassembly, es posible utilizarla en el navegador ZBar.wasm .