- Lenguaje de scripting y motor de ejecución que se puede integrar fácilmente en aplicaciones Rust
- Diseñado para agregar lógica dinámica mediante scripts externos o para crear DSL personalizados
- Ofrece una arquitectura con alta compatibilidad con Rust, considerando rendimiento, seguridad y extensibilidad
- Funciona en todas las plataformas compatibles con Rust sobre Rust 1.66.0+ (WASM,
no-std)
- La sintaxis es la de un lenguaje de tipado dinámico similar a JavaScript + Rust
- Rendimiento: 0.14 segundos para ejecutar 1 millón de iteraciones en una VM Linux de un solo núcleo a 2.6GHz
- Integración nativa con Rust: soporte para funciones, tipos, getter/setter, métodos e indexadores de Rust
- Los valores de Rust se pueden pasar al script como variables/constantes (usando
Scope)
- Soporta los principales tipos de datos: booleanos, enteros, punto flotante,
Decimal, cadenas, caracteres Unicode, arreglos, arreglos de bytes y mapas de objetos
- Las funciones definidas en scripts Rhai se pueden invocar desde Rust
- Dependencias mínimas (solo unas pocas bibliotecas como smallvec, thin-vec, etc.)
- Motor re-entrant: puede ser
Send + Sync mediante sync
- Incluye compilación y optimización de AST
- Soporta sistema de plugins y extensión de API basada en macros
- Soporta sobrecarga de funciones/operadores, punteros a función, currificación, closures y algunos patrones OOP
- Proporciona un sistema de módulos para componer dinámicamente la base de código
- Soporte opcional para serialización/deserialización con
serde
- Incluye interfaz de depuración
Seguridad y robustez
- Garantía de Don’t Panic: si ocurre un panic, se considera un bug; el sistema host permanece seguro
- Ejecución en sandbox: no puede modificar el entorno externo a menos que se permita explícitamente
- Protección contra ataques maliciosos: bloqueo de stack overflow, datos excesivos y ejecución infinita
- Permite rastrear el progreso de la ejecución y detenerla manualmente
- Pasó las verificaciones de Miri
Para quienes quieren crear un lenguaje personalizado
- Rhai se puede usar como DSL
- Se pueden desactivar funciones específicas del lenguaje, como los bucles
- Se pueden desactivar y restringir palabras clave/operadores
- Se pueden agregar operadores definidos por el usuario y extensiones de sintaxis
Material adicional
Licencia
- Se puede elegir entre Apache 2.0 o MIT
- El código aportado queda bajo licencia dual por defecto
3 comentarios
Si están buscando un lenguaje de scripting, hay una lista bastante útil en are we game yet.
https://arewegameyet.rs/ecosystem/scripting/
No aparece en esa lista, pero hace poco, preguntándole a GPT, también descubrí un lenguaje de scripting llamado koto; solo lo revisé por encima, pero también se veía bastante bien.
https://koto.dev/
Buscando, también encontré uno llamado roto; no llegué a revisar qué tal era, pero el lugar que lo desarrolla me sonaba de algo.
https://github.com/NLnetLabs/roto
Hay ejemplos de medición de tiempo en el playground de wasm, pero ¿no son rápidos?
Como es un lenguaje para scripting, es normal que no sea rápido.