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.