2013-08-14 14 views
12

Ho una libreria numerica in FORTRAN (credo FORTRAN IV) e voglio convertirlo in codice Python. Voglio un vero codice sorgente che posso importare su qualsiasi macchina virtuale Python --- Windows, MacOS-X, Linux, Android. Ho iniziato a farlo a mano, ma ci sono circa 1.000 routine nella libreria, quindi non è una soluzione ragionevole.Come posso convertire facilmente il codice FORTRAN in codice Python (codice reale, non wrapper)

+3

Purtroppo non ci sono strumenti di conversione (per quanto ne so). Senti doppiamente male per te ... prima di tutto, il numero di linee che devi convertire, ma soprattutto perché devi affrontare FORTRAN IV. – SethMMorton

+0

Anche il più spesso usato 'f2py' non fa un buon lavoro convertendo il codice Fortran in codice Python, quindi c'è ** sicuramente ** nessun metodo _easy_. –

+3

@KyleKanos f2py non converte il codice Fortran in Python. Crea un wrapper C attorno al codice Fortran che viene poi compilato su un oggetto libreria condiviso che Python può importare. – SethMMorton

risposta

9

modificare: informazioni aggiunto il NumPy

esiste Tale strumento per Fortran to Lisp o Fortran to C, o addirittura Fortran to Java. Ma non avrai mai uno strumento Fortran to Python, per una semplice ragione: a differenza di Fortran, Lisp o C, Python non ha GOTO [1]. E ci sono molti GOTO nel codice Fortran (specialmente Fortran IV). Anche se esiste un teorema di Jacopini che afferma che è possibile emulare GOTO con la programmazione strutturata, è troppo complicato implementare uno strumento di conversione della lingua reale (ed efficiente).

Quindi non solo avrete bisogno di tradurre il codice di 1000 routine, ma si dovrà anche capire ogni algoritmo, con tutte le sue goto embricate e tradurre l'algoritmo in un programma strutturato prima di scriverlo in Python. In bocca al lupo!

Ehi, perché pensi che un involucro sia cattivo? Windows, OSX e Linux hanno tutti i compilatori Fortran e C [2] e buoni involucri!

Per C (non la vostra lingua qui, ma f2c può essere un'opzione), non v'è SWIG, e Fortran ha f2py, ora integrato con numpy. SWIG ha qualche support for Android.

A proposito, invece di convertire in Python "puro", puoi usare numpy: le funzionalità di numpy sono simili a Fortran 90 (vedi un confronto here), quindi potresti considerare la prima traduzione dei tuoi programmi su F90 per una transizione più fluida . Sembra che ci sia anche un Numpy on Adnroid. E nel caso abbiate bisogno di numpy su Windows 64-bit, ci sono i binari here.

Se si decide di utilizzare i wrapper, gfortran viene eseguito su Linux (è sufficiente installare da pacchetti di distribuzione), Windows (MinGW) e Android. Se segui questa linea, non dimenticare di compilare il codice FIV, quindi c'è il solito problema del "ciclo di un viaggio" (di solito l'opzione del compilatore va bene). Probabilmente dovrai anche convertire manualmente alcune vecchie istruzioni non standard, non trovate nei moderni compilatori.

Hai anche, ovviamente, la possibilità di passare la lingua del progetto di Lisp o Java ...

[1] Ci si può chiedere: ma se GOTO è il problema, come mai c'è un Fortran a Java strumento? Bene, usa i trucchi con la JVM, che ha internamente il GOTO instruction. C'è anche un GOTO in bytecode Python (cerca JUMP here), quindi potrebbe esserci qualcosa da investigare qui. Quindi la mia precedente affermazione è errata: lo potrebbe essere uno strumento Fortran to Python, utilizzando trucchi bytecode come in Java. Ma resta da sviluppare e la disponibilità di buone librerie (come numpy, matplotlib, panda ...) lo rende inutile, per non dire altro.

+0

è possibile utilizzare goto per creare costrutti di programma strutturato. Il contrario non segue, se il codice gilly non è ovunque, potrebbe non essere possibile strutturarlo. Se dovessi affrontare questo compito, proverei prima a convertire in fortran moderno (sbarazzati di tutti i goto). Dovrebbe diventare subito evidente se il codice è ben strutturato o meno. – agentp

+1

Sto lavorando su un codice che ha quasi più di 20 anni (ancora mantenuto però) - e non ha GOTO. Immagino che sarebbe abbastanza comune per qualsiasi codice fortran ben mantenuto, dal momento che i GOTO sono davvero difficili da mantenere. Un convertitore fortran-to-python sarebbe comunque utile per tutto quel codice. – naught101

+0

@ naught101 Continuo a credere che sia meglio scrivere un wrapper, per trarre vantaggio sia dalla velocità di Fortran che dalle funzionalità di I/O e GUI di Python. Convertire il codice di calcolo in un linguaggio come Python, che è tra i più lenti in circolazione, non è la cosa saggia da fare. C'è una buona ragione per cui Python viene utilizzato per il codice e l'interfaccia colla, anche (o soprattutto!) In progetti di grandi dimensioni, come [Alliances] (http://www.salome-platform.org/). E l'integrazione del codice Fortran in numpy offre una sintassi simile a Matlab con ancora il tuo codice come backend. Vedo solo vantaggi per questo approccio. –

Problemi correlati