Como muitos de vocês sabem, intérpretes incorporados para linguagens como Lua e Python são amplamente utilizados para a lógica de jogos de script, mas não tenho visto muita informação sobre pessoas que usam linguagens específicas de domínio para seus scripts, por exemplo, construindo um pouco de dialeto de script de lógica 'no topo da linguagem usada para o resto do jogo, usando macros ou programação fluente ou outros enfeites.
Então, minhas perguntas são as seguintes:
- Quais exemplos de tais DSLs você já viu em jogos do mundo real?
- Quais problemas foram encontrados?
- Você recomendaria esta rota para outros desenvolvedores de jogos e em que circunstâncias?
- Você vê isso se tornando mais comum à medida que o desenvolvimento de jogos avança para linguagens mais favoráveis à metaprogramação, como o Boo?
Respostas:
Meu conselho seria "não".
Eu usei uma linguagem de marcação específica do domínio para dados do jogo. Foi uma dor. Passei dias projetando-o e, a cada semana ou duas, precisava ajustá-lo para adicionar mais recursos. A certa altura, percebi que precisava gerar automaticamente alguns dos meus dados de jogo e acabei escrevendo um pequeno programa para analisar arquivos de entrada na linguagem de marcação, massagear e gerar arquivos diferentes também na linguagem de marcação.
Sinceramente, não tenho ideia do que estava pensando. A coisa toda teria sido mais simples, mais eficiente, menos propensa a erros e muito mais demorada se eu tivesse usado Lua.
Se você está trabalhando em um sistema tão restrito que não pode iniciar um ambiente Lua, talvez deva usar uma DSL, mas esteja preparado para a agonia. Caso contrário, acredito firmemente que você deve usar Lua. Lua foi originalmente projetado como uma linguagem simples de marcação de dados e ainda é extremamente favorável ao uso como tal, e quando (não se) você perceber que precisa de algo mais complicado, você já o terá. Todo o meu desenvolvimento atual de jogos é feito em Lua e nunca fui tão eficiente ou menos propenso a erros.
Não posso recomendar contra DSLs com força suficiente.
fonte
Linguagens de script tendem a ser uma proposta cara em jogos. Até Lua, que é bastante rápida, ainda é muito mais lenta que o código nativo. Normalmente, as equipes de jogos estão dispostas a receber esse sucesso porque, em troca, compram dois grandes benefícios:
Infelizmente, as DSLs não fornecem isso a você.
fonte
Acho curioso que sua pergunta se limite a DSLs internas , já que eu prefiro defender o uso de uma DSL externa para obter a capacidade de carregar scripts em tempo de execução e, principalmente, para permitir que não-desenvolvedores escrevam lógica de jogo na DSL .
Por exemplo, meu projeto atual está usando uma DSL externa simples (por enquanto) para especificar parte da lógica do jogo que permite aos designers de jogos fazer testes de equilíbrio principalmente sem a intervenção do desenvolvedor.
Claro que você precisará escrever um analisador; para esse fim, acho que a ferramenta mais recomendada é a ANTLR, que tem como alvo várias línguas . No meu projeto, embora tenhamos seguido a rota do combinador do analisador com o jParsec (nosso back-end é Java, existem variantes em outras linguagens), o que é bastante bom por sua estreita relação com o BNF, mas talvez menos bem documentado.
fonte
Meu conselho seria: faça !
Mas somente se você tiver um uso para isso.
Não é necessário criar uma DSL se você quiser usá-la internamente.
Galaxy é a linguagem de script que o editor Startcraft II está usando. É um excelente exemplo de uma linguagem específica de domínio.
Destina-se a designers de jogos e não a programadores:
Tutorial de exemplo
Lisp é a linguagem perfeita para criar idiomas específicos de domínio, mas há outras opções, é claro. Como Boo.
Dessa forma, seus designers / modders não precisam aprender programação, mesmo que seja apenas Lua, ainda está programando.
Editar: Deixe-me acrescentar que uma DSL pode ser implementada em uma linguagem de script - não é sinônimo de não usar uma linguagem de script. Especialmente se você estiver usando o Lisp ou similar, pois ele se presta extremamente bem para criar idiomas específicos do domínio.
fonte
DSLs internos são apenas açúcar sintático em uma boa API. A API é o que é mais importante. Depois de ter uma boa API, criar um dsl é trivial e não tão importante.
fonte
Indiscutivelmente, o UnrealScript é uma DSL. Parece fazer o trabalho, embora eu ache possível tornar as linguagens de script de jogos ainda mais 'específicas do domínio' do que isso. Eu recomendaria fazer uma DSL se houver algo específico para o domínio que se beneficiará das alterações de idioma - tenho algumas idéias nessa área, mas nada totalmente formado atualmente.
Eu não acho que um mecanismo razoavelmente novo que suporte uma linguagem seja evidência de desenvolvimento de jogos se movendo em uma determinada direção, no entanto. Ainda é cedo.
fonte
Se o que você realmente precisa é de uma linguagem de programação de uso geral, rolar a sua é quase certamente um erro. Se sua linguagem parece precisar de variáveis, avaliação de expressão, loops, condicionais, classes, funções e afins, é melhor se ater a uma linguagem conhecida como Lua, Lisp, Python, JavaScript etc. [A Unreal abandonou a deles.]
Mas se o que você precisa é principalmente sobre a definição de dados; é talvez mais declarativo do que imperativo; talvez defina estados e regras (como GDL); e não precisar muito do que uma linguagem GP faz bem, considere uma DSL.
Mas cuidado: criar linguagens e compiladores pode ser muito difícil e a experiência anterior é uma grande ajuda. Eu recomendaria um analisador PEG (em si um DSL) com base em uma gramática EBNF (outro DSL) e, se isso for muito grande, é melhor não tentar.
fonte