2013-08-14 13 views
12

Mam biblioteki numerycznej w FORTRAN (myślę, że FORTRAN IV) i chcę przekonwertować go do kodu Pythona. Chcę prawdziwy kod źródłowy, który mogę zaimportować na dowolnej maszynie wirtualnej Python --- Windows, MacOS-X, Linux, Android. Zacząłem to robić ręcznie, ale w bibliotece jest około 1000 procedur, więc nie jest to rozsądne rozwiązanie.Jak mogę łatwo przekonwertować kod FORTRAN do kodu Pythona (prawdziwy kod, nie opakowania)

+3

Niestety, nie ma narzędzi do konwersji (według mojej wiedzy). Poczuj się podwójnie zły ... po pierwsze, liczba linii, które musisz zmienić, ale głównie dlatego, że musisz poradzić sobie z FORTRANEM IV. – SethMMorton

+0

Nawet często używane 'f2py' nie robi dobrej roboty, konwertując kod Fortrana do kodu Pythona, więc istnieje ** zdecydowanie ** nie _łatwo_ metoda. –

+3

@KyleKanos f2py nie konwertuje Fortran do kodu Pythona .. tworzy wokół kodu Fortran owijkę C, która jest następnie kompilowana do obiektu biblioteki współdzielonej, który Python może zaimportować. – SethMMorton

Odpowiedz

9

edit: dodano informacje na numpy

Takie narzędzie istnieje Fortran to Lisp lub Fortran to C lub nawet Fortran to Java. Ale nigdy nie będziesz mieć narzędzia Fortran do Pythona z prostego powodu: w przeciwieństwie do Fortran, Lisp lub C, Python nie ma GOTO [1]. I istnieje wiele GOTO w kodzie Fortrana (zwłaszcza Fortran IV). Nawet jeśli istnieje twierdzenie z Jacopini stwierdzające, że można emulować GOTO za pomocą programowania strukturalnego, jest ono zbyt uciążliwe, aby zaimplementować prawdziwe (i wydajne) narzędzie do konwersji języków.

Więc nie tylko trzeba będzie tłumaczyć kod 1000 rutyny, ale trzeba także zrozumieć każdy algorytm, ze wszystkimi jego imbricated GOTOS i tłumaczyć algorytm do programu zorganizowanego przed zapisaniem go w Pythonie. Powodzenia!

Hej, dlaczego myślisz, że opakowanie jest złe? Windows, OSX i Linux mają kompilatory Fortran i C [2] oraz dobre opakowania!

Dla C (nie swoim języku tutaj, ale f2c może być opcja) istnieje SWIG i Fortran ma f2py, teraz zintegrowane z numpy. SWIG ma około support for Android. Nawiasem mówiąc, zamiast konwertowania do "czystego" Pythona, możesz użyć numpy: funkcje numpy są podobne do Fortran 90 (zobacz porównanie here), więc możesz rozważyć najpierw tłumaczenie swoich programów na F90 w celu płynniejszego przejścia . Wydaje się, że istnieje również Numpy on Adnroid. A jeśli potrzebujesz numpy w 64-bitowym systemie Windows, są binaria here.

Jeśli zdecydujesz się na owijanie, gfortran działa na Linuksie (wystarczy zainstalować z pakietów dystrybucyjnych), Windows (MinGW) i Android. Jeśli przejdziesz dalej, nie zapomnij o kompilacji kodu FIV, więc istnieje zwykły problem z pętlą jednokrotną (zwykle opcja kompilatora jest w porządku). Prawdopodobnie będziesz musiał ręcznie przekonwertować niektóre stare, niestandardowe instrukcje, których nie ma w nowoczesnych kompilatorach.

Trzeba też oczywiście opcja, aby przełączyć język projektu do Lisp lub Java ...

[1] Można zapytać: ale jeśli GOTO jest problem, jak to jest Fortran Java narzędzie? Cóż, używa sztuczek z JVM, która ma wewnętrznie GOTO instruction. Istnieje również GOTO w bajtowym kodzie Pythona (poszukaj JUMP here), więc tutaj może być coś do zbadania. Więc moje poprzednie stwierdzenie jest błędne: istnieje może być narzędzie Fortran do Pythona, używając sztuczek kodu bajtowego, takich jak w Javie. Pozostaje jednak rozwijać się, a dostępność dobrych bibliotek (takich jak numpy, matplotlib, pandy ...) sprawia, że ​​jest to niepotrzebne.

+0

możesz użyć goto, aby utworzyć strukturalne konstrukcje programowe. Odwrotność nie następuje, jeśli kod nie będzie chodził w różnych miejscach, może nie być możliwe, aby to ustrukturyzować. Gdybym musiał rozwiązać to zadanie, najpierw spróbowałbym przekształcić się w nowoczesny fortran (pozbyć się wszystkich goto). Powinno szybko stać się oczywiste, jeśli kod jest ładnie zbudowany, lub nie. – agentp

+1

Pracuję nad kodem, który ma prawie ponad 20 lat (nadal zachowany) - i nie ma GOTO. Wyobrażam sobie, że byłoby to dość powszechne dla każdego dobrze utrzymanego fortranowego kodu, ponieważ GOTO są naprawdę trudne do utrzymania. Konwerter fortran-to-python nadal byłby przydatny dla całego tego kodu. – naught101

+0

@ naught101 Nadal uważam, że lepiej jest napisać wrapper, aby korzystać zarówno z prędkości Fortran, jak i z Pythona, ładnych interfejsów I/O i GUI. Konwersja kodu komputerowego na język taki jak Python, który jest jednym z najwolniejszych w swoim istnieniu, nie jest mądrym posunięciem. Jest dobry powód, dla którego Python jest używany do kodowania kleju i łączenia, nawet (a zwłaszcza!) W dużych projektach, takich jak [Alliances] (http://www.salome-platform.org/). A integracja kodu Fortran do numpy oferuje składnię podobną do Matlab, a Twój kod nadal jest backendem. Widzę tylko zalety tego podejścia. –

Powiązane problemy