Lenguajes específicos de dominio para scripting [cerrado]


12

Como la mayoría de ustedes saben, los intérpretes integrados para idiomas como Lua y Python se usan ampliamente para la lógica de los juegos de secuencias de comandos, pero no he visto mucha información sobre las personas que utilizan lenguajes específicos de dominio para sus secuencias de comandos, por ejemplo, construir un pequeño dialecto de secuencias de comandos de lógica 'además del lenguaje utilizado para el resto del juego, usando macros o programación fluida o lo que sea.

Entonces mis preguntas son las siguientes:

  • ¿Qué ejemplos de tales DSL has visto en los juegos del mundo real?
  • ¿Qué problemas se encontraron?
  • ¿Recomendarías esta ruta para otros desarrolladores de juegos y en qué circunstancias?
  • ¿Ves esto cada vez más común a medida que el desarrollo del juego avanza hacia lenguajes más amigables con la metaprogramación, por ejemplo, Boo?

Para responder a la pregunta sobre el uso de DSL en el mundo real, Battlefield 1942 los utilizó. Aunque aparecieron muchas modificaciones; desde la perspectiva de los programadores (mi) fue horrible y perdí el interés muy rápidamente.
Jonathan Dickinson el

Respuestas:


6

Mi consejo sería "no".

He usado un lenguaje de marcado específico de dominio para los datos del juego. Fue un dolor Pasé días diseñándolo, y luego cada semana o dos necesitaba ajustarlo para agregar más funciones. En un momento me di cuenta de que necesitaba generar automáticamente algunos de los datos de mi juego, y terminé escribiendo un pequeño programa para analizar archivos de entrada en el lenguaje de marcado, masajearlos y generar diferentes archivos también en el lenguaje de marcado.

Sinceramente, no tengo idea de lo que estaba pensando. Todo habría sido más simple, más eficiente, menos propenso a errores y mucho menos tiempo si hubiera usado Lua.

Si está trabajando en un sistema tan restringido que no puede iniciar un entorno Lua, entonces quizás debería usar un DSL, pero esté preparado para la agonía. De lo contrario, creo firmemente que deberías usar Lua. Lua se diseñó originalmente como un simple lenguaje de marcado de datos y todavía es extremadamente propicio para usarlo como tal, y cuando (no si) te das cuenta de que necesitas algo más complicado, ya lo tienes. Todo mi desarrollo actual del juego se realiza en Lua y nunca he sido más eficiente o menos propenso a errores.

No puedo recomendar contra DSL con suficiente fuerza.


Er, ¿por qué no? ¿Acabas de usar Lisp? Creo que habría sido una experiencia mucho más placentera. :) Starcraft II tiene el lenguaje de programación Galaxy, que de hecho es un lenguaje específico de dominio dirigido a chicos / chicas no tecnológicos.
jacmoe

3
Lisp no sería un DSL más que Lua o Python. Sería un lenguaje completamente formado que alguien más ha pasado mucho tiempo diseñando, tiempo que puede evitar gastar usted mismo.
coderanger

2

No he visto mucha información sobre personas que utilizan lenguajes específicos de dominio para sus scripts, por ejemplo, construir un pequeño 'dialecto' de scripts lógicos sobre el lenguaje utilizado para el resto del juego, usar macros o programación fluida o cualquier otra cosa.

Los lenguajes de script tienden a ser una propuesta costosa en los juegos. Incluso Lua, que es bastante rápido, sigue siendo mucho más lento que el código nativo. Los equipos de juego generalmente solo están dispuestos a recibir ese golpe porque les da dos grandes beneficios a cambio:

  1. La capacidad de cambiar los scripts sin tener que volver a compilar y volver a cargar el juego.
  2. La capacidad de los no programadores para escribir scripts.

Las DSL no te dan eso, desafortunadamente.


Yo diría que 2) es un arenque rojo. Para cualquier script suficientemente interesante, un no programador necesitará más ayuda de retención o depuración de lo que vale. Hay buenos programadores-diseñadores que no necesitan ayuda, pero no puedes golpear a Lua For Dummies en el escritorio de un diseñador de nivel regular y esperar que generen diversión.
Tenpn

Estoy de acuerdo. No creo que el # 2 funcione bien en la práctica, pero he visto que se usa como una razón aparente para integrar un lenguaje de script.
munificente

Hay muchas personas con buenas ideas de juegos que pueden escribir scripts de Lua, pero nunca confiaría en malloc / sprintf / cualquier lugar donde tuvieran que elegir una estructura de datos / etc. Eso es realmente lo que significa # 2: "La capacidad de los malos programadores de causar un daño mínimo y aún así hacer el trabajo".

Es posible que no causen pérdidas de memoria con un script, pero un mal programador aún puede escribir código con errores, que no se puede mantener y lento. Los malos programadores no deberían estar permitidos cerca de tu juego. Contrata diseñadores con experiencia probada en scripts y estarás bien.
Tenpn

2

Me parece curioso que su pregunta se limite a DSL internos , ya que prefiero recomendar el uso de un DSL externo para poder cargar scripts en tiempo de ejecución y especialmente para permitir que los no desarrolladores escriban la lógica del juego en el DSL .

Por ejemplo, mi proyecto actual está usando un (por ahora) DSL externo simple para especificar parte de la lógica del juego que permite a los diseñadores de juegos realizar pruebas de equilibrio principalmente sin intervención del desarrollador.

Por supuesto, tendrá que escribir un analizador sintáctico; con ese fin, creo que la herramienta más recomendada es ANTLR, que apunta a varios idiomas . En mi proyecto, aunque fuimos a la ruta del combinador de analizadores con jParsec (nuestro backend es Java, hay variantes en otros idiomas), lo cual es bastante bueno por su estrecha relación con BNF, pero quizás menos documentado.


2

Mi consejo sería: ¡ Hazlo !

Pero solo si tienes un uso para ello.

No es necesario crear un DSL si solo lo va a usar usted mismo, internamente.

Galaxy es el lenguaje de script que utiliza el editor de Startcraft II. Es un excelente ejemplo de un lenguaje específico de dominio.

Está dirigido a diseñadores de juegos en lugar de 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 muestra

Lisp es el lenguaje perfecto para crear lenguajes específicos de dominio, pero hay otras opciones, por supuesto. Como Boo

De esa manera, sus diseñadores / modders no tienen que aprender programación, incluso si es solo Lua, sigue siendo programación.

Editar: Permítanme agregar que un DSL se puede implementar en un lenguaje de script; no es sinónimo de no usar un lenguaje de script. Especialmente si está utilizando Lisp o similar, ya que se presta extremadamente bien para crear lenguajes específicos de dominio.


1

Los dsls internos son solo azúcar sintáctico en una buena API. La API es lo más importante. Después de tener una buena API, hacer un dsl es trivial, y no tan importante.


0

Podría decirse que UnrealScript es un DSL. Parece que se hace el trabajo, aunque creo que es posible hacer que los lenguajes de secuencias de comandos del juego sean aún más 'específicos de dominio' que eso. Recomendaría hacer un DSL si hay algo específico en el dominio que se beneficiará de los cambios de idioma: tengo algunas ideas en esta área, pero actualmente no hay nada completamente desarrollado.

¿Ves esto cada vez más común a medida que el desarrollo del juego avanza hacia lenguajes más amigables con la metaprogramación, por ejemplo, Boo?

Sin embargo, no creo que un motor bastante nuevo que admita un lenguaje sea evidencia de que el desarrollo del juego se mueve en una dirección determinada. Todavía es temprano.


0

Si lo que realmente necesita es un lenguaje de programación de propósito general, rodar el suyo es seguramente un error. Si su lenguaje parece necesitar variables, evaluación de expresiones, bucles, condicionales, clases, funciones y similares, entonces mejor adhiérase a un lenguaje conocido como Lua, Lisp, Python, JavaScript, etc. [Unreal ha abandonado el suyo].

Pero si lo que necesita se trata principalmente de definir datos; es quizás declarativo más que imperativo; quizás define estados y reglas (como GDL); y no necesita la mayoría de lo que un lenguaje GP hace bien, entonces considere un DSL.

Pero cuidado: crear lenguajes y compiladores puede ser muy difícil y la experiencia previa es de gran ayuda. Recomendaría un analizador PEG (en sí mismo un DSL) basado en una gramática EBNF (otro DSL), y si es una pregunta demasiado grande, mejor no intentarlo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.