Collegamento di due o più linguaggi di programmazione diversi

2

Vorrei chiedere come il software di ottimizzazione scritto in C / C ++ può essere collegato al software di simulazione scritto in FORTRAN o in qualsiasi altra lingua. Ho copiato la sezione dell'articolo del journal di Singh e Chakrabarty (2011) .

In the present study, MODFLOW 2000 and MT3DMS 5.0 are linked as independent modules with the optimization code. Modifications are made to the codes of the simulators in such a way that they can be run through input files, and both of them are then compiled. One of the files required to run MODFLOW 2000 is prepared by the optimization algorithm. This file contains the latest values of the decision variables. The NSGA II separately calls both MODFLOW 2000 and MT3DMS 5.0 in their compiled forms as independent modules. MODFLOW 2000 uses the file prepared by NSGA II to calculate hydraulic head and prepare an output file containing these values. Similarly, MT3DMS 5.0 calculates contaminant concentrations at selected locations and produces an output file containing the concentration values. The output files produced by the simulators are used by NSGA II as input files to produce updated values of the decision variables. The optimization problem, thus, runs until convergence. Obviously, writing of interface programs for linking codes written in different languages is altogether eliminated in this technique of linking.

Credo che da qui posso andare avanti con le mie ricerche. Grazie a tutti.

    
posta Surajit 24.08.2015 - 08:27
fonte

3 risposte

16

Collegamento del codice (utilizzando il linker , ad esempio ld spesso avviato da gcc o gfortran comandi di compilazione) scritto in due lingue diverse è specifico dell'implementazione. Viene spesso chiamata interfaccia di funzione straniera . Dipende da chiamate convenzionali specifiche per le implementazioni.

Su Linux, con il codice compilato da gfortran e gcc (entrambi dal compilatore GCC ) è abbastanza facile (in in particolare perché condividono entrambi un comune strato intermedio e back-end della raccolta di compilatori Gnu). La documentazione di gfortran ha un capitolo sulla programmazione di lingue miste

A proposito, puoi creare due processi (ad esempio, eseguendo due programmi diversi, o gli stessi, forse codificato in due lingue diverse) comunica usando la comunicazione tra processi ; questo è fornito dal sistema operativo , quindi è specifico per il sistema operativo. Su Linux e POSIX puoi usare pipe (7) -s, socket(7) -s, in particolare unix (7) ones (e sondaggio (2) in modo appropriato in alcuni ciclo di eventi ), memoria condivisa (vedi shm_overview (7) & sem_overview(7) per la sincronizzazione con i semafori), ecc. Leggi Programmazione Linux avanzata . Potresti essere interessato a Chiamate a procedure remote (ad es. JSON -RPC , ....), MPI , ecc ...

PS. Non chiamare il collegamento IPC. Quando parli di software, linking significa utilizzare il linker (ad esempio per unire e amp ; mescola il codice da vari file oggetto e librerie in un singolo eseguibile ).

    
risposta data 24.08.2015 - 09:04
fonte
9

Penso che tutto quello che stanno dicendo qui è che ci sono due componenti (uno contenente MODFLOW 2000 e MT3DMS 5.0 e l'altro contenente NGSA II, con i due componenti scritti in lingue diverse) che usano semplicemente i file come meccanismo di comunicazione interprocesso (IPC) - quindi i due componenti sono logicamente collegati mentre non sono collegati come nel passo "linker" di una catena di compilatori-linker tradizionale.

Tuttavia, questa non è una tecnica innovativa in alcun modo, quindi o ho interpretato male le cose o gli autori stanno facendo girare un po 'troppo le cose nella citazione che hai enfatizzato.

    
risposta data 24.08.2015 - 08:43
fonte
1

Sembra che tu stia dicendo che ognuno dei programmi del simulatore è un eseguibile separato, e tu lo esegui con 1) scrivendo un file da inserire, 2) creando un processo per eseguirlo e aspettando che venga completato, e 3) leggendo il suo file dei risultati. Come si suol dire, in questo modo i vari moduli possono essere scritti in qualsiasi lingua, non importa quali lingue.

Il problema con questo approccio è la prestazione. Se impieghi più tempo di quanto desideri aspettare, è probabile che troverai, se usi questa tecnica , che una parte considerevole del tempo viene spesa in ognuno dei tre passaggi: scrittura, generazione di spawn e lettura. Se è così, ciò implica che il tempo di esecuzione potrebbe essere ridotto di un grosso fattore.

I compilatori come gcc e gfortran giocano insieme bene, come @Basile fa notare. Se i vari strumenti possono essere compilati e collegati insieme in un singolo file eseguibile e comunicare direttamente tramite il trasferimento dei dati in memoria, eliminando la necessità di formattazione e analisi dei file ed eliminando la necessità dell'avvio del processo, è possibile che si tratti di una grande accelerazione. Forse uno o due ordini di grandezza.

    
risposta data 29.08.2015 - 14:54
fonte

Leggi altre domande sui tag