Recentemente o time da Anaconda anunciou o Pyscript uma nova tentativa de integrar Python no desenvolvimento de Frontends web. Python é famosa por ser uma linguagem multipropósitos - em contraste com linguagens como R e Matlab, que são linguagens pensadas para usos mais fechados. No entanto, os 'multipropósitos' do Python são normalmente distantes do usuário final não-técnico. APIs, pipelines de Machine Learning, Sistemas de Suporte, Análises de Dados, Python faz tudo isso bem.

No entanto Python não possui uma presença forte no lado do cliente. Projetos como o Kivy, o Beeware e o Brython tentam lutar essa batalha há alguns anos com níveis diferentes de sucesso. Escrevendo essa matéria, descobri inclusive que o Beeware está contratando!

O Pyscript é o novo projeto na área. Construído em cima do Pyodide, ele consegue fazer uma forma nova de integração com o browser. O projeto Beeware, por exemplo, tinha o projeto Batavia - que também mirava rodar Python no browser. O problema de rodar coisas no browser é que, historicamente, browsers só rodam JavaScript. Como contornar isso?

O Monopólio do JS

IMG_20161018_132034.jpg

Moeda comemorativa que ganhei em 2016, por colaborar com o projeto Batavia

Bem, linguagens de programação "grandes" como Python, JavaScript, C, PHP, Java, Pascal e etc possuem uma propriedade interessante conhecida como Turing-Equivalência. Informalmente isso significa que qualquer uma dessas linguagens pode ser usada para rodar código feito em qualquer outra. Ou seja, eu posso escrever um interpretador de Javascript em C, ou um compilador de C em PHP, ou um interpretador de Java em Python. Como consequência dessa propriedade, podemos escrever um interpretador de Python em JavaScript. Ora, se eu consigo escrever um interpretador Python em JavaScript e os navegadores sabem rodar JavaScript, eu consigo então rodar Python no navegador. Era esse o objetivo do projeto Batavia - escrever um interpretador Python em JavaScript.

Apesar dessa estratégia garantidamente funcionar, ela tem seus pontos negativos. Notadamente, no processamento normal do Python, o interpretador converte nossos códigos para um bytecode que é interpretado pela máquina virtual do Python que por sua vez é implementada em C. Com um projeto como o Batavia, a máquina virtual é feita em JavaScript. A execução dessa máquina virtual vai envolver passar o código agora pelo pipeline de processamento do JavaScript em si, que também vai ter a sua própria máquina virtual. Ou seja, o processamento vai ter aproximadamente o dobro de passos.

Quase dois anos atrás, em 30 de maio de 2020 o projeto Batavia foi pausado num anúncio que é basicamente uma previsão do futuro, que viria ser o Pyscript:

... [T]he approach that is being used by Batavia needs to be reconsidered.
In particular, the emergence of WASM as a viable target for web development
opens many options for Python on the web that weren't previously possible.

Tradução minha:

A abordagem que está sendo usada pelo Batavia precisa ser reconsiderada.
Em particular, o surgimento do WASM como algo viável em desenvolvimento
web abre muitas opções para Python na web que não eram previamente possíveis

WASM?

Na mensagem de fechamento do Batavia, fica claro que o criador do projeto estava vislumbrando um futuro - o WASM, também conhecido como WebAssembly. Nossos computadores não entendem nossas linguagens de programação de verdade. Se você tentar conversar com a sua CPU em C, Python, JavaScript ou qualquer uma dessas linguagens, você vai ter como resposta o silêncio eterno de um punhado de silício.

A única forma de conversar com uma CPU é através da sua própria linguagem de montagem, conhecida como "Assembly". Por exemplo na página 87 desse PDF - "3.3.6 Arithmetic" - você pode ver as instruções matemáticas que minha CPU suporta. Note que ela não tem uma instrução para, por exemplo, elevar um número a uma potência arbitrária, como 7 elevado à 3. Se eu quiser fazer isso, vou precisar montar uma série de instruções para fazer isso.

Independente da linguagem de programação ser puramente interpretada, compilada ou uma combinação dos dois - Python e JS são normalmente chamadas de "interpretadas" mas, na verdade, elas possuem compiladores dentro de seus interpretadores - no fim do dia você precisa que seu código vire Assembly de alguma forma. Sem isso, você não faz nada.

Então, em 2017, surgiu o que é conhecido como WebAssembly, o WASM. Basicamente, a ideia é definir uma série de instruções que uma máquina virtual embutida nos navegadores vai aceitar. Se todos os navegadores embutirem essa máquina virtual dentro de si, algo interessante pode acontecer! Ao invés de nós construirmos código Python que vai ser convertido no Assembly entendido por uma CPU Intel ou AMD, nós convertemos em Assembly que vai ser entendido por uma máquina virtual Web Assembly! O resultado - Python que roda no navegador. Ou Rust, ou Go, ou qualquer outra linguagem, na verdade. Basta que a gente comece ter como alvo do processo de compilação uma máquina virtual WASM!

Entra o Pyodide

Para essa "mágica" acontecer nós precisamos fazer com que código na linguagem de entrada (Python, no caso) seja de alguma forma traduzido para WASM. O Pyodide faz exatamente isso.

Nesse link você vai ter um console Python completo. Rodando no seu navegador. Não tem um servidor em algum lugar servindo esse console. O que está acontecendo aí é que o seu navegador está recebendo instruções na máquina virtual web assembly que ele tem embutida dentro dele!

Pyscript - Pyodide + HTML

E finalmente temos a nova promessa de Python nos navegadores. Somando o poder do Pyodide com uma forma fácil de rodar código in-line, o pyscript tem potencial para tornar o uso de Python no front realmente viável.

Observe como nós estamos lidando com o novo passo de um processo histórico - o pyscript é a realização do que o projeto Batavia já vislumbrava dois anos atrás, quando parou suas atividades. O próprio projeto Batavia já vinha de anos de experimentação com o tema. Eu, particularmente, conheci o projeto em 2016.

O Futuro

O Pyscript vem da Anaconda, uma empresa que possui gente muito boa e recursos para de fato fazer a diferença. A performance ainda é uma questão. Python através de WASM é mais lento que Python comum. Porém, Python no Frontend é uma área que interessa a muita gente. Por exemplo, o gigantesco mercado de Data Science com todo o investimento que tem recebido possui muito a ganhar com soluções Python verdadeiramente "full stack". A Anaconda é em si uma empresa que atua nesse mercado.

Além disso, a linguagem Python em si - como discuti nas Notas do Bidu - possui planos de melhoria que vão fatalmente avançar na performance do Pyodide também.

No fim das contas, além de ficar feliz em ver Python - uma linguagem que gosto bastante - ganhar um novo caminho no importantíssimo mundo do desenvolvimento frontend web, eu fico também feliz com a possibilidade de novas linguagens abrirem caminho nesse espaço. Independente das minhas opiniões sobre JavaScript, o monopólio tecnológico que ela tem sobre o frontend web tem se mostrado, na minha opinião, nocivo.

Os porquês disso são assuntos para um outro post, hoje vou me limitar a dizer que vejo valor no conflito de ideias de tecnologias diferentes no mesmo espaço. Que forma será que o ecossistema de computação numérica do Python teria hoje sem a competição que teve por vários anos com R? Será que uma competição saudável não vai nos permitir a focar melhor nossos esforços em ideias que entregam valor de maneira duradoura ao invés de criar frameworks inteiros para JS toda vez que ficamos tristes com algo?

O futuro vai nos mostrar se pyscript se estabelecerá ou será mais um passo rumo ao objetivo, seja como for, eu acho uma baita ideia e que realmente tem potencial.

Saiba Mais

O @rochacbruno gravou um vídeo explorando o pyscript e seus exemplos:

https://www.youtube.com/watch?v=Mj47se4FOPk

Veja também a documentação oficial

Como toda tecnologia nova, é legal ler e assistir sobre, mas o mais legal é colocar a mão na massa :D

Ah, aquela moeda bonita que ganhei por colaborar com o Batavia foi graças à uma Python Brasil! Na Python Brasil de 2016, Russel, o criador do projeto, esteve no Brasil e nós tivemos a oportunidade de colaborar com o projeto junto dele, ao vivo e presencialmente. Essas são as chamadas "Sprints" que acontecem nos eventos da comunidade. Você pode acompanhar as novidades sobre a Python Brasil 2022 no site oficial. Será em Manaus, de 17 a 23 de Outubro