Compilate ciascun file sorgente in file oggetto usando il compilatore appropriato per la sua lingua, quindi collegate i file oggetto in un file eseguibile, nello stesso modo in cui fareste per qualsiasi altro programma.
Perché funzioni, tutti i compilatori devono concordare su come i moduli comunicano tra loro. Ciò include cose come: quale simbolo indica gli oggetti che esportano e importano, in che formato sono i dati, come gli argomenti vengono passati alle funzioni, chi assegna e libera la memoria, quando e come. A volte, le lingue normalmente fanno le cose in modo diverso e hai bisogno di una parola chiave speciale. C'erano un sacco di varianti diverse, ma le ABI moderne tendono ad essere progettate per renderlo più semplice di quanto non fosse in passato.
Un esempio specifico: C ++ e C sono linguaggi molto simili, ma affinché un programma C e un programma C ++ possano richiamarsi reciprocamente, il programma C ++ deve dichiararli come extern "C"
. Questo perché C può esportare solo un simbolo denominato foo
, ma C ++ ti consente di dichiarare sia int foo(int)
che int foo(double)
come funzioni diverse, quindi deve dare loro nomi diversi internamente. Per comunicare con i moduli in altre lingue, è necessario disattivarlo. extern "C"
dice al compilatore C ++ di usare lo stesso nome che un compilatore C avrebbe per quella funzione. In Fortran, tutti gli argomenti delle funzioni possono essere modificati, il che significa che per chiamare f (x) in Fortran, un programma C dovrebbe chiamare f (& x). In C, una stringa viene terminata da un byte nullo che devi cercare, ma in molti altri linguaggi, i primi pochi byte di ogni stringa sono la sua lunghezza. C consente alle funzioni, la più famosa printf()
, di prendere qualsiasi numero e tipo di argomenti, e questo non gli consente di passare argomenti in alcuni dei modi in cui altri linguaggi l'hanno fatto.
Ci sono molte varianti, ma se i tuoi compilatori possono scrivere codice che parla l'un l'altro, ci saranno alcune convenzioni che entrambe sanno come usare.