2013-07-06 18 views
6

So che molte applicazioni su larga scala come i videogiochi sono create utilizzando più lingue. Ad esempio, è probabile che i motori di gioco/fisica siano scritti in C++ mentre le attività di gioco, le GUI sono scritte in qualcosa come Python o Lua.Funzionamento dell'interoperabilità

Capisco perché questa divisione dei ruoli è stata eseguita; utilizzare linguaggi di livello inferiore per attività che richiedono estrema ottimizzazione, ottimizzazione, efficienza e velocità, mentre si utilizzano linguaggi di livello superiore per accelerare i tempi di produzione, ridurre i bug ect.

Recentemente, ho deciso di intraprendere un progetto personale più ampio e vorrei dividere parti del progetto come sopra. A questo punto, sono davvero confuso su come funziona questa interoperabilità tra i linguaggi (specialmente quelli compilati e interpretati).

Sono abbastanza familiare con i dettagli di passare dal test del codice ANSCII al caricamento di un eseguibile, quando scritto in qualcosa come C/C++. Sono molto curioso di sapere come funziona qualcosa come un videogioco, costruito in molte lingue diverse. Questa è una domanda ampia/ampia, ma nello specifico sono interessato a:

  • Come funziona la logica a livello di codice? Cioè come posso chiamare il codice Python da un programma C++? Soprattutto perché non supportano gli stessi tipi built-in?
  • Che aspetto ha l'immagine del programma? Da quello che posso dire, un videogioco è in esecuzione in un unico processo, quindi che aspetto ha l'immagine runtime quando si esegue un programma C/C++ che chiama una funzione Python?
  • Se si chiama codice da una lingua interpretata da un programma compilato, qual è la sequenza di eventi che si verificano? Se io sono nel mio eseguibile compilato, e per qualche ragione ho una chiamata a un linguaggio interpretato all'interno di un ciclo, devo aspettare che l'interprete venga ripetuto?

In realtà sto trovando un momento difficile trovare informazioni su ciò che accade a livello di macchina, quindi qualsiasi aiuto sarebbe apprezzato. Sebbene io sia curioso in generale sull'interoperabilità del software, sono particolarmente interessato all'interazione con C++ e Python.

Grazie mille per qualsiasi intuizione, anche se mi sta solo indicando dove posso trovare maggiori informazioni.

+2

http://en.wikipedia.org/wiki/Foreign_function_interface probabilmente non sapevano termine giusto per cercare – aryjczyk

+0

@aryjczyk Grazie per il link. Sì, non sapevo di quel termine. Questo è ottimo per aiutare a capire come è fatto. Sono ancora confuso su come qualcosa di simile funzioni fisicamente, specialmente negli ambienti GC vs non GC. Non ho idea di come sarebbe l'immagine del processo. Comunque, grazie, e continuerò a cercare! – gone

risposta

2

Nel caso specifico di pitone, si ha fondamentalmente tre opzioni (e questo vale in generale su tutta la linea):

  1. pitone Host in C++: Dalla prospettiva del programma C++, l'interprete python è una libreria C. Dal lato python, potresti o non avrai bisogno di usare qualcosa come i ctype per esporre l'api C (++).

  2. Python utilizza il codice C++ come DLL/SO - Il codice C++ probabilmente non sa nulla di python, Python deve sicuramente utilizzare un'interfaccia di funzione esterna.

  3. Comunicazione tra processi: in pratica, due processi separati vengono eseguiti e parlano su una presa. In questi giorni probabilmente useresti una specie di architettura di servizi web per realizzare questo.

+0

Ah sì sapevo di (3). Riguardo a (1), in qualche modo capisco come sarebbe un'idea naturale; anche se non capisco come sarebbe implementato in quanto l'interprete Py è chiaramente ** non ** una libreria C condivisa/dinamica. Inoltre, come funziona l'ambiente GC senza l'ambiente non GC? Inoltre, ad esempio, se avessi fatto qualche applicazione in C/C++ che usava Python incorporato, tutti gli utenti avrebbero necessariamente bisogno dell'interprete Py installato sui loro dischi? – gone

+0

@Zak Penso che tu abbia solo bisogno di studiare le basi di come funzionano i processi e di come i programmi binari sono costruiti sotto il cofano. Python gestirà solo gli oggetti che ha assegnato a se stesso. Python può essere costruito per l'incorporamento. Considera cosa significa embedding per rispondere alla tua domanda finale. – Marcin

+0

Ok grazie Marcin. Apprezzo la risposta - lo esaminerò! – gone

0

A seconda di cosa si vuole fare:

  • Dai un'occhiata alla SWIG: http://www.swig.org/ è uno strumento che mira a collegare il codice C/C++ con Python, Tcl, Perl, Ruby, etc. Il comune use case è un'interfaccia Python (grafica o meno) che chiamerà il codice C/C++. SWIG analizzerà il codice C/C++ per generare le interfacce.

  • Libpython: è una libreria che consente di incorporare il codice Python. Hai alcuni esempi qui: http://docs.python.org/3.0/extending/embedding.html

+0

La mia domanda riguarda più ** come ** qualcosa come SWIG funziona. Ma grazie per il vostro risposta – gone

+0

@Zak In effetti, è solo possibile trovare sul proprio sito Web ulteriori informazioni su come funziona SWIG. Ad ogni modo, ho modificato la mia risposta per aggiungere ulteriori informazioni. –