- Linguagem de script e engine de execução que pode ser embutida facilmente em aplicações Rust
- Projetada para permitir adicionar lógica dinâmica por meio de scripts externos ou criar uma DSL personalizada
- Alta compatibilidade com Rust, oferecendo uma arquitetura que considera desempenho, segurança e extensibilidade
- Funciona em todas as plataformas compatíveis com Rust com Rust 1.66.0+ (WASM,
no-std)
- A sintaxe é de uma linguagem com tipagem dinâmica, semelhante a JavaScript + Rust
- Desempenho: 0,14 segundo para executar 1 milhão de iterações em uma VM Linux single-core de 2,6GHz
- Integração nativa com Rust: suporte a funções, tipos, getter/setter, métodos e indexadores do Rust
- Valores Rust podem ser passados ao script como variáveis/constantes (usando
Scope)
- Suporte aos principais tipos de dados: booleano, inteiro, ponto flutuante,
Decimal, string, caractere Unicode, array, array de bytes, mapa de objetos
- Funções definidas em scripts Rhai podem ser chamadas a partir de Rust
- Dependências mínimas (usa apenas poucas bibliotecas, como smallvec e thin-vec)
- Engine reentrante: com
sync, pode oferecer Send + Sync
- Fornece compilação e otimização de AST
- Suporte a sistema de plugins e extensão de API baseada em macros
- Suporta sobrecarga de função/operador, ponteiros de função, currying, closures e alguns padrões de OOP
- Fornece um sistema de módulos, permitindo compor a base de código dinamicamente
- Suporte opcional a serialização/desserialização com
serde
- Fornece interface de depuração
Segurança e proteção
- Garantia de Don’t Panic: se ocorrer panic, isso é considerado bug; o sistema hospedeiro permanece seguro
- Execução em sandbox: não é possível alterar o ambiente externo, a menos que isso seja explicitamente permitido
- Proteção contra ataques maliciosos: bloqueia stack overflow, excesso de dados e execução infinita
- Permite rastrear o progresso da execução e encerrá-la manualmente
- Passou na verificação com Miri
Para quem quer criar uma linguagem personalizada
- Rhai pode ser usado como DSL
- É possível desativar recursos específicos da linguagem, como loops
- É possível desativar e restringir palavras-chave/operadores
- É possível adicionar operadores definidos pelo usuário e estender a sintaxe
Materiais adicionais
Licença
- Pode ser escolhido entre Apache 2.0 ou MIT
- O código contribuído segue, por padrão, licenciamento duplo
3 comentários
Se você está procurando uma linguagem de script, há uma lista no are we game yet.
https://arewegameyet.rs/ecosystem/scripting/
Não está nessa lista, mas recentemente, enquanto perguntava ao GPT, também descobri uma linguagem de script chamada koto. Dei só uma olhada rápida, mas ela também pareceu boa.
https://koto.dev/
Enquanto pesquisava, também encontrei algo chamado roto, mas não cheguei a ver exatamente do que se trata. Ainda assim, o lugar que a criou me pareceu familiar.
https://github.com/NLnetLabs/roto
Existem exemplos de medição de tempo no playground wasm, mas não parecem rápidos, né?
Como é uma linguagem voltada para scripts, é normal que não seja rápida.