¿Qué buscas en un lenguaje de script? [cerrado]

10

Estoy escribiendo un pequeño lenguaje incrustado para otro proyecto. Si bien el desarrollo del juego no era su intención original, está empezando a parecer un buen ajuste, y creo que lo desarrollaré en ese sentido en algún momento.

Sin revelar ningún detalle (para evitar sesgos), tengo curiosidad por saber:

¿Qué características te encantan en un lenguaje de script para el desarrollo de juegos?

Si ha utilizado Lua, Python u otro lenguaje incrustado, como Tcl o Guile, como su lenguaje principal de secuencias de comandos en un proyecto de juego, ¿qué aspectos le resultaron más útiles?

  • Características del lenguaje (lambdas, clases, paralelismo)

  • Características de implementación (optimizaciones de rendimiento, JIT, aceleración de hardware)

  • Características de integración (enlaces C, C ++ o .NET)

  • ¿O algo completamente diferente?

Jon Purdy
fuente
2
Ofuscación: porque si puede ofuscarse, entonces probablemente también sea bastante flexible. Tome Perl, por ejemplo, que puede ofuscarse en la medida en que se ve como la salida causada por el ruido de la línea de un módem de 300 bps (cuando alguien más cogió un teléfono en el otro extremo de la casa) en los días en que estaban rápido. ;-P
Randolf Richardson
1
@Randolf: Buen punto. El único problema con la ofuscación es que tiende a depender de un lenguaje estable, que no son los idiomas jóvenes. Un ofuscador que funciona con 0.10 podría no funcionar con 0.11.
Jon Purdy
@ Jon Purdy: Eso es correcto (+1 para ti). También existe el aspecto de que el código ofuscado es más difícil de mantener. Sin embargo, lo importante a tener en cuenta es que la ofuscación puede proporcionar una medida interesante de cuán flexible es un idioma.
Randolf Richardson
55
@Randolf: ¿cuándo Perl no se ve así?
Ken
1
@ Joe Wreschnig Eso dice 'cuál debería elegir', esto es más 'qué características son buenas en un lenguaje de script'.
El pato comunista

Respuestas:

4

Estoy buscando dos cosas: velocidad e integración. Por lo general, los dos van juntos y con familiaridad. Desafortunadamente, para C ++, prácticamente no hay lenguajes que ofrezcan velocidad e integración. He usado Lua y apestaba horriblemente. Pasé todo el tiempo escribiendo enlaces y en ningún momento escribí código.

Características del lenguaje? El objetivo de incrustar un lenguaje de scripting no es para que pueda tener características de lenguaje dinámico que mi lenguaje original no tenía, es para que pueda ser interpretado en tiempo de ejecución . Realmente no me importa más allá de eso, siempre y cuando sea básicamente funcional, entonces está bien, y encaja con mi lenguaje host (en este caso, C ++). Sin embargo, sorprendentemente, los lenguajes que están diseñados para integrarse en aplicaciones host fallan por completo en la parte de integración .

¿Necesito co-rutinas? No, no necesito co-rutinas. ¿Necesito escribir dinámicamente? No, necesito saber qué tipos me devuelven desde mi lenguaje de scripts, y dado que todo mi código existente se basa en una escritura muy fuerte, realmente me gustaría que mi código de script también pueda respetar eso. ¿Necesito recolección de basura? No, mis tipos ya administran sus propios recursos, y definitivamente quiero la destrucción determinista. ¿Quiero goto? No, quiero lanzar excepciones.

El problema que encontré fue que, básicamente, todos los lenguajes de secuencias de comandos existentes fueron diseñados para extender C, no C ++, y no admiten adecuadamente el modelo C ++ de muchas maneras, y además de esto, tienen una semántica totalmente diferente. ¿Cómo demonios voy a traducir shared_ptr, que es la destrucción determinista automática, en un entorno de recolección de basura? Puede escribir las bibliotecas de envoltura que desee, no cambiará la semántica del idioma subyacente por ser incompatible con el idioma que está tratando de extender con ella. ¿Cómo puedo asegurarme de que este void*es el tipo correcto? ¿Cómo puedo lidiar con la herencia? ¿Cómo lanzo y atrapo excepciones? Simplemente no funciona.

Un buen lenguaje de secuencias de comandos para C ++ sería tipado estáticamente, semántica de valor, destruido determinísticamente, excepciones de lanzamiento y captura y respetar mis destructores / constructores / constructores de copia, porque entonces todos mis tipos funcionarán, agradable y fácil, y el lenguaje resultante será rápido y compatible con toda mi semántica original, fácil de vincular.

DeadMG
fuente
Debería probar algo como esta biblioteca de envoltorios que escribí para mí recientemente para abordar algunos de los mismos problemas que tenía. Puede usar shared_ptrs y otras cosas con él, es seguro (escriba tanto como sea posible), puede decidir si desea que la vida de algo sea controlada por su código o por el entorno Lua, es compatible con la herencia, y es extremadamente similar a la API Lua normal. Sin embargo, no estoy seguro de recibir la queja sobre cómo hacer enlaces, solo uso fragmentos de vim para hacer mis enlaces el 99% del tiempo.
Alex Ames
2

Para los juegos basados ​​en la web, tres factores importantes para mí son:

  • Familiaridad
  • Velocidad
  • Integración

Particularmente me gusta Perl, en parte porque ya estoy familiarizado con el lenguaje, y porque con un módulo de servidor web como mod_perl2 hay un gran beneficio de rendimiento e integración: mod_perl2 mantiene una versión compilada de los scripts en RAM (que solo se interpretan en primera carga) que le da una gran ventaja de velocidad sobre otros lenguajes interpretados que no tienen opciones de compilación, y también se integra en el servidor Apache HTTPd con una API rica en funciones que proporciona acceso a muchas funciones muy potentes.

Estos factores pueden ser útiles para el desarrollo de juegos basados ​​en la web (y cuando se necesita acceso a la base de datos, el almacenamiento en caché de las conexiones de la base de datos ayuda a reducir aún más los tiempos de respuesta para los usuarios). Por supuesto, esta puede no ser la solución más ideal para todo, ya que cada idioma tiene sus ventajas (y desventajas), pero siempre ha funcionado bien para mis necesidades.

Randolf Richardson
fuente
2

Organizado en el orden de importancia (decreciente):

  • Legible de un vistazo. En realidad, ese es un requisito para cualquier lenguaje que quiera usar, pero para las secuencias de comandos es posiblemente más importante: las secuencias de comandos, por definición, cambian con más frecuencia que el código "central". Por lo tanto, no LISP o PERL.
  • Brevedad. Las secuencias de comandos se escriben y reescriben constantemente, y escribir muchos y muchos códigos "repetitivos" es ineficiente.
  • Fácil depuración Preferiblemente con puntos de interrupción, paso a paso, etc.
  • Fácil integración con mi tecnología "core" elegida. Si estoy usando C ++ para mi juego, necesitaría buenos enlaces de C ++, como en LUA. Si el juego está en C #, elegiría un lenguaje basado en CLI: C #, IronPython, Boo.
  • Características del lenguaje: matrices asociativas fáciles, corutinas, quizás lambdas. En realidad, esto depende principalmente de para qué voy a usar los scripts. Las secuencias de comandos de AI son diferentes de, por ejemplo, las secuencias de comandos de inicialización.
  • Buena documentación C # tiene un MSDN completo dedicado a él, y Boo solo tiene fuentes. Es por eso que C # es mucho mejor.
  • Buen ambiente de desarrollo. VS o Eclipse supera al Bloc de notas cada vez.
No importa
fuente
+1 Esto me ayuda bastante, gracias. Esperaré para ver si hay más discusión, pero creo que lo cubriste bien.
Jon Purdy