Reddit – love2d – Os Contras da Programação de Jogos em Lua

Intro

Para dar um prefácio a isto, programei muito pouco em Lua. Eu fiz este jogo super simples, e atualmente estou trabalhando em outro. Entretanto, tem sido suficiente para me fazer ver algumas das desvantagens de programar em Lua.

Queixas

Aqui estão as minhas três principais queixas:

1) Digitação dinâmica e (um pouco) fraca

2) Tudo é um erro de tempo de execução

3) Falta de classes

Exemplos

Dinâmica de digitação/falta de anotações de tipo

Vamos considerar uma função como um exemplo específico.

function Ent:update_state(cmd, params) if cmd == 'at' then self.x, self.y = params.x, params.y endend

Primeiro de tudo, a leitura da função em si torna-se difícil. O que é que esta função absorve? E o que é que ela retorna, se alguma coisa? Nós não obtemos esta informação olhando para a assinatura da função. Em vez disso, temos de ler através do corpo da função. Para funções simples, isto é bom. Mas para funções mais longas e complexas, determinar o tipo de retorno se torna mais uma chatice.

Outras, ler/escrever/depurar chamadas de funções se torna difícil. Podemos passar um valor de qualquer tipo para cmd! Se executarmos ent:update_state(4, …), o ent não será atualizado. Mas ao invés de pegarmos isso como um erro de digitação, teremos que depurá-lo em tempo de execução.

Em geral, idiomas com digitação dinâmica são mais difíceis de ler. Se você quiser saber o tipo de uma variável, você tem que pensar no caminho de execução do código, ao invés de poder olhar para uma anotação de tipo (por exemplo, Java) ou verificar o tipo em uma REPL (por exemplo, usando ghci para verificar os tipos de Haskell). A linguagem Hack é uma exceção. Ela é tipada dinamicamente, mas ainda fornece verificação de tipo estática. Com Lua, você obtém todos os prós e contras de uma linguagem tipada dinamicamente. É super fácil de escrever código, e igualmente difícil de garantir a correção.

Errografia/Silêncio

function test_func(test_arg) print(test_arg)endtest_func() -- prints 'nil'

Aqui está um cenário que eu já encontrei com frequência. Preciso adicionar/remover/alterar uma função. Então eu mudo a função, e então eu vou e mudo todas as chamadas. Isto não é muito ruim; posso procurar o projeto inteiro e atualizar as chamadas uma a uma. Mas e se eu perder uma? Ou se eu adicionar uma nova chamada e esquecer que mudei a função? Você adivinhou: uma falha em tempo de execução!

Outro exemplo aleatório: 4 / 0 = inf. Não atira um erro.

Não Classes

Existe isto, o que funciona bem. Mas ainda falta um monte de funcionalidades de OO: visibilidade do método e interfaces para nomear um casal. Sem as primeiras, torna-se muito fácil mudar o estado de um objeto de qualquer lugar no código, e muito mais difícil de raciocinar sobre o estado dos objetos.

Não é tudo ruim

Ok, são todos os exemplos que tenho (por enquanto). Eu realmente aprendi um pouco decente enquanto escrevia isto. Eu ia reclamar sobre o escopo global, mas encontrei isto. Eu ia reclamar sobre coerção de tipo, mas não é muito ruim (isso só acontece com cordas e ints). E acontece que há uma versão datilografada de Lua! Eu não tentei, mas parece promissor. Se você está lendo isso e já tentou datilografar o Lua, me avise como está nos comentários.

Por que estou reclamando?

Eu percebo que reclamar sobre todas essas coisas pode parecer meio estúpido. Lua é uma linguagem de script leve; as coisas que mencionei acima nem sempre são contras. Lua não é projetado para construir aplicações grandes e complexas. Mas é por isso que eu estou postando isso no subredito Love2D. Parece que as pessoas fazem alguns jogos bem grandes e complexos com o Lua e o Love2D. Por exemplo, Mari0, Warlock’s Tower, etc. Como é que eles (você?) o fazem? Eu não consigo imaginar fazer um jogo “legítimo” em Lua/Love2D. Se eu fizesse um intervalo de uma semana, provavelmente esqueceria metade do código, e perderia muito tempo apenas tentando descobrir os tipos de todas as minhas variáveis e funções. Os jogos normalmente usam Lua como uma linguagem “cola”, e implementam o resto em C/C++? Fazer um jogo grande é mais fácil em Lua do que em outros idiomas, mesmo com os problemas que mencionei acima? Wny, as pessoas usam Lua para jogos grandes, se é que usam de todo?

Obrigado por ter tempo para ler isto :D. E se eu tiver algo errado acima, por favor me avise!

Leitura de interesse:

Lua: Partes boas, más e feias

Baixo e forte datilografia

Deixe uma resposta

O seu endereço de email não será publicado.