2008-11-09 11 views
14

का रूपांतरण किसी ने फोर्ट्रान 77 कोड सी ++ में एक बड़ा (हमारी 550,000 लाइनें) प्रोग्राम परिवर्तित किया है? आप किस नुकसान में भाग गए थे? क्या रूपांतरण एक सफलता थी? क्या आपने for_c (http://www.cobalt-blue.com/fc/fcmain.htm) जैसे टूल का उपयोग किया था? परिणामस्वरूप सी ++ कोड काफी तेज़ या धीमा था?फोरट्रान 77 कोड से सी ++

+3

ओह वाह, मैं आपको ईर्ष्या नहीं देता :) –

+0

आप क्यों परिवर्तित कर रहे हैं? –

+4

आप पुराने मजाक को जानते हैं: "आरएम * एफ आपके सभी किलेन स्रोत को मुफ्त डिस्क ब्लॉक में बदलने के लिए एक स्वचालित उपकरण है ताकि आप इसे सही लिखना शुरू कर सकें"। –

उत्तर

3

मैंने एक बार इसका इस्तेमाल किया: http://manpages.ubuntu.com/manpages/hardy/man1/f2c.html एक छोटे किले कार्यक्रम को सी में परिवर्तित करने के लिए रूपांतरण सफल रहा। किसी भी प्रकार की गति परिवर्तन का पता लगाने के लिए कोड काफी जटिल नहीं था।

चूंकि आपका प्रोग्राम बड़ा हो गया है, इसलिए मुझे वास्तव में पता नहीं है कि सबकुछ मेरे साथ क्या चल रहा है या नहीं।

+0

मैंने कई वर्षों पहले एक मध्यम आकार के फोर्टन कोड पर f2c का उपयोग किया था। अनुवाद के माध्यम से पहले से ही खराब गुणवत्ता (पठनीयता शर्तें) फोर्टन कोड डरावनी हो गई है। इसे पढ़ने योग्य सी को पॉलिश करने के लिए बहुत सारे मैन्युअल प्रयास किए गए। – nsanders

9

विचार करने के लिए बहुत सी चीजें हैं।

वास्तव में लेने के लिए दो पथ हैं। एक सी के लिए लाइन रूपांतरण द्वारा सीधी रेखा करना है। इसके द्वारा मेरा मतलब है कि प्रत्येक किसान बयान एक समान सी कथन के लिए है।

लेने का दूसरा तरीका एक पुनर्लेख है, और 500k लोक + के साथ यह अधिक काम होगा। इस तरह के आकार के साथ, मैं निश्चित रूप से अनुवाद करने के लिए एक उपकरण की तलाश करूंगा, जैसे f2c। एक सीधे बंदरगाह के लिए

मुद्दे ...

gotos सीधे अनुवाद करने, आप गोटो लक्ष्यों के लिए लेबल बनाने के लिए की आवश्यकता होगी।

label10:; 

    goto label10; 

ऐरे सबस्क्रिप्टिंग एक संभावित समस्या है। सी शून्य आधारित है, फोर्ट्रान 1 आधारित है, इसलिए एरे को फोर्टन कोड में एक बड़ा आयाम करने की आवश्यकता है।

वास्तविक * 4 एक (10,20)

#define XMAX 10 + 1 
#define YMAX 20 + 1 
float a[XMAX][YMAX]; 

पाश इस तरह लिखा जा करने की अनुमति हो जाता है।

for (x = 1; x <= XMAX; x++) 
    for (y = 1; y <= YMAX; y++) 
     a[x][y] = 0.0f; 

सी सरणी का उपयोग पंक्ति प्रमुख क्रम में है, जबकि फोर्टन कॉलम प्रमुख है। जो एक प्रदर्शन समस्या हो सकती है। यदि यह कोई समस्या बन जाती है, तो आप को किसी प्रकार की मैक्रो परिभाषा के साथ हल करने में सक्षम हो सकते हैं जो ऑर्डर या सरणी सबस्क्रिप्ट को उलट देता है। असल में आप एक सब आधारित लिपियों में से एक को मैक्रो घटा सकते हैं ताकि इसे एक आधारित सरणी की तरह दिख सके, वास्तव में शून्य आधारित सरणी पर नक्शा लगाएं।

वास्तविक * 8 एक (xmax, YMAX) एक (4,2) = 3,14

#define A(X,Y) a[Y][X] 
double a[XMAX][YMAX]; 
A(4,2) = 3.14; 

fortran इकाई कब stdio प्रकार फाइलों के साथ नकली जा सकता है। आप इकाई 19, तो

FILE *fp19 = fopen("file","mode"); 

उपयोग कर रहे हैं वहाँ आप अपनी फ़ाइलों में fortran गाड़ी नियंत्रण उपयोग कर रहे हैं गाड़ी पर नियंत्रण के साथ मुद्दों हो सकता है। इकाइयों 5 और 6 को आसानी से stdin के साथ संदर्भित किया जा सकता है, और बिना फॉपेन के stdout।

फ़ंक्शन के प्रिंटफ़ परिवार के साथ कई प्रारूपों को संभाला जा सकता है। कुछ फोर्ट्रान सरणी io से निपटने के लिए आपको अतिरिक्त लूप जोड़ना पड़ सकता है।

लिखें (6, 200) (PROJ (जेड, 4), जेड = 1, 20)

int z; 
for (z = 1, z <= 20; z++) 
    printf("%lf ", proj[z][4]); 


ओ f2c का उपयोग कर शायद यह करने के लिए सबसे तेज़ तरीका है। फिर आप अपने आरटीएल के साथ फंस गए हैं।
ओ सीधी बंदरगाह करना एक व्यवहार्य चीज है। समय लेने वाला, लेकिन करने योग्य
o यदि आप इसे दीर्घकालिक बनाए रखना चाहते हैं, तो मैं एक पुनर्लेख की सिफारिश करता हूं। बहुत समय लेने वाला, शायद तेज़, लेकिन लंबे समय तक चलने योग्य

खुशी से किसी भी मामले में आपके पास विकास प्रयास में सहायता के लिए यूनिट परीक्षणों का एक सेट बनाने के लिए आधारभूत आधार के रूप में उपयोग करने के लिए मूल कार्यक्रम है।

+0

हां, मैं सरणी सबस्क्राइबिंग के बारे में सोच रहा हूं। असल में एकल आयामी सरणी नहीं बल्कि एकाधिक आयामी सरणी मुझे कुछ हद तक चिंता करते हैं। बीटीडब्ल्यू, फोर_C के पास यह स्वयं का आरटीएल भी है कि यह substitu लिखने के लिए टीईएस और पढ़ें। –

+0

f2c एक उपयोगी उपकरण है यदि आप फोरट्रान 77 को संकलित करना चाहते हैं और सी संकलक है। अगर आप फोरट्रान को सी या सी ++ में परिवर्तित करना चाहते हैं और इसे संकलित करने के अलावा उत्पन्न कोड के साथ कुछ भी करना चाहते हैं तो यह अविश्वसनीय रूप से खराब है। –

9

यह एविलटेक की सलाह में जोड़ता है। ध्यान रखें कि लिंक फोरट्रान 77 और सी/सी ++ कोड के लिए यह काफी आसान है, ताकि आप अपने आवेदन के कुछ हिस्सों को क्रमशः रूपांतरित कर सकें और पुराने भागों के साथ उन्हें एक साथ जोड़ सकें। यदि आप ऐसा करते हैं तो आपको सभी सामान्य फोर्टन/सी विसंगतियों (पंक्ति/कॉलम-प्रमुख सरणी, सरणी अनुक्रमण आदि) के बारे में सोचना होगा, लेकिन यह आपको एक बार में अपने पूरे ऑटो-अनुवादित कोडबेस को डिबग करने का दर्द बचाएगा ।

राष्ट्रीय (डीओई) प्रयोगशालाओं में इस तरह के कई बड़े संकर कोड हैं, जिनके पुराने फोरट्रान कोड में महत्वपूर्ण निवेश है। यदि आप इस मार्ग पर जाते हैं, तो आप Babel का उपयोग करने पर विचार कर सकते हैं, जिसे एक ही ऐप में सी, सी ++, फोरट्रान, फोर्ट्रान 9 0, पायथन और जावा के बीच घटकों को साझा करने की अनुमति देने के लिए विकसित किया गया था। प्रयोगशालाओं में इसके लिए प्रेरणा वास्तव में बड़ी सिमुलेशन के लिए विभिन्न टीमों द्वारा निर्मित भौतिकी मॉडल को एक साथ बांध रही है, लेकिन आपको यह भी आपके कोड को बदलने के लिए उपयोगी हो सकता है। यह सक्रिय रूप से कई परियोजनाओं पर बनाए रखा जाता है और उपयोग किया जाता है, हालांकि आप जो भी करने की कोशिश कर रहे हैं उसके लिए यह थोड़ा जटिल हो सकता है।

+0

या। वृद्धिशील बंदरगाह, एक बहुत अच्छा विचार है। – EvilTeach

+0

हां, वृद्धिशील करने योग्य होगा। बीटीडब्ल्यू, हमारे पास हमारे ऐप में पहले से ही सी और सी ++ कोड की 10,000 लाइनें हैं। एफ 77 कोड वास्तव में एक Win32 DLL में है जो सी, सी ++ या वीबी द्वारा कॉल करने योग्य है। –

2

आप Promula पर देखना चाहते हैं। यह कई अन्य स्वचालित अनुवादकों की तुलना में अधिक पठनीय सी कोड उत्पन्न करता है। मैंने सीधे प्रोमुला का उपयोग नहीं किया है, लेकिन मैंने सी से सी ++ तक प्रोमुला आउटपुट की उचित मात्रा में परिवर्तित कर दिया है। सी कोड को कानूनी सी ++ में साफ करना आसान है, लेकिन निश्चित रूप से इसे वास्तव में अच्छा C++ बनाने के लिए और अधिक प्रयास करना पड़ता है।

6

मेरी प्रतिक्रिया यह है कि आप इसे क्यों परिवर्तित करना चाहते हैं।

एक बड़े फोरट्रान कोड बेस के साथ उत्पाद को विकसित करने का सवाल 1 99 0 के दशक में कई कंपनियों द्वारा देखा गया था। यह है कि कनवर्ट करना है, फोरट्रान के साथ रहें या हाइब्रिड बनाएं। मुझे लगता है कि बहुमत ने हाइब्रिड दृष्टिकोण का चयन किया, आमतौर पर यूजर इंटरफेस के लिए सी ++ और पृष्ठभूमि में मूल फोरट्रान कोड बेस।

मेरा सुझाव है कि http://arnholm.org/software/cppf77/cppf77.htm पर उपलब्ध कार्स्टन आर्नोहोम द्वारा "सी ++ और फोरट्रान 77 का उपयोग करके मिश्रित भाषा प्रोग्रामिंग" को देखने के लिए इंटरनेट के शुरुआती दिनों में यह दस्तावेज़ अच्छी तरह से जुड़ा हुआ था।

यह दस्तावेज़ वर्णन करता है कि सी ++ और फोरट्रान युक्त एप्लिकेशन कैसे है। मैं यह नहीं कह सकता कि तकनीकी विवरणों में से कुछ पुराना हो सकता है लेकिन यह दस्तावेज़ एक ऐसे प्रोजेक्ट से बाहर आया जो सी ++ के विकास के लिए उपयोग करना चाहता था लेकिन इसमें एक बड़ा फोरट्रान कोड बेस था।

आप अच्छी किताबों के स्टोर से उपलब्ध बार्टन और नाकमैन द्वारा "वैज्ञानिक और इंजीनियरिंग सी ++: उन्नत तकनीक और उदाहरणों के साथ एक परिचय" को भी देख सकते हैं। यह पुस्तक फोरट्रान प्रोग्रामर के लिए सी ++ सिखाती है। इसमें सी ++ से फोरट्रान कोड में रैपर लिखने के कुछ उदाहरण हैं। यह फोर्ट्रान पहलू को अनदेखा कर एक अच्छी सी ++ किताब है। यह मानक निर्धारित करने से पहले लिखा गया था लेकिन मतभेद बहुत बड़े नहीं हैं।

+0

हमारी कंपनी में, हमने पाया है कि फोरट्रान प्रोग्रामर ढूंढना मुश्किल हो रहा है। – EvilTeach

0

मैंने अपने आवेदन पर काम किया है कि, उसके दिल पर, for_c का उपयोग कर फोरट्रान से कोड परिवर्तित किया गया था। यह कोड बनाया गया भगवान भयानक था। इसे बनाए रखना बहुत मुश्किल था क्योंकि इसमें से अधिकांश अनिश्चित था। सौभाग्य से वह कोड बहुत स्थिर था और यह दुर्लभ था कि इसके साथ कुछ भी किया जाना था।

हालांकि, यह कई साल पहले किया गया था - विंडोज के शुरुआती 16-बिट वर्षों के आसपास। शायद for_c अब बेहतर है?

संबंधित मुद्दे