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?
Respuestas:
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 estevoid*
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.
fuente
Para los juegos basados en la web, tres factores importantes para mí son:
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.
fuente
Organizado en el orden de importancia (decreciente):
fuente