Sto cercando due cose: velocità e integrazione. Di solito i due vanno insieme e con familiarità. Sfortunatamente, per C ++, non ci sono praticamente linguaggi che offrono velocità e integrazione. Ho usato Lua e ha fatto schifo, in modo orribile. Ho passato tutto il tempo a scrivere collegamenti e in nessun posto abbastanza vicino a scrivere codice.
Caratteristiche del linguaggio? Il punto di incorporare un linguaggio di scripting non è che possa avere caratteristiche di linguaggio dinamico sibilante che la mia lingua originale non aveva, è che possa essere interpretato in fase di esecuzione . Non mi interessa davvero, purché sia sostanzialmente funzionale, quindi va bene e si adatta al mio linguaggio host (in questo caso C ++). Tuttavia, sorprendentemente, i linguaggi progettati per essere integrati nelle applicazioni host falliscono completamente nella parte relativa all'integrazione .
Ho bisogno di co-routine? No, non ho bisogno di co-routine. Ho bisogno di una digitazione dinamica? No, ho bisogno di sapere quali tipi mi stanno tornando dal mio linguaggio di scripting e poiché tutto il mio codice esistente è basato su una tipizzazione molto forte, mi piacerebbe davvero che anche il mio codice di script fosse in grado di rispettarlo. Ho bisogno della raccolta dei rifiuti? No, i miei tipi gestiscono già le proprie risorse e sicuramente voglio la distruzione deterministica. Voglio andare? No, voglio fare eccezioni.
Il problema che ho riscontrato è che sostanzialmente tutti i linguaggi di scripting esistenti sono stati progettati per estendere C, non C ++, e non supportano correttamente il modello C ++ in molti modi, e inoltre hanno una semantica totalmente diversa. Come posso tradurre shared_ptr
, che è la distruzione deterministica automatica, in un ambiente raccolto dalla spazzatura? Puoi scrivere qualunque libreria di wrapping tu voglia, non cambierai la semantica della lingua sottostante essendo incompatibile con la lingua che stai cercando di estendere con essa. Come posso assicurarmi che questo void*
sia il tipo giusto? Come posso gestire l'eredità? Come faccio a lanciare e catturare le eccezioni? Semplicemente non funziona.
Un buon linguaggio di scripting per C ++ verrebbe tipizzato staticamente, valorizzando la semantica, deterministicamente distrutto, gettando e catturando le eccezioni e rispettando i miei distruttori / costruttori / costruttori di copie, perché allora tutti i miei tipi funzioneranno semplicemente, bene e facilmente, e il linguaggio risultante sarà veloce e supporta tutta la mia semantica originale, facile da associare.