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