2013-08-14 30 views
12

Tôi có một thư viện số trong FORTRAN (tôi tin FORTRAN IV) và tôi muốn chuyển nó sang mã Python. Tôi muốn mã nguồn thực mà tôi có thể nhập trên bất kỳ máy ảo Python nào --- Windows, MacOS-X, Linux, Android. Tôi bắt đầu làm điều này bằng tay, nhưng có khoảng 1.000 thói quen trong thư viện, vì vậy đó không phải là một giải pháp hợp lý.Làm thế nào tôi có thể dễ dàng chuyển đổi mã FORTRAN sang mã Python (mã thực, không bao bọc)

+3

Đáng buồn thay, không có công cụ chuyển đổi nào (theo kiến ​​thức của tôi). Cảm thấy xấu gấp đôi cho bạn ... đầu tiên, số lượng các dòng bạn phải chuyển đổi, nhưng chủ yếu là bởi vì bạn phải đối phó với FORTRAN IV. – SethMMorton

+0

Ngay cả khi 'f2py' được sử dụng không làm tốt công việc chuyển đổi mã Fortran sang mã Python, vì vậy có ** chắc chắn ** không có phương thức _easy_. –

+3

@KyleKanos f2py không chuyển đổi mã Fortran sang Python .. nó tạo ra một trình bao bọc C xung quanh mã Fortran sau đó được biên dịch thành một đối tượng thư viện được chia sẻ mà Python có thể nhập. – SethMMorton

Trả lời

9

chỉnh sửa: thêm thông tin về NumPy

một công cụ như vậy tồn tại cho Fortran to Lisp, hoặc Fortran to C, hoặc thậm chí Fortran to Java. Nhưng bạn sẽ không bao giờ có một công cụ Fortran to Python, vì một lý do đơn giản: không giống như Fortran, Lisp hoặc C, Python không có GOTO [1]. Và có rất nhiều GOTO trong mã Fortran (đặc biệt là Fortran IV). Thậm chí nếu có một định lý bằng cách Jacopini nói rằng bạn có thể mô phỏng GOTO với lập trình có cấu trúc, thì quá cồng kềnh để thực hiện một công cụ chuyển đổi ngôn ngữ thực (và hiệu quả). Vì vậy, không chỉ bạn sẽ cần dịch mã số 1000 thói quen, nhưng bạn cũng cần phải hiểu mỗi thuật toán, với tất cả các hình ảnh imbricated và dịch thuật toán thành một chương trình có cấu trúc trước khi viết nó bằng Python. Chúc may mắn!

Hey, tại sao bạn cho rằng trình bao bọc là xấu? Windows, OSX và Linux đều có các trình biên dịch Fortran và C [2] và các trình bao bọc tốt!

Đối với C (không phải ngôn ngữ của bạn ở đây, nhưng f2c có thể là một tùy chọn), có SWIG và Fortran có f2py, hiện được tích hợp với numpy. SWIG có một số support for Android. Bằng cách này, thay vì chuyển sang Python "tinh khiết", bạn có thể sử dụng khả năng numpy: numpy tương tự như Fortran 90 (xem so sánh here), vì vậy bạn có thể xem xét trước tiên dịch chương trình của mình sang F90 để chuyển tiếp mượt mà hơn . Dường như cũng có một số Numpy on Adnroid. Và trong trường hợp bạn cần sần trên Windows 64 bit, có các tệp nhị phân here.

Nếu bạn quyết định sử dụng trình bao bọc, gfortran chạy trên Linux (chỉ cần cài đặt từ gói phân phối), Windows (MinGW) và Android. Nếu bạn đi dọc theo dòng đó, đừng quên bạn biên dịch mã FIV, do đó, có sự cố "một vòng lặp" thông thường (thường là một tùy chọn trình biên dịch là tốt). Bạn có lẽ cũng sẽ phải tự chuyển đổi một số câu lệnh cũ, không chuẩn, không tìm thấy trong các trình biên dịch hiện đại.

Bạn có cũng có, rõ ràng, tùy chọn để chuyển đổi ngôn ngữ dự án của bạn để Lisp hoặc Java ...

[1] Bạn có thể đặt câu hỏi: nhưng nếu GOTO là vấn đề, làm thế nào mà có một Fortran Java dụng cụ? Vâng, nó sử dụng các thủ thuật với JVM, trong đó có nội bộ là GOTO instruction. Ngoài ra còn có một GOTO trong bytecode Python (tìm JUMP here), do đó, có thể có một cái gì đó để điều tra ở đây. Vì vậy, tuyên bố trước của tôi là sai: có có thể là công cụ Fortran to Python, sử dụng các thủ thuật bytecode như trong Java. Nhưng nó vẫn còn để phát triển, và sẵn có của các thư viện tốt (như numpy, matplotlib, gấu trúc ...) làm cho nó không cần thiết, để nói rằng ít nhất.

+0

bạn có thể sử dụng goto để tạo cấu trúc chương trình có cấu trúc. Trò chuyện không tuân theo, nếu mã gilly nilly gotos khắp nơi, nó có thể không thể làm cho nó có cấu trúc. Nếu tôi đã phải giải quyết nhiệm vụ này, trước tiên tôi sẽ cố gắng chuyển đổi sang fortran hiện đại (loại bỏ tất cả các goto). Nó sẽ nhanh chóng trở nên rõ ràng nếu mã được cấu trúc độc đáo hay không. – agentp

+1

Tôi đang làm việc trên mã gần 20 năm tuổi (vẫn được duy trì mặc dù) - và nó không có GOTO. Tôi tưởng tượng rằng sẽ khá phổ biến đối với bất kỳ mã fortran được duy trì tốt, vì GOTO thực sự khó bảo trì. Bộ chuyển đổi fortran-to-python sẽ vẫn hữu dụng cho tất cả mã đó. – naught101

+0

@ naught101 Tôi vẫn tin rằng nó tốt hơn để viết một trình bao bọc, để được hưởng lợi từ cả tốc độ Fortran và các khả năng GUI và I/O tốt đẹp của Python. Chuyển đổi mã máy tính thành một ngôn ngữ như Python, vốn là một trong những thứ chậm nhất trong sự tồn tại, không phải là điều khôn ngoan để làm. Có một lý do chính đáng tại sao Python được sử dụng cho mã keo và interfacing, thậm chí (hoặc đặc biệt!) Trong các dự án lớn, như [Alliances] (http://www.salome-platform.org/). Và tích hợp mã Fortran để cung cấp một cú pháp giống như Matlab với mã của bạn như là phụ trợ. Tôi chỉ thấy lợi thế của phương pháp này. –

Các vấn đề liên quan