Skip to content

Instantly share code, notes, and snippets.

@HiroNakamura
Last active June 13, 2023 00:34
Show Gist options
  • Save HiroNakamura/270b397fc47b3157481aab4ccecedef2 to your computer and use it in GitHub Desktop.
Save HiroNakamura/270b397fc47b3157481aab4ccecedef2 to your computer and use it in GitHub Desktop.
WebAssembly - Emscripten

WebAssembly

Emscripten

WebAssembly (abreviado Wasm) es un formato de instrucción binaria para una máquina virtual basada en pila. Wasm está diseñado como un objetivo de compilación portátil para lenguajes de programación, lo que permite la implementación en la web para aplicaciones de cliente y servidor.

Emscripten es una cadena de herramientas de compilación completa para WebAssembly, que utiliza LLVM, con un enfoque especial en la velocidad, el tamaño y la plataforma web.

Instalación y compilación

git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
git pull
./emsdk install latest
./emsdk activate latest
source ./emsdk_env.sh
emmc -v
emcc suma.c -o suma.html -s WASM=1

Enlaces

# C
gcc programa.c -o ejecutable.exe
# C++
g++ programa.cpp -o ejecutable.exe
# Emscripten
emcc main.c -o main.js
emcc suma.c -o suma.js
emcc counter.c -o counter.js
em++ holamundo.cpp -o holamundo.html
emcc fibonacci.c -o fibonacci.js -O2 -s WASM=1
# Con EMSCRIPTEN_KEEPALIVE
emcc fibonacci.c -o fibonacci.js -s WASM=1 -s EXTRA_EXPORTED_RUNTIME_METHODS='["cwrap"]'
emcc counter.c -s WASM=1 -s SIDE_MODULE=1 -o counter.wasm
emcc counter.c -O1 -o counter.wasm -s WASM=1 -s SIDE_MODULE=1
#include<stdio.h>
int count(void);
int counter = 100;
int count() {
counter += 1;
return counter;
}
int main(int argc, char const *argv[]){
puts("Contador: ");
printf("%d\n",count());
printf("%d\n",count());
return 0;
}
#include <stdio.h>
#include <emscripten.h>
int EMSCRIPTEN_KEEPALIVE fib(int n){
if(n == 0 || n == 1)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
int main(){
puts("Fibonnaci\n");
int res = fib(5);
printf("fib(5) = %d\n", res);
return 0;
}
#include<iostream>
int main(){
std::cout << "Hola, muchacho" << std::endl;
return 0;
}
<!DOCTYPE html>
<head>
<title>:: Prueba de WebAssembly ::</title>
<script type='module'>
/*try{
WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then(
(results) => {
window.alert(`Tipo: ${typeof(results)}`);
}
);
}catch(err){
window.alert(`Ha ocurrido un error: ${err}`);
}*/
</script>
</head>
<body>
<h3>Ejemplo de WASM!!</h3>
<script src="main.js"></script>
<script src="fibonacci.js"></script>
<script>
var js_wrapped_fib = Module.cwrap("fib", "number", ["number"]);
function pressBtn(){
console.log("El resultado de fib(5) es:", js_wrapped_fib(5));
}
</script>
<button onclick="pressBtn()">Obtener resultado</button>
<p>Abrir la consola para ver resultado</p>
</body>
</html>
#include <stdio.h>
#include <emscripten.h>
int main(){
printf("WASM esta funcionando!");
emscripten_run_script("alert('Estoy respondiendo a C!')");
return 0;
}
#include <stdio.h>
int main() {
printf("Bienvenidos a WebAssembly!\n");
return 0;
}
<!DOCTYPE html>
<html>
<head>
<META name="Author" content="Fernando Carraro Aguirre">
<meta charset="utf-8">
<title>Prueba de WASM</title>
</head>
<body>
<script type="module">
// import { program } from "./program.wasm";
WebAssembly.instantiateStreaming(fetch('/program.wasm'))
.then(wasm =>{
console.log(`WASM esta funcionando`);
});
</script>
</body>
</html>
#include<stdio.h>
// #include<emscripten.h>
/**
* @brief Suma de dos numeros
*
* @return int
*/
int suma(int,int);
// EMSCRIPTEN_KEEPALIVE
int suma(int x, int y){
return x+y;
}
// EMSCRIPTEN_KEEPALIVE
int main(int argc, char const *argv[]){
puts("\t[ Suma de dos numeros en C ]");
printf("Suma (8,3) = %d\n",suma(8,3));
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment