2012-11-05 21 views
8

Ora sto imparando C++ e ho sentito parlare molto dei linguaggi di scripting incorporati. L'ho immaginato completamente diverso.Perché dovrei incorporare un linguaggio di scripting?

Ho pensato di scrivere tutte le mie funzioni pesanti in C++ e richiamarle da un linguaggio di scripting come Lua o Python.

Ma sembra che sia il contrario. -> Scrivi le funzioni in Lua/Python e chiamale in codice C.

Qual è il vantaggio di incorporare una lingua in C++ anziché scrivere un'API in C++ e chiamare tali funzioni in un'altra lingua?

Esempio:

// function in c++ 
int expensiveFunction(){ 
    return 1; 
} 

Poi in Python che chiamerei questa funzione e avrei la performance da C++, ma può apportare modifiche a runtime grazie a interprete runtime di Python.

+0

Un altro motivo è che è possibile consentire agli utenti di scrivere i propri script per estendere il programma. Questo è ciò che fa Unix. –

+2

In che contesto stai parlando? Nei videogiochi, il motore è "chiuso" in C++, ma spesso le cose sono controllate attraverso linguaggi di scripting per consentire modifiche. Lo stesso per qualcosa come un server, o qualsiasi software in cui si vorrebbe mantenere il core chiuso, ma consentire estensioni create dall'utente. Ma l'inverso sarebbe vero, ad esempio, in un software scientifico in cui qualcosa come Python è semplice da scrivere ma lento, quindi le funzioni di base dovrebbero essere in C/Fortran. – tpg2114

+0

@ tpg2114: questo è esattamente ciò di cui sto parlando. Quando dovrei considerare di incorporare una lingua in C++ invece di scrivere il core in C++ e usarlo in python/lua? Forse puoi darmi alcuni vantaggi/svantaggi. –

risposta

4

In realtà, molti motori di gioco amano creare interfacce al motore incorporando Lua o Python. Ci sono dei vantaggi:

  • I non programmatori possono interfacciarsi con il motore.
  • Non è necessario ricompilare le modifiche di script secondarie.
  • Gli errori nello script potrebbero non danneggiare l'intero sistema.

C++ è piuttosto utile come back-end per i progetti che desiderano la flessibilità dei linguaggi di scripting, ma desiderano le prestazioni del C++. Non ho sentito parlare di progetti che usano C++ come frontend, con un linguaggio di scripting come back-end.

API Stile

Usiamo questo stile nel software della mia azienda. Esporremo un'API attraverso una DLL di Windows che può essere chiamata dalla maggior parte delle lingue abbastanza facilmente. Supportiamo specificamente VB e VBA. Questo è grandioso quando il backend è al di fuori del controllo del creatore di script. Tuttavia, è difficile eseguire il debug di problemi derivanti dalla prospettiva del produttore di script.

Vantaggi

  • forte disaccoppiamento
  • accessibile con le lingue

Svantaggi

  • Difficile da eseguire il debug di 2 processi

Stile incorporato

Il software in realtà incorpora l'interprete di script nel software.In questo modo è possibile esporre le funzionalità come se fossero funzioni native. In questo stile, i creatori di script e i programmatori back-end sono in genere nella stessa azienda. Può anche essere utilizzato dal software tradizionale per consentire ad altri di estendere la funzionalità dell'applicazione. Se condividono il codice sorgente, è possibile eseguire il debug dei problemi derivanti dagli script in un modo molto più semplice. L'applicazione si occupa anche di quando e come lanciare gli script. Tuttavia, per supportare lingue aggiuntive, lo sviluppatore dell'applicazione deve incorporare altri interpreti.

Vantaggi

  • forte accoppiamento
  • Più facile per eseguire il debug un processo

Svantaggi

  • Accessibile solo attraverso la lingua approvata
+1

Penso che la maggior parte delle librerie python siano scritte in C++. –

+1

Questo è quello che sto dicendo. C++ brilla come back-end in altre lingue. Sembrava che fosse curioso del C++ usando gli script come back-end. –

+1

Mi dispiace di aver letto male la tua risposta. Perché voglio scrivere un semplice motore grafico in C++ e costruire un framework (in un "linguaggio di scripting") in cima al motore. Così altri potrebbero programmare qualcosa in python/lua ma ottenere comunque le prestazioni del C++. Ero solo confuso perché ho visto il codice che era incorporato in C++. –

1

Gli script vengono compilati in fase di esecuzione, mentre la lingua principale verrebbe compilata in fase di compilazione. Ciò renderebbe il lavoro con una base di codice di grandi dimensioni relativamente facile in quanto non sarebbe necessario compilare l'intero progetto per aggiornare un semplice script.

+0

Ho aggiunto un esempio. Sarei anche in grado di apportare modifiche in fase di esecuzione, ma senza aggiungere una lingua in C++. –

+0

@MaikKlein Non ho mai visto qualcuno chiamare codice C++ da Python, è tipicamente il contrario, qualcosa come chiamare uno script Lua da C++. – Rapptz

+0

Sì, mi piacerebbe sapere perché? Mi sembra più ragionevole scrivere semplicemente un'API in C++. –

1

Un motivo potrebbe essere che si desidera utilizzare un framework C++ che porti la propria funzione principale (e ti obbliga a usarlo come funzione principale del tuo programma).

A mio parere, questa è spesso una cattiva progettazione del quadro - non è facile da usare più di un tale quadro di un programma ...

Lo stesso vale per più linguaggi di scripting in un unico programma: Un solo la lingua può fornire la funzione principale. Tutte le altre lingue devono essere incorporate.

Nota: Con i thread, è possibile ottenere qualcosa come "funzioni principali multiple". Bene, non molte funzioni principali. Ma più loop di gestione degli eventi.

3

In realtà, entrambi gli approcci funzionano correttamente. La domanda è quale approccio è più appropriato per la tua particolare applicazione.

Ad esempio, la scrittura di codice di prestazioni elevate come estensione di una lingua funziona bene per le applicazioni in cui si desidera che si senta come se qualcuno stesse utilizzando una libreria più piccola nel linguaggio programmato. Se si desidera fornire un'API performante per il rendering grafico che si include all'interno di un'applicazione Python, questa è la strada da percorrere.

D'altra parte, se si dispone di un motore che è quasi interamente scritto in C++ - come un motore di gioco - e si vuole fornire un modo semplice per agganciare nel motore di gioco senza richiedere una ricompilazione, è possibile incorporare l'interprete. Questo è il motivo per cui i motori geme spesso scrivono per es. AI o ami comportamentali in un linguaggio di scripting: cambia, ad esempio, il "tempo di risposta" di un bot e puoi vedere immediatamente la differenza , a volte anche senza dover riavviare il gioco.

Tutto dipende dall'intenzione su quale lato è "più grande", ma è possibile fare entrambi gli approcci con Lua o Python, credo.

1

Una volta ho incorporato Python in un controller di robot. Il controller gestiva un robot che gestiva wafer con chip per computer e controllava anche vari altri dispositivi. Il cliente poteva scrivere un programma Python che facesse cose come stare al passo con i wafer, aprire le porte, accendere e spegnere le luci, leggere gli interruttori, ecc. Oppure leggere le istruzioni da una linea seriale o ethernet e tradurle in azioni . Naturalmente il controllo fine del robot è stato gestito a livello C++, correndo alla priorità più urgente su un sistema operativo in tempo reale.

1

Oltre a considerazioni come prestazioni, ricompilazione, manutenibilità, un altro motivo è la sicurezza del codice.

linguaggio compilato come C/C++ è più difficile (non impossibile) per gli altri a conoscere il vostro algoritmo esatto senza codice sorgente, mentre gli script sono (apparentemente) più facile per conoscere la sua logica, perché sono lì per compilare in fase di esecuzione .

Problemi correlati