7 pontos por GN⁺ 2025-09-23 | 1 comentários | Compartilhar no WhatsApp
  • Luau é uma linguagem de script embutida rápida, segura e com suporte a tipagem gradual, derivada de Lua 5.1
  • Ela evoluiu com melhorias em desempenho, ferramentas de linguagem e sistema de tipos para dar suporte a jogos complexos e grandes bases de código na plataforma Roblox
  • Diferentemente do Lua padrão, foi projetada com recursos de sandboxing para permitir que códigos com diferentes níveis de privilégio sejam executados lado a lado
  • A sintaxe é compatível com Lua 5.1, mas oferece extensões adicionais de sintaxe e ferramentas de análise (linter, verificador de tipos) para elevar a qualidade do código
  • Com otimizações de desempenho, bytecode personalizado e suporte a JIT, busca velocidade de execução no nível do LuaJIT, com grande potencial de uso além do Roblox em diversos ambientes embarcados

Motivation (motivação)

  • Por volta de 2006, a Roblox adotou Lua 5.1 como linguagem de script para jogos
  • Com o passar do tempo, à medida que o nível dos jogos da plataforma Roblox aumentou e o tamanho das equipes cresceu, a linguagem e sua implementação foram amplamente aprimoradas para superar as limitações do Lua original
  • Com o crescimento da plataforma, houve grande investimento em otimização de desempenho, facilidade de uso e desenvolvimento de ferramentas relacionadas à linguagem
  • Em especial, ao gerenciar em 2020 uma grande base de código com mais de 1 milhão de linhas, tornou-se claro que a adoção de um sistema de tipos gradual era essencial
  • Com base nessas necessidades, a Roblox desenvolveu o Luau, uma linguagem derivada de Lua que oferece recursos para aplicar tipos gradualmente, além de ser rápida, pequena e segura
  • Mais detalhes estão disponíveis no documento Why Luau

Visão geral do Luau

  • Luau é uma linguagem de script embutida baseada em Lua 5.1
    • Oferece um runtime rápido e leve
    • Dá suporte a um sistema de tipos gradual, permitindo análise dinâmica e estática em conjunto
  • Está integrado ao Roblox Studio, e o modo estrito pode ser ativado com a flag --!strict
  • Os desenvolvedores podem consultar a documentação integrada ao Roblox em Luau Creator Docs

Sandboxing (sandbox)

  • O Luau restringe a biblioteca padrão exposta e fornece recursos adicionais de sandboxing
  • Isso permite a execução paralela e segura de código sem privilégios escrito por desenvolvedores comuns e código privilegiado interno da plataforma
  • Por isso, ele tem um ambiente de execução diferente do Lua padrão
  • Mais detalhes podem ser vistos na explicação sobre Sandbox

Compatibility (compatibilidade)

  • Mantém, tanto quanto possível, a compatibilidade retroativa com Lua 5.1, incorporando também alguns recursos de versões posteriores
  • No entanto, o Luau não adota todas as decisões de design do Lua, refletindo casos de uso e restrições específicos do Roblox
  • O status de suporte aos recursos das versões posteriores ao Lua 5.1 está disponível na documentação de Compatibility

Syntax (sintaxe)

  • É totalmente compatível com a sintaxe do Lua 5.1
  • Além disso, oferece extensões de sintaxe modernas e familiares para melhorar a experiência de desenvolvimento
  • A sintaxe completa pode ser consultada na documentação de Syntax

Analysis (ferramentas de análise)

  • Fornece ferramentas de análise de scripts para ajudar na escrita de código correto

  • Componentes:

    • Linter: detecta erros comuns
    • Type Checker: valida tipos
  • Pode ser executado com a ferramenta de CLI luau-analyze

  • As regras de lint estão na documentação de Lint, e o guia de verificação de tipos na documentação de Typecheck

Performance (desempenho)

  • Oferece um frontend personalizado com parser, linter e verificador de tipos, além de bytecode otimizado, interpretador e compilador
  • Em alguns casos, entrega desempenho capaz de competir com o interpretador LuaJIT
  • Dá suporte a compilador JIT manual em plataformas x64 e ARM64, podendo melhorar significativamente o desempenho de programas específicos
  • O runtime continua sendo otimizado e parcialmente reescrito para melhorar a eficiência
  • Os detalhes de desempenho estão disponíveis na documentação de Performance

Libraries (bibliotecas)

  • A linguagem em si é um superconjunto completo do Lua 5.1
  • Na biblioteca padrão, algumas funções foram removidas e algumas novas foram adicionadas
  • Quando incorporada a uma aplicação, também é possível acessar bibliotecas de extensão específicas do app
  • A documentação completa das bibliotecas pode ser consultada na documentação de Library

1 comentários

 
GN⁺ 2025-09-23
Comentários do Hacker News
  • Tenho experiência de ter migrado de Lua e LuaJIT para Luau no Lumix Engine por causa do sistema de tipos, mas senti que é difícil usá-lo em projetos fora do Roblox; a documentação é fraca e quase não há comunidade, então não ajuda em nada na hora de resolver problemas; em comparação com Lua ou LuaJIT, ele é maior e a compilação ficou 7 vezes mais lenta; o tratamento assíncrono da API na prática fica bloqueado de forma síncrona, e há vários incômodos, como o uso de STL; também enfrento bugs frequentes relacionados à análise e ao LSP, então estou pensando em procurar outras alternativas
    • A equipe do Roblox está focando em tornar o Luau mais fácil de usar também fora do Roblox no futuro; ele já é usado com sucesso em vários lugares, como Remedy Entertainment (Alan Wake 2), Digital Extremes (Warframe) e GIANTS Software (Farming Simulator 25); até agora, o investimento e o suporte estavam concentrados internamente no Roblox, mas agora estão desenvolvendo o Lute, um runtime independente para uso geral, e também criando várias ferramentas de desenvolvimento baseadas em Luau para expandir o ecossistema; ainda está em estágio inicial, mas estão investindo ativamente para dar suporte ao uso externo e a vários casos de uso; acreditam que, para o crescimento saudável do Luau, é importante atrair usuários e casos de uso mais diversos
    • Estou usando Luau em todo o código de gameplay de um jogo em Unity (mais de 60 mil linhas); gostaria que a documentação, especialmente sobre integrações customizadas, fosse melhorada, e sinto que o novo sistema de tipos e o LSP ainda não combinam muito bem; desde que o zeux saiu do time, fico um pouco preocupado com a direção de longo prazo; ainda assim, gosto muito da experiência de desenvolvimento em si; o código Luau faz hot reload quase instantaneamente mesmo com o jogo em execução, e o projeto em C++ também compila rápido; também é bom o fato de oferecer um ambiente sandbox para suporte a mods; a comunidade oficial no Discord também é razoavelmente ativa
    • Foi dito que a compilação ficou mais lenta, mas sendo uma linguagem de script, não seria normal não precisar compilar o código? Pergunto se isso talvez se refira à compilação da própria VM do Luau
  • É realmente interessante que o Roblox esteja desenvolvendo um runtime de Luau para desktop no estilo Node.js: https://github.com/luau-lang/lute
    • Já existe um runtime de Luau mais maduro, o Lune; uso para scripts de build e automação de arquivos place do Roblox, e para o meu uso funciona de forma plenamente satisfatória
    • Existe também outro runtime independente de Luau, o Lune
  • O Luau parece muito mais complexo que o Lua; olhando o código, o Luau tem 120 mil linhas em C++, enquanto o Lua 5.1 tem 14 mil linhas em C; acho inevitável que a complexidade aumente quando se adiciona um sistema de tipos gradual ou estático; com um sistema de tipos minimamente completo, no fim ele tende mesmo a ser maior que uma linguagem de script dinâmica
    • Lua (e, até certo ponto, Luau) é pequeno não pelo número de linhas, mas na hora de aprender a linguagem em si; o runtime necessário para execução não depende totalmente de Analysis; em Analysis há dois sistemas de tipos completos, e nos últimos 3 anos vinha sendo desenvolvido um novo sistema de tipos para resolver limitações fundamentais; agora o antigo deve ser removido em breve, o que pode reduzir o código em cerca de 30 mil linhas
    • Eu não considero Lua e Luau linguagens pequenas ou simples; talvez essa complexidade nem seja necessariamente desejável; estou trabalhando numa linguagem mais simples e expressiva chamada Bau, e também numa VM em estilo Lua; esse tipo de linguagem pequena aparece com certa frequência no Reddit Bau, Bau VM, r/ProgrammingLanguages
    • Tipagem estática ou gradual aumenta a complexidade, mas esse aumento é menor do que parece; às vezes linguagens de script dinâmicas são até mais complexas; um type checker Hindley–Milner pode ser implementado em uma página de código, então essa complexidade de 2 mil páginas parece exagerada; H–M é completo mesmo sem lidar com funções de alta ordem, genéricos (polimorfismo paramétrico) ou ponteiros nulos, e permite inferência total; também pode ser estendido e, só com o básico, já é muito mais poderoso que os sistemas de tipos de C ou Java 1.7
    • Já escrevi um type checker para Lua e também li bastante o código-fonte; essas 14 mil linhas do Lua têm densidade de código muito alta; em um estilo mais comum, dariam algo entre 30 e 40 mil linhas; ou seja, o Lua não é essencialmente pequeno, mas sim extremamente conciso na implementação
    • Se detalhar mais a contagem de linhas com o tokei, o diretório Analysis tem 62 mil linhas de C++ e 9,2 mil linhas de headers C; Ast tem 8,4 mil linhas de C++; CodeGen, 21 mil linhas de C++; já o Lua 5.1 tem 11 mil linhas de código C e 1.900 linhas de headers em todo o diretório src
  • Tenho curiosidade sobre a diferença entre Teal e Luau; ambos são apresentados como “dialetos tipados de Lua”, então queria comparar https://teal-language.org/
    • O Teal compila arquivos Teal para Lua, então se aplicam tanto as vantagens quanto as desvantagens da relação entre JS e TS; o Luau tem seu próprio runtime compatível como superconjunto de Lua, e melhora não só o sistema de tipos como toda a experiência de desenvolvimento; por isso os dois são bem diferentes; o Teal tem a vantagem de poder usar Lua em qualquer lugar; já o Luau só roda em runtime próprio, mas por não exigir uma etapa separada de compilação pode oferecer melhor usabilidade para o desenvolvedor; as informações de tipo também não se perdem e podem ser aproveitadas
    • Teal transpila para Lua, enquanto Luau é um fork do Lua; isso permite alterar amplamente desempenho do interpretador, segurança, extensibilidade de sintaxe e mais; o Roblox é grande a ponto de ter chegado a um valor de mercado de 100 bilhões de dólares, e mantém vários desenvolvedores dedicados em tempo integral
    • Luau não é apenas “Lua com tipos”; ele aposta fortemente em sistema de tipos gradual e inferência de tipos, ao mesmo tempo em que melhora a linguagem aos poucos; é projetado com foco em experiência do desenvolvedor e suporte de ferramentas, e embora se preocupe com tamanho de binário e afins, não prioriza a mesma simplicidade rígida do Lua; o foco é menos usar Lua para integrar grandes projetos em C e mais dar ao desenvolvedor uma boa experiência diretamente na linguagem
  • É uma pena que o Lua não tenha evoluído mantendo mais compatibilidade com o passado; no fim dos anos 2000, vários projetos, incluindo Roblox, adotaram Lua 5.1, e agora o Lua chegou ao 5.4, mas a compatibilidade com versões antigas não foi mantida tão bem; LuaJIT, por exemplo, só suporta 5.1; é uma situação parecida com Python 2.x/3.x, mas a comunidade Lua tende majoritariamente a continuar usando 5.1
    • Na prática é ainda pior: luau e luaJIT também evoluíram em direções diferentes do projeto oficial de lua, e agora já não são sutilmente compatíveis entre si; todos se bifurcaram do Lua 5.1, mas dá a sensação de que já não existe mais um padrão oficial de verdade
    • A grande diferença é que a comunidade Lua não costuma atacar publicamente a questão da manutenção de compatibilidade retroativa, então é relativamente fácil escrever código para várias versões diferentes
    • É difícil obter estatísticas oficiais, mas a sensação é que há mais usuários de 5.1 e 5.2 do que de 5.4, e talvez até mais do que de 5.3; LuaJIT desperta bastante interesse, mas não aparece com tanta frequência no uso real
    • O LuaJIT também inclui alguns recursos das versões mais novas do Lua (5.2, 5.3) e ainda mais extensões https://luajit.org/extensions.html
  • O mais interessante para mim foi ver que há casos em que o interpretador do Luau chega ao nível do LuaJIT; a página de performance explica isso muito bem e mostra a capacidade de engenharia do Roblox https://luau.org/performance
  • Conheci o Luau porque meu filho de 13 anos começou a se interessar pelo Roblox Studio, e também visitei o luau.org; a engenharia do Roblox é realmente impressionante
    • Arseny Kapoulkine é um engenheiro excepcional; vale seguir o blog ou as redes sociais dele; além do luau e do motor de renderização do Roblox, ele criou o meshoptimizer, que é praticamente uma biblioteca obrigatória na indústria gráfica, e o volk a ponto de ser incluído no Vulkan SDK
  • Second Life está migrando da antiga Linden Scripting Language para Luau; antes a compilação era baseada em Mono, mas como o Mono não é mais mantido, surgiu a necessidade de uma nova linguagem; além do suporte a Luau, o compilador antigo de LSL também foi alterado para mirar o engine de execução do Luau; houve também uma pequena melhora de performance; o Second Life é um ambiente peculiar, com centenas de milhares de scripts orientados a eventos rodando no servidor, então gerenciar recursos não é simples, e se programas inativos consumirem 1 microssegundo por frame cada um, isso pode se acumular e virar um grande problema
    • Quando o ambiente beta de Luau foi aberto, eu mesmo testei e senti um ganho grande de desempenho em relação ao sistema antigo baseado em Mono; principalmente na hora de salvar (Save), a verificação de scripts caiu de 10 segundos para praticamente instantânea, o que elevou muito a produtividade; ainda assim, seria melhor se houvesse funções helper como CreateThread(fn), Wait(ms) e suporte a Await/Promises, como no FiveM, para lidar com corrotinas de forma mais simples (implementação de Promise para Luau); no FiveM, esses wrappers facilitam a otimização dos scripts e o gerenciamento de corrotinas; exemplo do scheduler Lua do FiveM
    • Depois de trocar a VM, o que ficou imediatamente evidente é que boa parte do overhead antigo estava em scheduling, troca de contexto e implementação de funções de biblioteca; o Luau, por projeto, dá suporte natural a scheduling preemptivo, o que torna muito mais simples orquestrar código de glue; tratar isso na VM é muito mais barato e fácil de implementar do que transformar em máquina de estados na etapa de AST ou bytecode; o overhead em microssegundos de programas idle também é, no fim das contas, algo que o scheduler precisa otimizar
  • Parte do charme minimalista original do Lua se perdeu por causa do type inference, embora isso venha em troca de segurança de tipos, então há prós e contras; mas me surpreendi ao ver que, mesmo declarando --!strict, o código roda sem nenhum erro ou aviso até em casos óbvios de violação de tipo; não era o comportamento que eu esperava
    • Atualmente, o sistema de tipos do Luau não é “obrigatório (strict)” nesse sentido; o código pode ser executado sem checagem de tipos, e se você rodar direto no demo ou no executável luau, a checagem não é aplicada; se em um ambiente embarcado todo o código fosse forçado a passar por type checking antes da compilação, você teria a experiência esperada de capturar erros de tipo; isso é uma consequência inevitável do fato de terem migrado de uma vez milhões de linhas de código Lua 5.1 para Luau
  • Sempre quis um Typed Lua, mas implementar completamente type checker e LSP para uma linguagem dinâmica é bem difícil; toda linguagem dinâmica acaba tendo problemas parecidos de tipagem estrutural, semelhantes aos que vemos em TypeScript; fiquei pensando se não daria para reaproveitar o engine do TypeScript, converter parcialmente código Luau para TypeScript, validar com tsc e depois mapear os erros/resultados de volta para Luau, o que talvez permitisse criar type checkers rápidos para várias linguagens dinâmicas
    • Assim como o LLVM funciona como uma IR comum para compiladores, talvez desse para usar o sistema de tipos do TypeScript como um “linguagem intermediária” comum para tipos; eu não prefiro linguagens dinâmicas, mas se fosse possível ter checagem de tipos e suporte de ferramentas no nível do TypeScript, meu interesse aumentaria bastante; o que não desse para cobrir, tudo bem, porque essa é justamente a essência da tipagem gradual; se o sistema de tipos do TypeScript existisse no runtime de Lua, eu certamente usaria; também acompanho com muito interesse o rumo do Luau
    • O Luau já tem um excelente Luau Language Server, então em vscode, nvim, zed e outros há diagnósticos, autocomplete e checagem estrita de tipos excelentes; é uma experiência de desenvolvimento muito melhor do que senti em Ruby ou Python; uso Luau para shell scripting e programação em geral, e também criei um runtime próprio em estilo node chamado seal; pelo que ouvi, desenvolvedores de Roblox usam mais o Lune para CI/CD, testes e afins
    • Para tipar todos os cantos de uma linguagem dinâmica com TypeScript, o sistema acaba ficando complexo demais; acho melhor seguir algo como Rescript ou Gleam, impondo algumas restrições na linguagem-alvo e usando um sistema Hindley–Milner; sistemas HM são robustos e práticos graças a muitos anos de teoria e experiência acumuladas; pessoalmente, acho até surpreendente não haver um pequeno projeto de linguagem da família ML que gere código para lua; se o Gleam suportasse Lua como backend, combinaria muito bem
    • Já existe o projeto TypeScriptToLua; já usei com Love2D e a experiência foi bem boa