Guia de programação

Como programar em Lua

Lua é leve, rápida e fácil de embutir em jogos e ferramentas. Foi criada por brasileiros e hoje roda em engines, jogos AAA, editores e até no FiveM. Este guia cobre a linguagem do zero — e o que estudar depois para virar programador de verdade.

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.lua

Feche e abra o terminal, depois confira:

lua -v

Opção B — Scoop

scoop install lua

Opção C — Binário oficial / LuaBinaries

  1. Baixe o pacote Windows no site oficial ou em distribuidores como LuaBinaries
  2. Extraia em uma pasta (ex.: C:\Lua)
  3. Adicione essa pasta ao PATH (Variáveis de ambiente do Windows)
  4. 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 -v

Arch

sudo pacman -S lua
lua -v

Compilar 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 install

Versõ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.lua

Variá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 = 100

Tipos 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))     -- function

Condicionais

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")
end

Laç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 >= 3

Funçõ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)
end

Dicioná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)
end

Lista de registros

local inventario = {
  { item = "bread", quantidade = 2 },
  { item = "water", quantidade = 5 },
}

for _, entrada in ipairs(inventario) do
  print(entrada.item, entrada.quantidade)
end

ipairs × 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))  -- 60

2. 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)
end

3. 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ão x
  • 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

  1. Instalar Lua e rodar os exemplos deste guia
  2. Reescrever os exemplos sem olhar (memória muscular)
  3. Fazer 10 exercícios pequenos (FizzBuzz, média, inventário, etc.)
  4. Aprender Git + terminal no dia a dia
  5. Criar o primeiro resource FiveM em scripts Lua para FiveM
  6. Estudar SQL básico e um pouco de HTTP
  7. 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.