- Luau es un lenguaje de scripting embebido derivado de Lua 5.1, rápido, seguro y con soporte para tipado gradual
- Evolucionó reforzando el rendimiento, las herramientas del lenguaje y el sistema de tipos para soportar juegos complejos y bases de código grandes en la plataforma Roblox
- A diferencia de Lua base, está diseñado con funciones de sandboxing para que código con distintos niveles de privilegios pueda ejecutarse en paralelo
- Su sintaxis es compatible con Lua 5.1, pero ofrece extensiones sintácticas adicionales y herramientas de análisis (linter, verificador de tipos) para mejorar la calidad del código
- Con optimizaciones de rendimiento, bytecode personalizado y soporte JIT, busca velocidades de ejecución al nivel de LuaJIT, y tiene un gran potencial de uso más allá de Roblox en diversos entornos embebidos
Motivation (motivación)
- Alrededor de 2006, Roblox adoptó Lua 5.1 como lenguaje de scripting para juegos
- Con el paso del tiempo, a medida que subió el nivel de los juegos en la plataforma Roblox y crecieron los equipos, mejoraron profundamente el lenguaje y su implementación para superar las limitaciones de Lua existente
- Junto con el crecimiento de la plataforma, invirtieron mucho en optimización de rendimiento, facilidad de uso y desarrollo de herramientas relacionadas con el lenguaje
- En particular, al administrar para 2020 una base de código a gran escala de más de un millón de líneas, reconocieron que introducir un sistema de tipos gradual era indispensable
- Con base en esas necesidades, Roblox desarrolló Luau, un lenguaje derivado de Lua que ofrece velocidad, tamaño reducido, seguridad y la capacidad de aplicar tipos de forma gradual
- Más detalles están disponibles en el documento Why Luau
Resumen de Luau
- Luau es un lenguaje de scripting embebido basado en Lua 5.1
- Ofrece un runtime rápido y ligero
- Soporta un sistema de tipos gradual, lo que permite combinar análisis dinámico y estático
- Está integrado en Roblox Studio, y se puede activar el modo estricto con la bandera
--!strict - Los desarrolladores pueden consultar la documentación vinculada con Roblox en Luau Creator Docs
Sandboxing (sandbox)
- Luau restringe la biblioteca estándar expuesta y ofrece funciones adicionales de sandboxing
- Esto permite ejecutar en paralelo de forma segura tanto código sin privilegios escrito por desarrolladores comunes como código privilegiado interno de la plataforma
- Por ello, su entorno de ejecución es distinto al de Lua base
- Los detalles están disponibles en la explicación de Sandbox
Compatibility (compatibilidad)
- Mantiene, en la medida de lo posible, la compatibilidad hacia atrás con Lua 5.1, e incorpora también algunas funciones de versiones posteriores
- Sin embargo, Luau no adopta todas las decisiones de diseño de Lua, ya que refleja casos de uso y restricciones propios de Roblox
- El estado del soporte para funciones de versiones posteriores a Lua 5.1 se detalla en el documento de Compatibility
Syntax (sintaxis)
- Es totalmente compatible con la sintaxis de Lua 5.1
- Además, ofrece extensiones sintácticas modernas y familiares para facilitar el desarrollo
- La sintaxis completa puede consultarse en el documento de Syntax
Analysis (herramientas de análisis)
-
Proporciona herramientas de análisis de scripts para ayudar a escribir código correcto
-
Componentes:
- Linter: detecta errores comunes
- Type Checker: valida tipos
-
Puede ejecutarse con la herramienta de línea de comandos
luau-analyze -
Las reglas de lint están en el documento de Lint, y la guía de verificación de tipos en Typecheck
Performance (rendimiento)
- Ofrece un frontend personalizado con parser, linter y verificador de tipos, además de bytecode optimizado, intérprete y compilador
- En algunos casos, ofrece un rendimiento capaz de competir con el intérprete de LuaJIT
- Soporta un compilador JIT manual en plataformas x64 y ARM64, lo que puede mejorar mucho el rendimiento de ciertos programas
- El runtime se sigue optimizando y algunas partes se están reescribiendo para mejorar la eficiencia
- Los detalles de rendimiento están disponibles en el documento de Performance
Libraries (bibliotecas)
- El lenguaje en sí es un superconjunto completo de Lua 5.1
- En la biblioteca estándar se eliminan algunas funciones y se agregan otras nuevas
- Cuando se integra en una aplicación, también puede acceder a bibliotecas de extensión específicas de la app
- La documentación completa de bibliotecas puede consultarse en el documento de Library
1 comentarios
Opiniones de Hacker News
src, tiene 11 mil líneas de código C y 1,900 líneas de headers.CreateThread(fn),Wait(ms)y soporte de Await/Promises como en FiveM, para manejar corrutinas más cómodamente (implementación de Luau Promise). En FiveM, este tipo de wrappers facilita la optimización de scripts y la administración de corrutinas: ejemplo del scheduler Lua de FiveM--!strict, el código se ejecutara sin ningún error ni advertencia aun cuando había violaciones de tipos evidentes. No era el comportamiento que esperaban.luau, la verificación de tipos no se aplica. Si en un entorno embebido se obliga a que todo el código pase por type checking antes de compilarse, entonces sí se obtiene la experiencia esperada de detectar errores de tipos. Es un diseño inevitable, dado que se migraron de golpe cientos de millones de líneas de código de Lua 5.1 a Luau.tscy luego mapeando de vuelta los errores y resultados a Luau, no se podría crear rápidamente un type checker para distintos lenguajes dinámicos.