फोरट्रान 77 कोड को C # में परिवर्तित करना


14

मैं एक Fortan77 प्रोग्राम को C # में बदलने का प्रयास कर रहा हूं। मेरे पास कोड की लगभग 650 लाइनों के साथ एक सबरूटीन है और सभी जगह भयानक GOTO स्टेटमेंट्स हैं। मुझे बहुत परेशानी हो रही है कि यह पता लगाने के लिए कि यह क्या करता है, सबरूटीन के प्रवाह की कल्पना करना शुरू कर देता है।

क्या इस तरह के अनुभव के साथ कोई है जो मुझे इस सबरूटीन का अवलोकन करने के बारे में कोई सलाह दे सकता है? क्या इस प्रकार के रूपांतरण को गति देने या सुविधाजनक बनाने के लिए कुछ उपकरण उपलब्ध हैं?


1
जैसा कि यह सवाल अधिक खुला है और सलाह की तलाश में है, यह प्रोग्रामर एसई पर अधिक उपयुक्त होगा

4
आप पर विचार किया है सिर्फ नेट में यह संकलन का उपयोग कर silverfrost.com/11/ftn95/ftn95_fortran_95_for_windows.aspx और फिर बस विधानसभा संदर्भित?

@ शॉन, यह एक अच्छा विचार है शॉन। मुझे लगता है कि अगर मैं कहीं भी reprogramming के साथ नहीं मिल सकता है।
user643192

2
मुझे आप पर
दया आती है

1
मैं आपकी जगह पर हूं। यह मेरे करियर का सबसे बुरा दिन था।
उपयोगकर्ता

जवाबों:


10

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

देखें कि क्या आप तार्किक रूप से लोटो या फ़ंक्शन कॉल के साथ GOTOs को बदल सकते हैं; यदि परिणामी आरेख वृक्ष-संरचना के रूप में है, तो GOTO का सहारा लिए बिना C # में बदलना अपेक्षाकृत आसान है। हालांकि अंत में, आपको आत्मविश्वास के साथ परिणाम को बनाए रखने और उपयोग करने में सक्षम होने के लिए कोड को समझने की आवश्यकता होगी।


अच्छा सुझाव, धन्यवाद! जीओटीओ के बयानों पर रोक लगाई जानी चाहिए।
user643192

6
@ user643192, gotoअगर समझदारी से लागू किया जाए तो एक बेहद उपयोगी चीज है। आप एक कुशल, बड़े राज्य ऑटोमेटन को लागू किए बिना नहीं जाएंगे goto। आपको निश्चित रूप से उन्हें अपने उत्पन्न कोड में भी आवश्यकता होगी।
एसके-लॉजिक

3
ऐसे उपकरण हैं जो फोरट्रान कोड से फ्लोचार्ट खींच सकते हैं। उदाहरण: home.comcast.net/~lchen223621
NoChance

ओपी: आप रेट्रो-प्रभावी रूप से प्रतिबंध नहीं लगा सकते। @EmmadKareem: बहुत उपयोगी सुझाव।
क्रि।

मैंने वही किया जो डैनियल बी ने यहाँ सुझाया और फोरट्रान कोड का ब्लॉक संस्करण बनाया। इससे बहुत मदद मिली, इसलिए इसके लिए धन्यवाद। एसके-लॉजिक के लिए, आप शायद GOTO के बारे में सही हैं। मेरी पहली दोपहर कोड को देखने के बाद मेरी टिप्पणी थी ... और उसमें बहुत सारे गोट्स हैं: ओ (
user643192

12

ऊपर डैनियल बी ने जो लिखा है, उसके अलावा मैं निम्नलिखित कहूंगा:

सबसे पहले, डोटनेट के लिए फोरट्रान के साथ काम करने के लिए अपना फोरट्रान कोड प्राप्त करें। यदि आप "रिप्रोग्रामिंग के साथ कहीं भी नहीं जा सकते", लेकिन इससे पहले कि आप किसी भी रीप्रोग्रामिंग का प्रयास करें। यह एक छोटा कदम होगा, लेकिन सही दिशा में।

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

फिर, जब आप C # में कोड को फिर से लिख रहे हैं, तो आप परीक्षण सूट के तहत अपना कोड चला रहे होंगे, और यह आपको बता रहे होंगे कि आपका कोड ठीक से काम कर रहा है या नहीं, अर्थ है कि क्या यह Fortran के समान सटीक उत्पादन कर रहा है कोड एक ही इनपुट दिया। इसके बिना, आप खो जाएंगे।

मैं @ एसके-तर्क से सहमत नहीं हूं, आपको अपने सी # कोड में किसी भी गोटो का उपयोग नहीं करना चाहिए।

(लेकिन उम्मीद है कि एक बार आपने डॉटनेट के तहत फोरट्रान कोड काम कर लिया है, तो आपको स्पेगेटी कोड के एक टुकड़े को सी # में परिवर्तित करने के लिए अपना समय बर्बाद करने का कोई कारण नहीं दिखाई देगा।)


1
मन समझा, क्यों "तुम नहीं करना चाहिए"? कोई तर्कसंगत तर्क, "सभी का मानना ​​है कि यह बुराई है" के अलावा? मैं दो अत्यंत महत्वपूर्ण मामलों में जहां आप नामित है गोटो उपयोग करने के लिए, अन्यथा आप या तो अपठनीय या unefficient कोड (या दोनों) लेखन पहुंच जाएंगे।
एसके-लॉजिक

@ एसके-तर्क मैंने नहीं लिखा "आपको नहीं करना चाहिए", मैंने लिखा "आपको नहीं होना चाहिए"। किसी भी मामले में, यह यहाँ है: गोटो बयान लगभग सभी परिस्थितियों में इसकी शुद्धता को समझने और सत्यापित करने के लिए कोड को बहुत कठिन बनाते हैं, और उनकी कथित दक्षता लाभ एक मिथक और गलत धारणा के बीच कुछ है। बेशक इन्हें और स्पष्ट किया जा सकता है, लेकिन कृपया ऐसा करने से बचना चाहिए, यह इस चर्चा का स्थान नहीं है। हमें असहमत होने के लिए सहमत होना चाहिए।
माइक नाकिस

2
gotoस्टेटमेन्स की अनुपस्थिति भी आपको कुछ मामलों में समझने के लिए कोड को बहुत कठिन बना सकती है (और एक राज्य मशीन इस तरह के मामले का सबसे महत्वपूर्ण उदाहरण है)। मैं सिर्फ इस बेवकूफ़ गोटो को कोसने वाले धर्म को नहीं खड़ा कर सकता - लोग उसी अर्थहीन बीएस को दोहराते रहते हैं, जिस कारण गोटो को हानिकारक माना जाता है।
एसके-लॉजिक

आप उन लोगों में से हैं, जो अंतिम शब्द, एह नहीं होने पर इसे बर्दाश्त नहीं कर सकते? सी -: =
माइक नाकिस

1
@ ridecar2, मैं सभी समय में अच्छी राज्य मशीनें लिखता हूं। मैं enums और स्विच स्टेटमेंट का उपयोग करता हूं, और मैंने कंपाइलर को जनरेट मशीन भाषा में GOTO लिखने दिया। मैंने वास्तव में एक राज्य मशीन का उदाहरण कभी नहीं देखा है जो स्पष्ट रूप से जीओटीओ के साथ लिखा गया है। एक उदाहरण के लिए एक सूचक पोस्ट करने के लिए देखभाल?
जॉन आर। स्ट्रोक १०'१२

3

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

जो सुझाव दिया गया है उससे एक और दृष्टिकोण (जरूरी नहीं कि यह एक बेहतर हो, यह सिर्फ एक और है):

A - व्यावसायिक ज्ञान और फ़ंक्शन के आधार पर C # में कोड को फिर से लिखने पर विचार करें, फ़ोर्ट्रन कोड का उपयोग केवल संदर्भ के रूप में करें

बी-कॉन्सडर एक वाणिज्यिक उपकरण का उपयोग करता है जो रूपांतरण कार्य करता है - उदाहरण: डेटाटेक

यदि दिनचर्या एक मानक कार्य या एक फ़ंक्शन का प्रतिनिधित्व करती है जिसे आप तैयार किए गए dll (जैसे संख्यात्मक एकीकरण) के लिए खरीद सकते हैं, तो मैन्युअल अनुवाद के बजाय मानक फ़ंक्शन या वाणिज्यिक उत्पाद का उपयोग करें, और आपकी समस्या हल हो गई है।

यदि उपरोक्त में कटौती नहीं होती है, तो इस प्रश्न का उत्तर दें:

क्या मुझे कोड को ऑप्टिमाइज़ करने या इसे चलाने की ज़रूरत है। दूसरे शब्दों में, कोड को बेहतर बनाने के लिए 500 घंटे खर्च करने का व्यवसाय मूल्य क्या है?

यदि अनुकूलन में कोई मूल्य नहीं है, तो कोड लाइन को लाइन से अनुवाद करें और आप कर रहे हैं।

यदि यह अभी भी अच्छा नहीं है, तो:

0-फोरट्रान कोड लाइन को सी # में लाइन में बदलें (या फोर्टन सीएलआर का उपयोग करें)

1-एक त्वरित परीक्षण सुनिश्चित करें कि यह चलता है

2-एक और अधिक अनुकूलित फैशन में कोड लिखने में मदद करने के लिए एक री-फैक्टरिंग (वाणिज्यिक उपकरण उपलब्ध हैं) का उपयोग करें।

सौभाग्य।


2

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

F66 के पास या तो नहीं था, लेकिन F77 करता है। यह इस बात पर निर्भर करता है कि कोडर F66 से F77 में परिवर्तित था या नहीं (जैसे कई आज C से C ++ या C ++ से C # हैं) जहाँ वे F66 की तरह F77 का उपयोग कर रहे हैं। यदि आप पैटर्न को कोडिंग में रख सकते हैं, तो परिवर्तित करना बहुत आसान है।


1

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

इसके अलावा, व्यवस्थित हो , जल्दी नहीं है, और कागज के उपयोग के बहुत सारे कार्यक्षमता का पता लगाने के।


1

इस तरह से मैं वास्तव में सी # में कोड का अनुवाद करने के बारे में गया। चूंकि .NET गोटो स्टेटमेंट्स का समर्थन करता है, इसलिए मैंने पहली बार पूरे फोरट्रान कोड को लिया और इसे एक नई विधि में चिपकाया, साथ ही, कई तरीके भी थे, जैसे कि फोरट्रान रूटीन और सबरूटीन थे।

कंपाइलर एक लाख त्रुटियों के साथ आया, ज्यादातर अघोषित चर और गलत ब्लॉक स्टेटमेंट फॉर्मेटिंग के बारे में, जिसे मैंने एक के बाद एक क्लियर किया। मुझे कुछ फोरट्रान-विशिष्ट कोड भी लिखना पड़ा, जैसे I / O स्टेटमेंट और उस तरह का सामान। जब ऐसा किया गया तो मेरे पास मूल कोड की एक सटीक प्रतिकृति थी।

विजुअल स्टूडियो के अच्छे प्रारूपण के कारण लॉजिकल ब्लॉक मूल कोड की तुलना में पहचान करने में बहुत आसान थे। और मैं एक-एक करके गोटो बयानों को खोलना शुरू कर सकता हूं।

इस अनुभव से मुझे यह कहना है कि कुछ ऐसे मामले हैं जहाँ गोटो के बयान वास्तव में बहुत ही उपयोगी होते हैं ताकि एक ही कोड को बार-बार लिखने से बचने के लिए उपयोगी हो, हालांकि बहुत सारे मामलों में विधियों का उपयोग करके और बार-बार कॉल करके वही हासिल किया जा सकता है। ।

मैंने अपने सुधार कोड पर मूल कोड और perfrom नियमित जांच को संकलित करने के लिए सिल्वरफ्रॉस्ट के मुफ्त संस्करण का भी उपयोग किया ताकि यह सुनिश्चित हो सके कि पुन: स्वरूपण त्रुटियों का उत्पादन न करें।


0

इस तरह के कोड को "डिकम्पोज करने" के लिए एक सामान्य दृष्टिकोण निम्नलिखित होगा:

  • पहले इसे निचले स्तर के रूप में संकलित करें (जैसे, एलएलवीएम)
  • उस पर SSA- परिवर्तन करें (यह आपके स्थानीय चरों को साफ करने में मदद करेगा)
  • विडंबनापूर्ण नियंत्रण प्रवाह को विभाजित करें (यदि कोई हो)
  • लूप और आईएफएस का पता लगाएं और उन्हें उचित उच्च स्तरीय निर्माणों के साथ बदलें

एलएलवीएम का अपना सी बैकेंड आपको पहले ड्राफ्ट के साथ प्रदान कर सकता है।


0

बिना शक के सबसे अच्छा तरीका है कि पहले फोरट्रान कोड को एक बेहतर संरचित और तार्किक तरीके से फिर से लिखना / फिर से लिखना। यह आपको C # को पोर्ट करने का प्रयास करने से पहले मूल तर्क को समझने के लिए मजबूर करेगा।

यहां बताया गया है कि मैं इसे कैसे देखूंगा:

  • मौजूदा कोड को समझें और यदि आवश्यक रिफ्लेक्टर और यहां तक ​​कि इसे FORTRAN में फिर से लिखें तो आप आसानी से परीक्षण कर सकते हैं कि यह काम करता है।
  • C # पर रिफलेक्ट किए गए कोड को पोर्ट करें

एक स्वचालित कोड कनवर्टर के साथ अपना समय बर्बाद मत करो जो सी # गोटो और लेबल का समर्थन करता है, क्योंकि सी # करता है के बाद से मूल FORTRAN के रूप में गोटो बयानों की एक ही गड़बड़ के साथ समाप्त हो जाएगा।


0

किसी और चीज को असफल करते हुए, आप C # में गोटो स्टेटमेंट का उपयोग कर सकते हैं ।

गोटो बयान एक लेबल बयान करने के लिए सीधे कार्यक्रम नियंत्रण हस्तांतरित करता है।

गोटो का एक सामान्य उपयोग एक विशिष्ट स्विच-केस लेबल या स्विच स्टेटमेंट में डिफ़ॉल्ट लेबल पर नियंत्रण स्थानांतरित करना है ।

गोटो बयान भी गहरा नेस्ट छोरों से बाहर निकलने के लिए उपयोगी है ...


-2

किसी भी पुराने FORTRAN कोड को नई भाषा में परिवर्तित करने के लिए किसी को अपने विरासत कोड में कुछ बुनियादी चरणों के माध्यम से जाना चाहिए (1) स्थैतिक प्रकार की जाँच के लिए कोड को "IMPLICIT NONE" में परिवर्तित करें (2) सभी काटे गए सामान्य को पूर्ण आम में बदलें (3) निकालें समतुल्यता (4) FORTRAN 90 के मॉड्यूल को आम में परिवर्तित करती है

फिर आप अन्य भाषाओं में बदलने का प्रयास कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.