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 .