Erlang é uma linguagem dinâmica e Elixir também. É um wrapper que se baseia na sintaxe de Ruby, resolve muitos problemas, mas ainda dinâmica. Outras linguagens também estão sendo criadas para se aproveitar da Erlang VM, como Gleam, que é estática porém sem metaprogramação, sendo não tão genérica como Spiral.
A dor se chama “Modelagem de Domínio”. O objetivo é escrever todas as regras de negócio e algoritmos críticos utilizando Tipos Soma (também chamados de ADTs/Algebraic Data Types). Os enums de Rust possuem esse poder, só que a linguagem não é primariamente funcional e possui uma sintaxe semelhante a C (como Gleam). Acredito que uma modelagem de domínio adequada deve utilizar linguagens estáticas que seguem a teoria Hindley-Milner, como F#, OCaml, Haskell e Spiral. Seguem dois blog posts que abordam o assunto:
- https://fsharpforfunandprofit.com/posts/ten-reasons-not-to-use-a-functional-programming-language/
- https://fsharpforfunandprofit.com/posts/type-size-and-design/
Ao utilizar Spiral pra compilar pra Rust, sua funcionalidade de inlining duplica código escrito uma só vez pra diferentes seções da stack, perdendo a necessidade de “clonar” memória em algumas partes. Preciso testar e documentar melhor essa parte, mas é algo que percebi nos meus experimentos, utilizar Rust e ao mesmo tempo dar “bypass” no borrow checker, onde o output seria mais imutável. Isso é algo bom? Acho que sim. A mesma abordagem levaria a ganhos de performance ao rodar esse mesmo código compilado pra Elixir na Erlang VM.
Resumindo, a ideia é escrever aplicações utilizando uma sintaxe ergonômica e universal pra compilar pra diferentes ambientes de execução de acordo com a necessidade. Utilizei Rust e Elixir como exemplo porque resolvem a maioria dos problemas atuais, poderia ser qualquer destino, como Kotlin, Flutter e Java, pra auxiliar na migração de um legado.
Fica a indagação: considerando o blog post abaixo, em questão de reuso de código, como seria se o Discord utilizasse Spiral pra compilar pra Elixir e Rust?
https://discord.com/blog/using-rust-to-scale-elixir-for-11-million-concurrent-users