سؤال

لقد جئت مؤخرًا للاحتفاظ بكمية كبيرة من كود FORTRAN الذي يعتمد على العمليات الحسابية العلمية.أواجه صعوبات في التعامل مع جميع الفروق الدقيقة في لغة عمرها أربعون عامًا، على الرغم من وجود كتابين من كتب المستوى التمهيدي في Google.الكود مليء بـ "تحسينات تحسين الأداء".هل لدى أي شخص أي أدلة أو نصائح عملية ل دي-تحسين FORTRAN إلى مستويات CS 101؟هل لدى أي شخص معرفة بكيفية عمل تحسين كود FORTRAN؟هل هناك أي "مشكلة" نموذجية في FORTRAN قد لا تحدث لمطور Java/C++/.NET الذي يتولى مسؤولية قاعدة بيانات FORTRAN 77/90؟

هل كانت مفيدة؟

المحلول

يتعين عليك نوعًا ما "الإحساس" بما كان على المبرمجين فعله في ذلك اليوم.الغالبية العظمى من التعليمات البرمجية التي أعمل بها أقدم مني وتعمل على أجهزة كانت "جديدة" عندما كان والدي في المدرسة الثانوية.

من مفاهيم FORTRAN الشائعة التي أتعامل معها والتي تؤذي سهولة القراءة هي:

  • كتل مشتركة
  • المتغيرات الضمنية
  • حلقتان أو ثلاث حلقات DO مع عبارات CONTINUE المشتركة
  • GOTO بدلاً من حلقات DO
  • عبارات IF الحسابية
  • GOTO المحسوبة
  • التكافؤ الحقيقي/العدد الصحيح/الآخر في بعض الكتل المشتركة

تتضمن استراتيجيات حل هذه المشكلات ما يلي:

  1. يحصل Spag / plusFORT, ، يستحق المال، فهو يحل الكثير منها تلقائيًا وخالي من الأخطاء (tm)
  2. انتقل إلى Fortran 90 إذا كان ذلك ممكنًا، وإذا لم يكن الأمر كذلك، فانتقل إلى Fortran 77 ذي التنسيق الحر
  3. قم بإضافة IMPLICIIT NONE إلى كل روتين فرعي ثم قم بإصلاح كل خطأ في الترجمة، وهو أمر يستغرق وقتًا طويلاً ولكنه ضروري في النهاية، يمكن لبعض البرامج القيام بذلك نيابةً عنك تلقائيًا (أو يمكنك كتابته)
  4. نقل جميع الكتل المشتركة إلى وحدات، أمر يستحق العناء
  5. تحويل عبارات IF الحسابية إلى كتل IF..ELSEIF..ELSE
  6. تحويل GOTOs المحسوبة إلى كتل SELECT CASE
  7. تحويل كافة حلقات DO إلى بناء جملة F90 الأحدث

    myloop: do ii = 1, nloops
        ! do something
    enddo myloop
    
  8. قم بتحويل أعضاء الكتلة المشتركة المكافئة إما إلى ذاكرة قابلة للتخصيص مخصصة في وحدة نمطية، أو إلى إجراءات الشخصية الحقيقية الخاصة بهم إذا كان Hollerith مخزنًا في REAL

إذا كانت لديك أسئلة أكثر تحديدًا حول كيفية إنجاز بعض مهام سهولة القراءة، فيمكنني تقديم النصيحة.لدي قاعدة رموز مكونة من بضع مئات الآلاف من أسطر Fortran والتي تمت كتابتها على مدار 40 عامًا وأنا مسؤول عنها بطريقة ما، لذلك ربما واجهت أي "مشاكل" ربما تكون قد وجدتها.

نصائح أخرى

صندوق صابون ليجاسي فورتران

لقد ساعدت في الحفاظ على/تحسين قاعدة أكواد فورتران القديمة لفترة طويلة، وفي أغلب الأحيان أفكر متغيرات مكونة من ستة أحرف هو على المال.لكن هذه النصيحة تميل إلى الجانب الفني؛والأمر الأكثر صرامة هو تنفيذ "الممارسات الجيدة".

  • إنشاء أسلوب الترميز المطلوب وإرشادات الترميز.
  • يتطلب مراجعة التعليمات البرمجية (أكثر من مجرد المبرمج!) لأي شيء يتم إرساله إلى قاعدة التعليمات البرمجية.(يجب أن يكون التحكم في الإصدار مرتبطًا بهذه العملية.)
  • البدء في بناء وتشغيل اختبارات الوحدة؛كما سبق اختبارات المعيار أو الانحدار.

قد تبدو هذه أشياء واضحة هذه الأيام، ولكن مع المخاطرة بالمبالغة في التعميم، أزعم أن معظم متاجر أكواد فورتران لديها ثقافة راسخة، وقد بدأ بعضها قبل وجود مصطلح "هندسة البرمجيات"، وأنه مع مرور الوقت أصبح ما يهيمن هو "أنجز الأمر الآن".(وهذا لا يقتصر على متاجر فورتران بأي حال من الأحوال.)

احتضان مسكتك

ولكن ماذا تفعل بقاعدة التعليمات البرمجية القديمة الموجودة بالفعل والجريئة؟وأنا أتفق مع جويل سبولسكي على إعادة الكتابة، لا.ومع ذلك، في رأيي متغيرات مكونة من ستة أحرف يشير إلى الاستثناء المسموح به: استخدم الأدوات البرمجية للانتقال إلى بنيات Fortran الأفضل. يمكن اكتشاف/تصحيح الكثير بواسطة محللي الكود (لفحص) وكاتبي التعليمات البرمجية (plusFORT).إذا كان عليك القيام بذلك يدويًا، فتأكد من أن لديك سببًا ملحًا.(أتمنى لو كان لدي إشارة إلى عدد الأخطاء البرمجية التي جاءت من إصلاح أخطاء البرامج، فهذا أمر متواضع.أعتقد أن بعض هذه الإحصائيات موجودة برمجة الخبراء C.)

من المحتمل أن أفضل هجوم في الفوز بلعبة Fortran gotchas هو الحصول على أفضل دفاع:معرفة اللغة بشكل جيد إلى حد ما.ولتحقيق هذه الغاية، أوصي ...كتب!

مكتبة شجرة فورتران الميتة

لقد حققت نجاحًا متواضعًا كـ "مزعج في ضمان الجودة" على مر السنين، لكنني وجدت أن التعليم ناجح، في بعض الأحيان عن غير قصد، وأن أحد أكثر الأشياء تأثيرًا هو وجود كتاب مرجعي في متناول اليد.أنا أحب وأوصي بشدة

فورتران 90/95 للعلماء والمهندسين, ، بقلم ستيفن ج.تشابمان

يعد الكتاب جيدًا مع Fortran 77 لأنه يحدد على وجه التحديد التركيبات التي لا ينبغي استخدامها ويعطي البدائل الأفضل.ومع ذلك، فهو في الواقع كتاب مدرسي ويمكن أن ينفد عندما تريد حقًا معرفة التفاصيل الجوهرية لـ Fortran 95، ولهذا أوصي به

شرح فورتران 90/95, بقلم مايكل ميتكالف وجون ك.ريد

كمرجعك المفضل (كذا) لـ Fortran 95.كن حذرًا، فهي ليست الكتابة الأكثر وضوحًا، ولكن الحجاب سوف ينكشف عندما تريد حقًا الحصول على أقصى استفادة من ميزة Fortran 95 الجديدة.

لقد استمتعت بالتركيز على قضايا الانتقال من Fortran 77 إلى Fortran 90

الهجرة إلى فورتران 90, بقلم جيم كريجان

لكن الكتاب نفدت طبعته الآن.(أنا لا أفهم استخدام أورايلي لـ سفاري, ، لماذا لا يتوفر كل كتاب من كتبهم التي نفدت طبعتها؟)

وأخيرًا، بالنسبة لوريث الكلاسيكية الرائعة والرائعة، أدوات البرمجيات, ، أرشح

فورتران الكلاسيكية, بقلم مايكل كوبرشميد

لا يوضح هذا الكتاب فقط ما يمكن للمرء فعله باستخدام Fortran 77 "فقط"، ولكنه يتحدث أيضًا عن بعض المشكلات الأكثر دقة التي تنشأ (على سبيل المثال، ينبغي أو لا ينبغي للمرء استخدام الإعلان الخارجي).لا يغطي هذا الكتاب بالضبط نفس المساحة التي يغطيها "أدوات البرامج" ولكنهما اثنان من كتب برمجة Fortran الثلاثة التي أود أن أصنفها على أنها "ممتعة"....(وهنا الثالث).

نصائح متنوعة تنطبق على بالكاد كل مترجم فورتران

  • يوجد خيار برنامج التحويل البرمجي لفرض سلوك IMPLICIT NONE، والذي يمكنك استخدامه لتحديد إجراءات المشكلة دون تعديلها باستخدام إعلان IMPLICIT NONE أولاً.لن تبدو هذه النصيحة ذات معنى إلا بعد المرة الأولى التي يتم فيها إنشاء القنابل بسبب أمر ضمني لا شيء تم إدراجه في روتين قديم.(ماذا؟لم تكتشف مراجعة الكود الخاص بك هذا؟؛-)
  • يوجد خيار مترجم للتحقق من حدود المصفوفة، والذي يمكن أن يكون مفيدًا عند تصحيح أخطاء كود Fortran 77.
  • يجب أن يكون مترجمو Fortran 90 قادرين على تجميع جميع أكواد Fortran 77 تقريبًا وحتى أكواد Fortran الأقدم.قم بتشغيل خيارات إعداد التقارير في برنامج التحويل البرمجي Fortran 90 الخاص بك، وقم بتشغيل التعليمات البرمجية القديمة من خلاله، وستكون لديك بداية جيدة في التحقق من بناء الجملة.بعض مترجمات Fortran 77 التجارية هي في الواقع مترجمات Fortran 90 التي تعمل في وضع Fortran 77، لذلك قد يكون هذا خيارًا تافهًا نسبيًا لأي نصوص بناء لديك.

هناك شيء ما في السؤال الأصلي يجب أن أحذر منه.أنت تقول أن الكود مليء بـ "تحسينات تحسين الأداء".نظرًا لأن مشكلات فورتران ذات طبيعة علمية ورياضية عمومًا، فلا تفترض أن حيل الأداء هذه موجودة لتحسين عملية التجميع.ربما لا يتعلق الأمر باللغة.في فورتران، نادرًا ما يتعلق الحل بكفاءة الكود نفسه، بل يتعلق بالرياضيات الأساسية لحل المشكلة النهائية.قد تجعل الحيل عملية التجميع أبطأ، بل وقد تجعل المنطق يبدو فوضويًا، ولكن القصد هو جعل الحل أسرع.ما لم تكن تعرف بالضبط ما يفعله ولماذا، اتركه وشأنه.

حتى إعادة البناء البسيطة، مثل تغيير أسماء المتغيرات التي تبدو غبية، يمكن أن تكون مأزقًا كبيرًا.المعادلات الرياضية القياسية تاريخيًا في مجال معين من العلوم سوف تستخدم اختصارًا معينًا منذ أيام ماكسويل.لذا فإن رؤية مصفوفة تسمى B(:) في الكهرومغناطيسية تخبر جميع مهندسي Emag بالضبط بما يتم حله.تغيير ذلك على مسؤوليتك.أخلاقيًا، تعرف على التسميات القياسية للعلم قبل إعادة التسمية أيضًا.

باعتباري شخصًا يتمتع بخبرة في كل من FORTRAN (77 نكهة على الرغم من مرور فترة طويلة منذ أن استخدمتها على محمل الجد) وC/C++، فإن العنصر الذي يجب الانتباه إليه والذي يتبادر إلى ذهني على الفور هو المصفوفات.تبدأ صفائف FORTRAN بفهرس 1 بدلاً من 0 كما هو الحال في C/C++/Java.كما يتم عكس ترتيب الذاكرة.لذا فإن زيادة الفهرس الأول يمنحك مواقع ذاكرة تسلسلية.

لا تزال زوجتي تستخدم FORTRAN بانتظام ولديها بعض أكواد C++ التي تحتاج إلى العمل معها الآن وأنا على وشك البدء في مساعدتها فيها.عندما تظهر مشكلات أثناء تحويلها، سأحاول الإشارة إليها.ربما سوف يساعدون.

هل يمكنك توضيح ما عليك فعله للحفاظ على الكود؟هل حقا لديك لتعديل التعليمات البرمجية؟إذا كان بإمكانك الابتعاد عن طريق تعديل الواجهة فقط لهذا الكود بدلاً من الكود نفسه، فسيكون ذلك هو الأفضل.

المشكلة المتأصلة عند التعامل مع كود علمي كبير (وليس فقط FORTRAN) هي أن الرياضيات الأساسية والتنفيذ معقدان.بشكل افتراضي تقريبًا، يتم التنفيذ لابد ان تضمين تحسين التعليمات البرمجية، من أجل التشغيل ضمن إطار زمني معقول.ومما يضاعف من ذلك حقيقة أن الكثير من الأكواد البرمجية في هذا المجال يتم إنشاؤها بواسطة علماء/مهندسين خبراء في مجالهم، ولكن ليس في تطوير البرمجيات.دعنا نقول فقط أن "سهولة الفهم" ليست الأولوية الأولى بالنسبة لهم (كنت واحدًا منهم، وما زلت أتعلم كيف أصبح مطور برامج أفضل).

نظرًا لطبيعة المشكلة، لا أعتقد أن السؤال العام والإجابة كافية لتكون مفيدة.أقترح عليك نشر سلسلة من الأسئلة المحددة مع إرفاق مقتطف الشفرة.ربما البدء بالشخص الذي يسبب لك أكبر قدر من الصداع؟

لقد استخدمت Fortran بدءًا من الإصدار '66 منذ عام 1967 (على جهاز IBM 7090 بذاكرة تبلغ سعتها 32 ألف كلمة).ثم استخدمت PL/1 لبعض الوقت، لكني عدت لاحقًا إلى Fortran 95 لأنه مناسب بشكل مثالي لمسائل المصفوفة/الأرقام المركبة التي لدينا.أود أن أضيف إلى الاعتبارات أن الكثير من البنية المعقدة للرموز القديمة ترجع ببساطة إلى الكمية الصغيرة من الذاكرة المتاحة، مما يفرض شيئًا مثل إعادة استخدام بضعة أسطر من التعليمات البرمجية عبر محسوبة أو مخصصة GOTOس.مشكلة أخرى هي التحسين من خلال تحديد المتغيرات المساعدة لكل تعبير فرعي متكرر - ببساطة لم يقوم المترجمون بتحسين ذلك.وبالإضافة إلى ذلك، لم يسمح له بالكتابة DO i=1,n+1;كان عليك أن تكتب n1=n+1; DO i=1,n1.ونتيجة لذلك، تمتلئ الرموز القديمة بمتغيرات زائدة عن الحاجة.عندما قمت بإعادة كتابة التعليمات البرمجية في فورتران 95، بقي 10٪ فقط من المتغيرات.إذا كنت ترغب في جعل التعليمات البرمجية أكثر وضوحًا، فإنني أوصي بشدة بالبحث عن المتغيرات التي يمكن حذفها بسهولة.

شيء آخر أود أن أذكره هو أن المصفوفات الحسابية ومتعددة الأبعاد المعقدة كانت غير فعالة إلى حد كبير لسنوات عديدة.ولهذا السبب تجد في كثير من الأحيان إعادة كتابة التعليمات البرمجية لإجراء حسابات معقدة باستخدام المتغيرات الحقيقية فقط، والمصفوفات التي يتم التعامل معها باستخدام فهرس خطي واحد.

حسنًا، من ناحية، أنت محظوظ، لأن Fortran ليس لديه الكثير من بنيات تدفق التحكم الدقيقة أو الميراث أو ما شابه.ومن ناحية أخرى، فهي تحتوي على بعض الأخطاء المذهلة حقًا، مثل العناصر المحسوبة حسابيًا من فرع إلى تسمية رقمية، والمتغيرات المكتوبة ضمنيًا والتي لا تتطلب الإعلان، والافتقار إلى الكلمات الرئيسية الحقيقية.

لا أعرف شيئًا عن "تحسينات تحسين الأداء".أعتقد أن معظمها ربما يكون غير فعال، حيث أن عقدين من الزمن من تكنولوجيا المترجمات جعلت معظم التلميحات غير ضرورية.لسوء الحظ، ربما يتعين عليك ترك الأمور كما هي، إلا إذا كنت تخطط لإجراء عملية إعادة كتابة واسعة النطاق.

على أي حال، يجب أن يكون رمز الحساب العلمي الأساسي قابلاً للقراءة إلى حد ما.أي لغة برمجة تستخدم حساب infix ستكون إعدادًا جيدًا لقراءة كود Fortran الحسابي ورمز المهمة.

لقد أحببت لغة FORTRAN، وكنت أقوم بالتدريس فيها والبرمجة فيها.أردت فقط أن أرمي ذلك.لم أتطرق إليها منذ سنوات.
لقد بدأت في COBOL، وعندما انتقلت إلى FORTRAN شعرت بأنني قد تحررت.كل شيء نسبي، أليس كذلك؟أؤيد ما قيل أعلاه - أدرك أن هذه لغة إجرائية - لا توجد بها تفاصيل دقيقة - لذا خذها كما تراها.
ربما يحبطك لتبدأ.

لقد بدأت استخدام Fortran IV (WATFIV) باستخدام البطاقات المثقبة، وكانت سنوات عملي الأولى هي VS FORTRAN v1 (مستوى IBM، Fortran 77).الكثير من النصائح الجيدة في هذا الموضوع.

أود أن أضيف أنه يتعين عليك التمييز بين الأشياء التي يتم القيام بها لتشغيل الوحش على الإطلاق، مقابل الأشياء التي تعمل على "تحسين" الكود، مقابل الأشياء الأكثر قابلية للقراءة والصيانة.أستطيع أن أتذكر التعامل مع تراكبات VAX في محاولة تشغيل كود محاكاة DOE على IBM باستخدام الذاكرة الافتراضية (كان لا بد من إزالتها وتحويل كل شيء إلى مساحة عنوان واحدة).

سأبدأ بالتأكيد بإعادة هيكلة هياكل التحكم في FORTRAN IV بعناية إلى مستوى FORTRAN 77 على الأقل، مع وضع مسافة بادئة وتعليق مناسبين.حاول التخلص من هياكل التحكم البدائية مثل ASSIGN وCOMPUTED GOTO والحساب IF، وبالطبع أكبر عدد ممكن من GOTOs (باستخدام IF-THEN-ELSE-ENDIF).بالتأكيد استخدم IMPLICIIT NONE في كل روتين، لإجبارك على الإعلان عن جميع المتغيرات بشكل صحيح (لن تصدق عدد الأخطاء التي اكتشفتها في أكواد الآخرين - الأخطاء المطبعية في أسماء المتغيرات).احترس من "التحسينات المبكرة" التي من الأفضل أن تترك المترجم يتعامل معها بنفسه.

إذا كان لهذه التعليمات البرمجية أن تستمر في البقاء وقابلة للصيانة، فأنت مدين لنفسك ولخلفائك بجعلها قابلة للقراءة والفهم. فقط كن متأكدًا مما تفعله أثناء تغيير الرمز! لدى FORTRAN الكثير من التركيبات المميزة التي يمكنها بسهولة أن تتعثر شخصًا قادمًا من الجانب C من عالم البرمجة.تذكر أن تاريخ FORTRAN يعود إلى منتصف الخمسينيات، عندما لم يكن هناك شيء مثل علم اللغة وتصميم المترجمات، فقط مخصصة اختراق شيء ما (آسف يا دكتور.ب!).

وهنا واحد آخر الذي عضني من وقت لآخر.عند العمل على رمز FORTRAN، تأكد من تخطي كافة الأعمدة الستة الأولية.بين الحين والآخر، سأحصل على الكود مع وضع مسافة بادئة بخمس مسافات فقط ولا شيء يعمل.للوهلة الأولى يبدو كل شيء على ما يرام ثم أدركت أخيرًا أن جميع الأسطر تبدأ في العمود 6 بدلاً من العمود 7.

بالنسبة لأي شخص ليس على دراية بـ FORTRAN، فإن الأعمدة الخمسة الأولى مخصصة لأرقام الأسطر (= التسميات)، والعمود السادس مخصص لحرف استمراري في حالة وجود سطر أطول من 80 حرفًا (فقط ضع شيئًا هنا وسيعرف المترجم أن هذا السطر هو في الواقع جزء من الكود الذي يسبقه) ويبدأ الكود دائمًا في العمود 7.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top