Lua: linguagem brasileira
Lua nasceu em 1993 na PUC-Rio, criada por Roberto Ierusalimschy, Waldemar Celes e Luiz Henrique de Figueiredo. O nome significa “lua” em português — e a filosofia da linguagem bate com isso: pequena, elegante e poderosa o bastante para iluminar sistemas enormes.
Diferente de muitas linguagens “de laboratório”, Lua foi feita para ser embutida (embedded): o núcleo em C é minúsculo, a API é limpa e o desempenho é alto. Por isso empresas e projetos ousados a escolheram como linguagem de script.
Projetos ousados feitos com Lua
- World of Warcraft — milhares de addons da comunidade em Lua
- Roblox (Luau) — plataforma com milhões de experiências; Luau é um dialeto derivado de Lua
- Adobe Photoshop Lightroom — grande parte da interface e plugins historicamente scriptados em Lua
- Angry Birds — o jogo original usou Lua na lógica
- Neovim — configuração e plugins modernos em Lua
- Redis — scripting server-side embutido em Lua
- OpenResty / Nginx + Lua — APIs e gateways de alta performance
- Nmap e Wireshark — extensões e análise com Lua
- LÖVE (Love2D), Garry's Mod, FiveM — jogos e mods com scripts Lua
Se você quer scripts para FiveM depois, este guia é a base da linguagem; o passo específico do resource está em como criar scripts Lua para FiveM .
Como instalar Lua no Windows
Opção A — Winget (mais simples)
winget install LuaLAN.luaFeche e abra o terminal, depois confira:
lua -vOpção B — Scoop
scoop install luaOpção C — Binário oficial / LuaBinaries
- Baixe o pacote Windows no site oficial ou em distribuidores como LuaBinaries
- Extraia em uma pasta (ex.:
C:\Lua) - Adicione essa pasta ao PATH (Variáveis de ambiente do Windows)
- Abra um novo PowerShell/CMD e rode
lua -v
Dica: no Windows, muitos usam também o WSL (Ubuntu) e instalam Lua como no Linux — ambiente mais próximo de servidores.
Como instalar Lua no Linux
Ubuntu / Debian
sudo apt update
sudo apt install lua5.4
lua5.4 -v Em algumas distros o comando é lua em vez de lua5.4.
Fedora
sudo dnf install lua
lua -vArch
sudo pacman -S lua
lua -vCompilar do código-fonte (avançado)
curl -R -O https://www.lua.org/ftp/lua-5.4.7.tar.gz
tar zxf lua-5.4.7.tar.gz
cd lua-5.4.7
make linux test
sudo make installVersões mudam — confira a última em lua.org/download .
Como executar código Lua
REPL (interativo)
lua
> print("Olá, Lua!")
> 2 + 2
> os.exit()Arquivo .lua
Crie ola.lua:
print("Olá, programador!")lua ola.luaVariáveis
Por padrão variáveis são globais. Prefira local — mais rápido e sem poluir o ambiente.
local nome = "Wictor"
local idade = 25
local ativo = true
-- global (evite)
pontos = 100Tipos em Lua
Os tipos básicos principais:
- nil — ausência de valor
- boolean — true / false
- number — números (inteiros e floats)
- string — texto
- table — a estrutura universal (lista, mapa, objeto…)
- function — funções são valores de primeira classe
- userdata / thread — mais avançados (C / corrotinas)
print(type(nil)) -- nil
print(type(true)) -- boolean
print(type(42)) -- number
print(type("fivem")) -- string
print(type({})) -- table
print(type(print)) -- functionCondicionais
local vida = 40
if vida <= 0 then
print("Morto")
elseif vida < 50 then
print("Ferido")
else
print("Saudável")
end
-- único valor "falso" além de false: nil
local nick = nil
if not nick then
print("Sem nick")
endLaços (loops)
-- numérico
for indice = 1, 5 do
print("volta", indice)
end
-- while
local contador = 3
while contador > 0 do
print(contador)
contador = contador - 1
end
-- repeat until (executa ao menos uma vez)
local tentativas = 0
repeat
tentativas = tentativas + 1
until tentativas >= 3Funções
local function somar(a, b)
return a + b
end
print(somar(10, 5)) -- 15
-- múltiplos retornos
local function dividir(dividendo, divisor)
local quociente = math.floor(dividendo / divisor)
local resto = dividendo % divisor
return quociente, resto
end
local q, r = dividir(17, 5)
print(q, r) -- 3 2
-- função como valor
local operacao = somar
print(operacao(2, 3))Listas e tabelas (o coração de Lua)
Em Lua quase tudo “estruturado” é uma table. Ela funciona como array, dicionário ou os dois ao mesmo tempo.
Array (lista indexada a partir de 1)
local frutas = { "maçã", "banana", "uva" }
print(frutas[1]) -- maçã
print(#frutas) -- 3 (tamanho da sequência)
for indice, fruta in ipairs(frutas) do
print(indice, fruta)
endDicionário / mapa (chave → valor)
local jogador = {
nome = "Ana",
dinheiro = 1500,
job = "police",
}
print(jogador.nome)
print(jogador["job"])
for chave, valor in pairs(jogador) do
print(chave, valor)
endLista de registros
local inventario = {
{ item = "bread", quantidade = 2 },
{ item = "water", quantidade = 5 },
}
for _, entrada in ipairs(inventario) do
print(entrada.item, entrada.quantidade)
endipairs × pairs
- ipairs — percorre a sequência numérica contínua (1, 2, 3…)
- pairs — percorre todas as chaves (incluindo strings); ordem não é garantida
Exemplos práticos
1. Calculadora de dano
local function calcularDano(ataque, defesa, critico)
local dano = math.max(0, ataque - defesa)
if critico then
dano = dano * 2
end
return dano
end
print(calcularDano(40, 10, false)) -- 30
print(calcularDano(40, 10, true)) -- 602. Filtrar lista
local players = {
{ nome = "Leo", online = true },
{ nome = "Mia", online = false },
{ nome = "Kai", online = true },
}
local function filtrarOnline(lista)
local resultado = {}
for _, player in ipairs(lista) do
if player.online then
resultado[#resultado + 1] = player
end
end
return resultado
end
for _, player in ipairs(filtrarOnline(players)) do
print(player.nome)
end3. Contar palavras (string)
local frase = "lua é leve e poderosa"
local total = 0
for palavra in string.gmatch(frase, "%S+") do
total = total + 1
print(palavra)
end
print("Total:", total)Boas práticas em Lua
- Use local sempre que possível
- Nomes claros:
calcularDano, nãox - Um arquivo = uma responsabilidade (config, utils, lógica)
- Evite globais compartilhadas sem controle
- Trate
nil— é a causa nº 1 de “attempt to index a nil value” - Comente o porquê, não o óbvio
- Teste no interpretador puro antes de levar para o FiveM
Como se tornar um programador profissional
Saber sintaxe é só o começo. Profissional resolve problemas com ferramenta certa, disciplina e base de ciência da computação — mesmo sendo autodidata.
Lógica de programação e algoritmos
Antes de framework, treine: decompor problemas, fluxogramas mentais, complexidade (O(n), O(n²)), busca, ordenação, filas/pilhas. Sem lógica, você só copia código.
Git
Versionamento não é opcional. Aprenda clone, branch, commit, pull request, resolver conflito. Todo script sério vive em repositório.
Terminal
Shell (Bash/PowerShell) é o painel do profissional: navegar pastas, rodar Lua, SSH no VPS, logs, grep, pipes. Quem só clica em pastas fica lento em produção.
Protocolos de rede
Entenda HTTP/HTTPS, TCP vs UDP, DNS, WebSocket, o que é porta, latency e firewall. Scripts FiveM, APIs da loja e backends falam rede o tempo todo.
Memória e “ponteiros”
Lua não tem ponteiros explícitos como C. Você trabalha com referências (tabelas e userdata apontam para o mesmo objeto). Ainda assim, estudar memória ajuda: stack vs heap, vazamento, por que clonar tabela importa, garbage collector. Quem só “usa API” sem isso se perde em bugs difíceis.
Threads e concorrência
Em Lua clássica, corrotinas dão cooperatividade. Em jogos/FiveM você vê loops com Wait — isso é multitasking cooperativo. Em sistemas maiores: threads reais, race conditions, locks. Saiba o conceito mesmo que a ferramenta esconda os detalhes.
Performance
Meça antes de “otimizar no escuro”. Evite trabalho inútil em loop quente, cacheie o que for caro, escolha estrutura certa (lista vs mapa). No FiveM isso vira resmon; fora dele, perfiladores e benchmarks.
Próximo nível: sistemas de verdade
Quando a lógica em Lua (ou outra linguagem) já flui, suba para o stack que sustenta produtos reais:
- Banco de dados — SQL (PostgreSQL/MySQL), modelagem, índices, transações; no FiveM isso aparece no oxmysql / inventário / players
- Cache — Redis/Memcached para leituras quentes, sessões, rate limit
- Filas — RabbitMQ, Redis Streams, SQS: trabalho assíncrono (e-mail, webhook, gerar fatura) sem travar o request
- WebSockets — canal bidirecional em tempo real (chat, painel live, sync de estado); complementa HTTP
Um programador completo liga as pontas: lógica → API → banco → cache/fila → cliente (jogo, web ou NUI).
Roteiro sugerido de estudo
- Instalar Lua e rodar os exemplos deste guia
- Reescrever os exemplos sem olhar (memória muscular)
- Fazer 10 exercícios pequenos (FizzBuzz, média, inventário, etc.)
- Aprender Git + terminal no dia a dia
- Criar o primeiro resource FiveM em scripts Lua para FiveM
- Estudar SQL básico e um pouco de HTTP
- Montar um mini projeto: script + config + README + repositório Git
Documentação oficial da linguagem: Lua 5.4 Reference Manual . Mais conteúdo no blog.