2009-08-15 12 views
11

Ho esperienza con OCaml. Dovevi scrivere uno stub per ogni funzione che volevi usare per convertire i tipi anche C int < -> OCaml int. Il collegamento era un pozzo doloroso. Non voglio nemmeno preoccuparmi di mappare oggetti C++.Quali linguaggi di alto livello sono facilmente interfacciabili con C/C++?

E altre lingue popolari? È sempre un dolore?

EDIT:

Si prega di evitare duplicati. E le funzionalità di interfacciamento C e C++ sono separate.

EDIT 2:

Si prega di essere specifici. "X può chiamare C" non dà troppe informazioni.

+2

Non è un linguaggio di alto livello, ma le interfacce ASM sono davvero belle con C e C++! :-). L'altro consiglio che posso darti è che quando hai troppi problemi a collegare il codice C/C++ con il tuo codice Python puoi sempre creare una buona DLL del tuo codice C/C++. Ad alcune persone piacciono anche le DLL COM. – toto

+1

C++ ** è ** linguaggio elevato, evento non è ** facile ** uno – Artyom

risposta

7

Quasi tutti i linguaggi di scripting (Perl, Python, Lua, PHP, Ruby, Tcl) devono essere incorporati in C e C++.

Una buona carta da un'indagine dei relativi meriti delle API:

H. Muhammad and R. Ierusalimschy. C APIs in extension 
and extensible languages. Journal of Universal Computer 
Science, 13(6):839–853, 2007. 

Vedi anche questo very similar question (e my answer in particular;)).

+0

Mi piace l'evidenziazione della sintassi :) – Skilldrick

+0

Skilldrick: anch'io. Mi chiedo perché lo faccia: http://meta.stackexchange.com/questions/14664/how-does-so-syntax-highlight-citations-so-well –

+0

-1: "progettato per essere incorporato in C e C++. " è falso (come in, non è la verità) per tutte le lingue citate, ma Lua. Solo Lua è stata progettata per questo, l'altra è l'adattamento reso possibile. C'è una differenza sostanziale nel processo di incorporare un linguaggio che è stato progettato per essere incorporato e incorporare un linguaggio che non era l'obiettivo principale del progetto. – Klaim

15

Python ha un'API C molto buona. Può essere integrato in C++ anche in modo molto semplice e comodo usando il binding boost :: python C++ per l'API Python C.

+1

È necessario fare riferimento al modulo ctypes e http://docs.python.org/extending/extending.html – Novelocrat

0

L'interfacciamento con gli oggetti C++ sarà sempre dolorosa, poiché non esiste un ABI standard (interfaccia binaria).

+0

Bene. Immagino tu stia parlando di funzioni virtuali. Puoi fare molto senza di loro. –

+0

Finché l'interfaccia utilizzata si occupa di convenzioni di chiamata, layout, ecc., Piuttosto che forzare te, il programmatore, a farlo, dovrebbe andare bene. – Novelocrat

+0

Se si può interfacciare con ELF, si dovrebbe essere in grado di interfacciarsi facilmente con oggetti C++. – Imagist

3

Python dispone di un'interfaccia C eccezionale che utilizza il modulo ctypes incorporato. Per interfacciare i moduli C++, è possibile utilizzare SWIG.

8

Ci sono vari gradi di divertimento disponibili tra le lingue tradizionali e le loro interfacce C. Felicemente, puoi usare SWIG per la maggior parte di loro.

3

Python è un potente e facile da imparare linguaggio ad alto livello e ha una buona documentazione di estendere con C e C++:

http://docs.python.org/extending/extending.html

Usando questo approccio è semplice, ma devi scrivere le estensioni in modo esplicito per Python. Usando SWIG (vedi Extending Python with C++ per un simpatico piccolo tutorial), crei il codice C/C++ come se fosse da eseguire da solo più un file di interfaccia che SWIG impiega per creare un codice wrapping per te che puoi usare in Python (o altre lingue, per quella materia).

+1

Non è Boost.Python considerato più la cosa in questi giorni? – KayEss

2

Java ha un'interfaccia nativa con JNI, C# ha qualcosa di molto simile.

+2

JNI è lontano per essere bello ... prova JNA – dfa

+0

Oh, mi scuso se JNI non è più la cosa "dentro"; Sono passati 8 anni dall'ultima volta che ho fatto Java: P –

+0

Puoi essere più specioso? –

0

Ho collegato le librerie FORTRAN in una volta. Ti direi di più, ma è ora di fare il mio sonnellino.

0

Tcl può chiamare C/C++ di codice

3

segnalarti questo recent comp.compilers thread su varie interfacce estera-funzione. È stato suggerito che Haskell avesse uno dei migliori.

1

R è estendibile tramite C, C++ e Fortran, questo è descritto nello R Extensions Manual e il pacchetto Rcpp fornito rende più semplice chiamare le funzioni C++.

5

Questo problema è stato importante per oltre 20 anni. Lo stato dell'arte nel risolverlo è definire un Interface Definition Language o IDL. Quindi hai uno strumento che genera automaticamente quelle funzioni che hai usato per scrivere a mano. L'altro termine di uso comune è interfaccia di funzione esterna o FFI.

Sfortunatamente, molti di loro non sono molto buoni. Per esperienza personale:

  • tolua e SWIG non valgono la pena di utilizzare per Lua e C; è più facile scrivere le funzioni di rilegatura a mano. L'IDL per tolua in particolare è quasi, ma non proprio un file di intestazione C, quindi si finisce per mantenere due versioni di ogni dichiarazione.

  • tolua ++ può valere la pena di utilizzare per il binding Lua e C++ — il valore fastidioso della simulazione di oggetti C++ a mano è notevole.

  • SWIG copre molte lingue, ma l'ho sempre trovato difficile da utilizzare.

Dalla lettura circa l'esperienza di altre persone:

  • La Glasgow Haskell Compiler sembra avere la più bella interfaccia esterna funzione, e se non ricordo male, l'IDL è soddisfacentemente semplice: basta dare la Haskell tipo di funzione C che stai cercando di importare.

  • Standard ML of New Jersey sembra anche avere un'interfaccia di funzione straniera piuttosto carina; c'era un articolo su BABEL-01 a riguardo.

Per ogni lingua che si desidera interagire con C, si dovrebbe chiedere sull'interfaccia estera funzione e chiedere se c'è un IDL e strumenti associati.

+0

SWIG può essere un dolore, ma ha il vantaggio di doverlo imparare una sola volta. –

0

Le capacità di integrazione di Lua con C (e per estensione C++) sono assolutamente di prima classe. È anche una piccola lingua meravigliosa. Non credo che diventi quasi l'amore che merita.

link: http://www.lua.org/

0

implementazioni Common Lisp spesso hanno una FFI che funziona davvero bene con C. La cosa bella è che non c'è bisogno di scrivere alcun codice C per utilizzare librerie C; tutto quello che devi fare è scrivere la dichiarazione della funzione C è Lisp.

Il fattore ha copiato questo sistema FFI da Lisp.

3

In questo caso non userei Python, anche se c'è Boost.Python per aiutarlo a incorporarlo. Persino i Python dicono che ha più senso incorporare C in Python piuttosto che il contrario, semplicemente perché Python non è progettato per essere incorporato.

Mi piace usare lingue che sono specificamente realizzati per essere incorporato in C++ o C, come Lua, Falcon o ChaiScript. Tuttavia mi piace anche avere una lingua completa disponibile. Se voglio scrivere un'applicazione sotto pesanti vincoli (come i giochi su console), preferisco usare Lua progettato per questo. In caso contrario, preferisco utilizzare Falcon o ChaiScript.

Falcon è una buona alternativa a Python in questo caso (incorporando un linguaggio di alto livello in C++): http://falconpl.org
E 'progettato per funzionare con C++ e persino le librerie standard sono implementate in C++.

mi piace anche di utilizzare ChaiScript quando voglio solo includere le intestazioni e andare con un linguaggio scripring: http://chaiscript.org E 'progettato per essere solo intestazione e facilmente integrabili nel codice C++. Infatti è fatto per funzionare solo con C++.

Entrambi sono di lingua di alto livello. Falcon somiglia più a Python e Ruby, ma ha il vantaggio di proporre molti più paradigmi di programmazione rispetto a questi due. Chaiscript ha l'aspetto di un C++ semplificato, quindi potrebbe non essere la scelta migliore per chi non è abituato a questa sintassi, ma altrimenti è facilmente legato al tuo codice C++ reale. Anche Falcon, ma non nello stesso modo e la sintassi è più semplice per i non programmatori.

Problemi correlati