RUBY.WASM + WASI = Futuro?
Desde a primeira vez que ouvi falar sobre WASM (Web Assembly), achei a ideia muito interessante!
Pelas seguintes possibilidades:
- Imagine escrever o frontend em qualquer linguagem que você quiser!?
- Rodar jogos que foram feito em C/C++/C#, portando eles para o frontend, utilizando o código fonte!?
- Imagine compartilhar componentes entre frontend e backend, assim como é feito no Javascript!?
Tudo isso me encheu meus olhos, mas a minha imaginação é muito limitada, e mal podia esperar que além disso tudo agora também temos a possibilidade de rodar WASM no backend! Graças ao WASI, que de forma simplificada, fornece uma especificação da API de interface de sistema para programas WebAssembly, o que possibilitou a criação de runtimes para WASM tal como o WASMTIME.
Agora você deve estar se perguntando:
"Okay, podemos rodar WASM no backend... e o que ganhamos com isso?"
A primeira coisa que vem na minha cabeça, é que qualquer máquina que consiga rodar o runtime de WASM poderá rodar o programa (claro se ele tiver memoria para isso).
Ou seja, é possível que no futuro o Docker seja substituido por WASM!
Também será possível a interoperabilidade entre linguagens, visto que a maioria das linguagens já possuem um compilador WASM para ela. E sim, isso inclui o nosso Ruby ❤️
Hello WASM
Como o Ruby é uma linguagem interpretada, para rodarmos um código Ruby precisamos compilar o seu interpretador para WASM. Além disso o WASM também consegue "empacotar" outros arquivos dentro dele, sendo possível então já deixar as nossas GEMs instalada nesse intepretador.
Para testar a interoperabilidade entre sistema, vamos criar um código Ruby no ambiente Linux, e vamos apenas instalar o WASMTIME no ambiente Windows, e então veremos se tudo sairá como esperado.
1. INSTALAR WASMTIME
Primeiramente precisamos instalar o WASMTIME no Windows e no Linux:
- Para o Windows basta baixar e executar o instalador que está no site.
- Para o Linux execute:
curl https://wasmtime.dev/install.sh -sSf | bash
2. GEMFILE
Crie o seguinte arquivo Gemfile:
source 'https://rubygems.org'
gem 'ruby_wasm'
gem 'rainbow'
- ruby_wasm servirá para a gente buildar o nosso interpretador WASM
- rainbow irá colorir o nossos terminal, e servirá como PoC para o uso de GEMs no WASM.
Então vamos instalar as GEMs e gerar o arquivo Gemfile.lock através do comando:
bundle install
3. COMPILAR O INTERPRATADOR PARA WASM
Após criar o nosso arquivo Gemfile e instalar as GEMs, vamos agora compilar o nosso interpretador Ruby em WASM.
Para isso rode o seguinte comando:
bundle exec rbwasm build -o ruby.wasm
Irá demorar um pouco na primeira vez, pois ele irá compilar todo os arquivos.
(OBS.: Após isso é possível recompilar chamando o mesmo comando, e dessa vez será bem mais rápido!)
4. CRIAR O PROGRAMA RUBY
Se tudo ocorrer bem, você terá um arquivo chamado ruby.wasm e dois folders build e rubies.
Rode o seguinte comando para verificar se realmente o interpretador está funcionando:
$ wasmtime ruby.wasm -v
No meu caso que estou usando o ruby 3.3.3, esse foi o retorno:
ruby 3.3.3 (2024-06-12 revision f1c7b6f435) [wasm32-wasi]
Com nosso interpretador funcionando, podemos criar então nosso programa Ruby.
Para facilitar a organização, eu prefiro criar uma pasta chamada src.
Dentro dessa pasta iremos criar o programa Ruby app.rb
require 'rainbow'
puts Rainbow("Escrevendo arquivo: hello.txt").bg(:blue).bright
begin
File.write('hello.txt', '--- Hello WASM ---')
rescue
puts Rainbow("Ocorreu um erro!").red
end
puts Rainbow("Sucesso!").bright.green
Nesse programa estamos testando a importação de uma GEM, como também testando a API do Sistema Operacional através da criação de um novo arquivo.
5. RODANDO O PROGRAMA NO LINUX
Estamos pronto para rodar nosso programa, usando o seguinte comando:
$ wasmtime run --dir ./src/::/ ruby.wasm -r/bundle/setup /app.rb
O comando --dir irá permitir que o interpretador Ruby possa ler os arquivos dessa pasta, e o comando -r/bundle/setup faz o carregamento das bibliotecas que indicamos no Gemfile.
Executando no Linux
Se tudo deu certo, além das mensagens coloridas, o programa deve ter também criado o arquivo hello.txt
, indicando que ele conseguiu utilizar a API do Sistema Operacional para criar o arquivo!
6. RODANDO O PROGRAMA NO WINDOWS
Por fim, para rodarmos no Windows, basta copiar o folder src e o interpretador ruby.wasm, para algumas pasta que desejar.
No meu caso eu escolhi o seguinte caminho: E:\Projects\ruby_wasm
Após isso basta rodar o mesmo comando que rodamos no Linux:
> wasmtime run --dir ./src/::/ ruby.wasm -r/bundle/setup /app.rb
E então:
Executando no Windows
Podemos agora verificar se o arquivo hello.txt foi criado com sucesso:
Verificando a criação do arquivo no Windows
Deu certo! 🎉🎉🎉🎉
O Futuro
Apesar do WASI já fazer maravilhas, ainda não temos módulos importantes como sockets implementados, assim limitando as possibilidades para esse primeiro momento.
Imagina quando tivermos esses módulos!? Com certeza será um marco!
Estou muito empolgado com essa tecnologia! E você!?
Obrigado pela atenção,
Até a próxima ❤️