Idiomas específicos de domínio para script [fechado]

12

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?
Cody Brocious
fonte
Para responder à pergunta de uso de DSL do mundo real, o Battlefield 1942 os usou. Embora muitos mods tenham aparecido; do ponto de vista dos programadores, era horrível e perdi o interesse muito rapidamente.
Jonathan Dickinson

Respostas:

6

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.

ZorbaTHut
fonte
Er, porque não? Você acabou de usar o Lisp, acho que seria uma experiência muito mais agradável. :) O Starcraft II possui a linguagem de script Galaxy, que de fato é uma linguagem específica de domínio direcionada a garotos / galãs não-técnicos.
jacmoe
3
O Lisp não seria um DSL mais do que Lua ou Python. Seria uma linguagem totalmente formada que alguém gastou muito tempo projetando, tempo que você pode evitar gastar.
Coderanger
2

Não tenho visto muita informação sobre as pessoas que usam linguagens específicas de domínio para seus scripts, por exemplo, criando um pouco de 'dialeto' de script lógico sobre a linguagem usada no resto do jogo, usando macros ou programação fluente ou outras coisas.

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:

  1. A capacidade de alterar scripts sem precisar recompilar e recarregar o jogo.
  2. A capacidade de não programadores escreverem scripts.

Infelizmente, as DSLs não fornecem isso a você.

maravilhoso
fonte
Eu diria que 2) é um arenque vermelho. Para qualquer script suficientemente interessante, um não programador precisará de mais ajuda para segurar ou depurar do que vale a pena. Existem bons programadores-designers por aí que não precisam de ajuda, mas você não pode colocar Lua For Dummies na mesa de um designer de nível regular e esperar que eles produzam diversão.
tenpn
Concordo. Eu não acho que o número 2 funcione bem na prática, mas já vi isso como uma razão ostensiva para integrar uma linguagem de script.
munificent
Existem muitas pessoas com boas idéias de jogos que podem escrever scripts Lua, mas eu nunca confio perto de malloc / sprintf / em qualquer lugar em que eles tenham que escolher uma estrutura de dados / etc. É exatamente isso que significa o número 2 - "A capacidade de programadores ruins causarem danos mínimos e ainda assim fazerem o trabalho".
Eles podem não causar vazamentos de memória com um script, mas um programador ruim ainda pode escrever um código com erros, inaceitável e lento. Programadores ruins não devem ser permitidos perto do seu jogo. Contrate designers com experiência comprovada em scripts e você ficará bem.
21711
2

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.

Thomas Dufour
fonte
2

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:

Timer - Start Raise Lava Timer as a One Shot timer that will expire in 20.0 Game Time seconds
Variable - Set Raise Lava Timer = (Last started timer)
Timer - Create a timer window for (Last started timer), with the title "Lava will raise in: ", using Remaining time (initially Visible)
Variable - Set Lava Timer Window = (Last created timer window)
Timer - Show (Last created timer window) for (All players)
Variable - Set Lava Death? = false

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.

jacmoe
fonte
1

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.

Jonathan Fischoff
fonte
0

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.

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?

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.

Kylotan
fonte
0

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.

david.pfx
fonte