ما يجب أن تعرفه كحدّ أدنى عندما تجد نفسك فجأة مضطرّاً لقراءة كود COBOL - تنظيم DIVISION / PIC / COMP-3 / COPY / PERFORM أوّلاً

· · COBOL, تقنيات قديمة, أنظمة الأعمال, الصيانة, Mainframe

التسليم، الاستجابة للأعطال، صيانة الحزم الجاهزة من بائع. في مثل هذه المواقف، قد يأتي يوم تجد فيه فجأة كود COBOL يطير نحوك.

  • اسم الملفّ ينتهي بـ .cbl أو .cpy
  • أسماء المتغيّرات كلّها بأحرف كبيرة
  • 01 و 05 و 77 و 88 تتراصف
  • تظهر تعابير مثل PIC S9(7)V99 COMP-3 التي تبدو شيئاً بين تعويذة سحريّة وبرنامج محاسبيّ
  • وفوق ذلك كلّه COPY في كلّ مكان، ولا يمكن رؤية الصورة الكاملة من الملفّ المفتوح وحده

عند هذه النقطة يصير الدماغ مسحوقاً قليلاً.

لكن الخريطة اللازمة للقراءة ليست بهذا الحجم الكبير. لـ COBOL اختلافات بحسب الـ implementation أو المنتج، غير أنّ الهيكل العظميّ الذي يجب الإمساك به أوّلاً عند قراءة نظام أعمال قائم مشترك إلى حدٍّ بعيد. في هذا المقال، نأخذ بعين الاعتبار عوائل IBM و COBOL الأعمال النموذجيّ، ونُنظّم مجموعة دنيا للأشخاص الذين وجدوا أنفسهم فجأة أمام قراءة الكود.

1. أوّلاً الخلاصة (في كلمة واحدة)

إن قلناها بشكل خشن إلى حدٍّ ما، لكن مفيد عمليّاً، فهي هكذا.

  • COBOL، قبل أن يكون لغة منطق، هو بقوّة لغة تعريف سجلّات
  • قراءة PROCEDURE DIVISION فقط تعرّفك على نصف القصّة. انظر أوّلاً إلى DATA DIVISION
  • PIC هو شكل العنصر، و USAGE هو بأيّ تمثيل يُحفظ
  • COMP-3 هو packed decimal. يظهر كثيراً في عالم المبالغ والأعداد
  • 88 ليس متغيّراً منفصلاً بقدر ما هو اسم شرط مرتبط بقيمة العنصر السابق
  • REDEFINES آليّة لـ رؤية الذاكرة نفسها بشكل مختلف. ليس نسخاً
  • إن كان هناك COPY فإنّ الكود المفتوح أمامك حاليّاً لا يزال غير مكتمل. لا يمكن رؤية الصورة الكاملة دون الاطّلاع على الـ copybook
  • إن تتبّعت PERFORM و IF و EVALUATE و READ و WRITE و CALL فستمسك بالتدفّق العامّ تقريباً
  • الأكواد القديمة بـ تنسيق ثابت يكون فيه لموقع العمود معنى. الفراغات الظاهريّة ليست مجرّد زينة1

باختصار، DIVISION و PIC و USAGE و COMP-3 و REDEFINES و OCCURS و 88 و COPY و PERFORM. إن أمكن قراءة هذه فإنّ معدّل الضياع ينخفض كثيراً.

2. اعتبر COBOL أوّلاً لغة “شكل البيانات”

إن قرأته بإحساس C# أو Java، ستميل في البداية إلى ملاحقة if أو for أو استدعاءات الدوالّ. لكن قبل الذهاب إلى هناك، الأسرع في COBOL هو الإمساك بـ «ما هي السجلّات التي يستلمها هذا البرنامج، وما هي السجلّات التي ينتجها، وما هي الـ buffer التي يحملها».

التدفّق النموذجيّ لـ COBOL الأعمال يكون عادةً كالآتي.

  1. قراءة سجلّ من ملفّ أو DB
  2. وضعه في عنصر داخل WORKING-STORAGE
  3. التفرّع الشرطيّ
  4. إعادة تعبئته في سجلّ آخر
  5. كتابته خارجاً

أي إنّ التخطيط (layout) يسبق الخوارزميّة عادةً.

مثلاً، هذا هيكل من هذا النوع.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE01.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT SALES-FILE ASSIGN TO ...

       DATA DIVISION.
       FILE SECTION.
       FD  SALES-FILE.
       01  SALES-REC.
           05  SALE-ID       PIC 9(8).
           05  SALE-AMOUNT   PIC S9(7)V99 COMP-3.

       WORKING-STORAGE SECTION.
       01  WS-EOF            PIC X VALUE 'N'.
           88  EOF           VALUE 'Y'.

       PROCEDURE DIVISION.
           PERFORM UNTIL EOF
               READ SALES-FILE
                   AT END
                       SET EOF TO TRUE
                   NOT AT END
                       PERFORM PROCESS-SALE
               END-READ
           END-PERFORM
           STOP RUN.

عند قراءة هذا الكود، أوّل ما يجب النظر إليه قبل PERFORM هو نوع SALE-AMOUNT ومعنى EOF. COBOL، إن قرأته بهذا الترتيب، يصير فجأة هادئاً.

3. انظر أوّلاً إلى الـ DIVISION الأربعة

كود COBOL ينقسم أوّلاً وبشكل كبير إلى أربعة DIVISION.

DIVISION ما يجب رؤيته أوّلاً
IDENTIFICATION DIVISION اسم البرنامج، التعليقات القديمة، الأصل
ENVIRONMENT DIVISION الملفّات، الموارد الخارجيّة، فرضيّات الإدخال/الإخراج
DATA DIVISION تعريفات السجلّات، مناطق العمل، المعطيات
PROCEDURE DIVISION إجراءات المعالجة الفعليّة

ما يهمّ بشكل خاصّ ما يلي.

  • FILE SECTION يحتوي تعريفات سجلّات ملفّات الإدخال والإخراج
  • WORKING-STORAGE SECTION يحتوي المتغيّرات والـ flag والعدّادات و buffer العمل المستخدمة عادةً
  • LOCAL-STORAGE SECTION قد يحتوي مناطق تُهيَّأ مع كلّ استدعاء
  • LINKAGE SECTION قد يحتوي المعطيات المُمرَّرة من الخارج، أو منفذ الاستقبال للبرنامج الفرعيّ

إن رأيت LINKAGE SECTION و PROCEDURE DIVISION USING ...، فمن المرجّح أنّ هذا البرنامج ليس مكتفياً بنفسه، بل يعمل باستلام بيانات من الخارج.

4. لا تخف من شكل التنسيق الثابت

في COBOL القديم، موقع العمود نفسه في كلّ سطر له معنى. إن نظرت إلى الكود دون معرفة هذا، فلن تفهم أبداً «لماذا توجد هوامش غريبة على اليسار».1

في التنسيق الثابت، الأمر تقريباً كالآتي.

  • الأعمدة 1 - 6: رقم تسلسليّ
  • العمود 7: indicator
  • الأعمدة 8 - 11: Area A
  • الأعمدة 12 - 72: Area B

العمود السابع مهمّ بشكل خاصّ.

  • * أو / : سطر تعليق
  • - : سطر استمرار
  • D : debugging line
  • *> : تعليق يمكن كتابته في وسط السطر أيضاً

لتخفيف الضغط البصريّ، إن رسمناها بشكل خشن، ستكون كالآتي.

1234567 8901 23456789012345678901234567890
      * تعليق
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE01.

الفراغات هنا ليست «تنسيقاً» بالمعنى الحديث، بل هي جزئيّاً قواعد نحويّة (syntax). إن حوّلت إلى tab في المحرّر، أو قمت بإزاحته إلى اليسار، أو قمت بنسخ ولصق خشن، فإنّه يتعطّل بشكل عاديّ. عند النظر إلى كود قديم، اشكّ أوّلاً ما إذا كان الملفّ بصيغة fixed format أم free format. إن طبّقت modern formatter على ملفّ fixed، فإنّه ينفجر بازدهار ملحوظ.

5. الحدّ الأدنى من DATA DIVISION

5.1 رقم المستوى (Level Number)

تعريفات بيانات COBOL تبني الهرميّة لا بالإزاحة (indent) بل بـ رقم المستوى.2

       01  WS-ORDER.
           05  WS-ORDER-ID    PIC 9(8).
           05  WS-AMOUNT      PIC S9(7)V99 COMP-3.
           05  WS-STATUS      PIC X.
               88  WS-OK      VALUE '0'.
               88  WS-ERROR   VALUE '9'.

       77  WS-COUNT           PIC 9(4).

يكفي حفظ هذه الأمور كحدٍّ أدنى.

  • 01 : السجلّ الأعلى مستوى لمجموعة، أو group
  • 02 - 49 : المستويات الأدنى منه
  • 77 : عنصر مستقلّ مفرد
  • 88 : condition-name. يربط اسماً بقيمة العنصر السابق3
  • 66 : لـ RENAMES. معدّل المصادفة ليس عالياً لكنّه موجود

المهمّ ألّا تعتبر 88 متغيّراً bool منفصلاً. ليس هناك منطقة WS-OK منفصلة، بل عندما يكون WS-STATUS بقيمة '0' يمكن قراءته باسم WS-OK.

أمر مهمّ آخر هو أنّ ما يحدّد الهرميّة ليس الفراغ بل رقم المستوى. الإزاحة الظاهريّة قد تكون مرجعيّة، لكنّ ما يجب الوثوق به نهائيّاً هو 01 / 05 / 10 / 88.2

5.2 PICTURE

PIC يعبّر عن شكل ذلك العنصر. الأكثر شيوعاً كالآتي.

الترميز المعنى تقريباً
X حرف
9 رقم
S بإشارة (signed)
V الفاصلة العشريّة منطقيّة فقط
X(10) 10 أحرف
9(5) عدد بـ 5 أرقام
S9(7)V99 بإشارة، 7 أرقام صحيحة + رقمان عشريّان

مثلاً،

  • PIC X(10) → 10 أحرف
  • PIC 9(5)V99 → عدد صحيح بـ 5 أرقام + 2 رقم عشريّ
  • PIC S9(7)V99 → بإشارة، عدد صحيح بـ 7 أرقام + 2 رقم عشريّ

هذا هو.

ما يهمّ هنا بشكل خاصّ هو V. V لا يحمل حرف . فعليّاً. PIC 9(5)V99 يُعامَل بوصفه «عدداً ذا منزلتين عشريّتين»، لكن ليس هناك حرف نقطة موجود فعليّاً في البيانات. ولذلك إن فسّرت ملفّاً أو dump بصفته «سلسلة محارف ظاهرة»، فستسقط في الغالب.

5.3 USAGE / DISPLAY / COMP / COMP-3

إن كان PIC هو الشكل، فإنّ USAGE هو بأيّ تمثيل يُحتفظ به. يكفي الإمساك بهذا فقط لقراءة الكثير.45

الترميز المعنى تقريباً الانتباه عند القراءة
DISPLAY عشريّ خارجيّ يبدو كحروف في mainframe قد يكون EBCDIC هو الفرضيّة6
COMP / BINARY ثنائيّ عدد الخانات الظاهر يختلف عن التمثيل الداخليّ
COMP-3 / PACKED-DECIMAL packed decimal يبدو متعطّلاً إن قرئ كحروف

مثلاً،

       01  WS-AMOUNT-DISP   PIC S9(7)V99.
       01  WS-AMOUNT-BIN    PIC S9(7) COMP.
       01  WS-AMOUNT-PACK   PIC S9(7)V99 COMP-3.

هذه الثلاثة كلّها «عدديّة»، لكنّ طريقة الاحتفاظ بالمحتوى مختلفة.

أكثر شيء فعّال عمليّاً هو ردّ الفعل لحظة رؤية COMP-3.

  • إنّه packed decimal
  • على الأرجح مبلغ، أو ضريبة، أو عدد، أو من قبيل المعدّلات
  • من الطبيعيّ أن يبدو متعطّلاً إن نُظر إليه كنصّ
  • إن نظرت إليه بمزاج CSV أو UTF-8 ستحدث حادثة

إن امتلكت هذا الفهم، فلن تُصاب بـ panic بلا داعٍ من شكل dump أو ملفّ ثنائيّ.

نقطة إضافيّة واحدة: مجرّد كون USAGE هو DISPLAY لا يعني بالضرورة أنّه سلسلة ASCII. في عوائل z/OS تكون EBCDIC هي الفرضيّة، لذا حتّى لو ظهرت الأرقام كحروف، فإنّ قيم البايتات قد تختلف عن '0' - '9' في ASCII.6

5.4 REDEFINES / OCCURS / COPY / FILLER

هذه الأربعة هي نقاط الاختناق عند القراءة.

REDEFINES

REDEFINES آليّة لـ رؤية المنطقة نفسها بشكل مختلف. ليس نسخاً.7

       01  REC-BUF.
           05  REC-TYPE      PIC X.
           05  REC-DATA      PIC X(99).

       01  HEADER-REC REDEFINES REC-BUF.
           05  HDR-TYPE      PIC X.
           05  HDR-DATE      PIC 9(8).
           05  FILLER        PIC X(91).

هذا قريب من إحساس union في عوائل C. يظهر كثيراً بصيغة «رؤية 100 بايت واحدة بوصفها أنواعاً مختلفة من السجلّات».

OCCURS

OCCURS هو مصفوفة. في COBOL يُسمَّى عادةً table.

       05  WS-ITEM OCCURS 12 TIMES.
           10  WS-PRICE    PIC 9(5).

وإذا ظهر OCCURS DEPENDING ON، فهي table متغيّرة الطول. في هذه الحالة قد يتأثّر موقع العناصر اللاحقة، لذلك إن تتبّعتها بمزاج الطول الثابت ستزلّ قدمك.8

COPY

COPY هو include في compile time. أي إنّ الكود المفتوح أمامك حاليّاً قد لا يزال غير الصورة المكتملة.9

       COPY CUSTOMER-REC.
       COPY ERROR-MAP.

من العاديّ تماماً أن تكون تعريفات السجلّات والـ flag المشتركة و host variable لـ SQL والواجهات الخارجيّة مدفوعةً داخل الـ copybook.

عندما يكون COPY كثيراً وصعب القراءة، الأسرع هو التأكّد ما إذا كان الكود المُوسَّع بعد التوسيع أو compiler listing متاحاً للرؤية. لـ IBM Enterprise COBOL خيار اسمه MDECK لكتابة الكود بعد معالجة المكتبات.10

FILLER

FILLER عنصر بلا اسم. لكن «بلا معنى لأنّه لا يُرجَع إليه» ليس صحيحاً.

  • منطقة محجوزة
  • ثقب لتوافق المواصفات القديمة
  • موازنة طول السجلّ
  • فجوة لأجل REDEFINES

كلّها فعّالة بشكل عاديّ.

FILLER فقط بلا اسم، لكنّه موجود من حيث عدد البايتات. إن نسيت هذا، فإنّ الخريطة مع الملفّ الخارجيّ تنزاح بايتاً بايتاً.

6. الحدّ الأدنى من PROCEDURE DIVISION

إن كان DATA DIVISION خريطة، فإنّ PROCEDURE DIVISION هو مسار الحركة.

6.1 PERFORM

PERFORM هو نقل التحكّم الأساسيّ في COBOL. قُل بخشونة، إنّه استدعاء معالجة والعودة منها.11

الأشكال الشائعة كالآتي.

       PERFORM INIT-PROC
       PERFORM UNTIL EOF
           PERFORM READ-PROC
           IF NOT EOF
               PERFORM EDIT-PROC
               PERFORM WRITE-PROC
           END-IF
       END-PERFORM

لـ PERFORM نوعان كبيران.

  • out-of-line PERFORM يحدّد فقرة (paragraph) أو section
  • inline PERFORM ... END-PERFORM يكتب الـ block في مكانه

وفي الكود القديم يظهر بشكل عاديّ تحديد النطاق مثل PERFORM A-100 THRU A-199. هذا مريح، لكن إذا أُضيفت فقرة في المنتصف، تحدث حوادث الانجراف بسهولة، لذلك عند القراءة انظر جيّداً إلى نهاية النطاق.

6.2 IF / EVALUATE / النطاق

التفرّع الشرطيّ الأساسيّ هو IF. يمكن اعتبار EVALUATE شيئاً أشبه بـ switch/case، وهذا صحيح في الغالب.

ما يجب الانتباه له هو طريقة انتهاء النطاق (scope).12

  • END-IF
  • END-PERFORM
  • END-READ

الكود الذي فيه منهيات صريحة (explicit terminators) أسهل قراءةً نسبيّاً.

المشكلة في الكود القديم. في COBOL يعمل . بوصفه scope terminator ضمنيّاً، فيُنهي معاً الجمل التي لم تُغلَق بعد.12

أي إنّ نقطةً واحدةً تغيّر:

  • إلى أين يمتدّ IF
  • إلى أين يمتدّ PERFORM
  • أين الانتقال إلى الـ sentence التالية

كذلك NEXT SENTENCE ليس مماثلاً لـ CONTINUE. NEXT SENTENCE يتقدّم إلى ما بعد النقطة التالية، لذا تختلف وجهة القفز بحسب موقع الـ . اللاحق.12

عند قراءة COBOL القديم، الأنسب أن تنظر لا إلى نهاية السطر، بل إلى النقطة.

6.3 READ / WRITE / CALL

ما يتكرّر كثيراً في COBOL الأعمال هو من هذا القبيل.

  • READ
  • WRITE
  • REWRITE
  • START
  • CALL

وبخاصّة READ ... AT END ... هو الطريق الملكيّ.

       READ IN-FILE
           AT END
               SET EOF TO TRUE
           NOT AT END
               PERFORM PROCESS-REC
       END-READ

إن كان هناك CALL 'SUBPGM' USING ...، فإنّه يطير إلى برنامج آخر. حينها، إن نظرت إلى LINKAGE SECTION و PROCEDURE DIVISION USING في الجهة المُستدعاة، سيظهر شكل التمرير بوضوح.

7. الأشياء الموجودة خارج COBOL

كثيراً ما لا يكتمل عالم COBOL بالكود وحده.

  • تعريفات الملفّات
  • بيئة التنفيذ
  • اتّصال DB
  • بيئة الـ transaction
  • التحكّم بالـ job

لأنّ كلّ هذه مفصولة في الخارج.

الإمساك بما يلي كحدٍّ أدنى يُسهّل القراءة.

الملفّات و FILE STATUS

FILE-CONTROL ضمن ENVIRONMENT DIVISION و FILE SECTION / FD ضمن DATA DIVISION تُقرأ كمجموعة واحدة.13

       SELECT IN-FILE ASSIGN TO ...
           FILE STATUS IS WS-FS.

       FD  IN-FILE.
       01  IN-REC.
           05 ...

إن كان FILE STATUS موجوداً، يدخل فيه رمز نتيجة كلّ I/O. عند قراءة أعطال الملفّات أو حكم EOF، لا يمكن البدء دون النظر إليه.14

EXEC SQL

إن ظهر هذا فهو embedded SQL.

       EXEC SQL
           SELECT ...
       END-EXEC.

في هذه الحالة، COBOL هو «حاوية للمتغيّرات المضيفة (host variables)»، أمّا شروط الاسترجاع الفعليّة وهدف التحديث فهما في جانب SQL. لذا، قراءة محتوى EXEC SQL بصفته SQL عاديّاً هي الطريق الأقصر.

EXEC CICS

إن ظهر هذا، فالسياق هو transaction CICS.15

       EXEC CICS
           RECEIVE MAP(...)
       END-EXEC.

في هذه اللحظة لم يعد الأمر مجرّد قراءة batch. يجب القراءة بشمول السياق الخارجيّ من الشاشة و transaction ورموز الاستجابة و COMMAREA.

JCL وتعريفات التنفيذ

في mainframe batch، ليس من النادر أن يكون أيّ dataset يُخصَّص فعلاً أو بأيّ ترتيب تنساب الـ job خارج كود COBOL. عندما لا تستطيع معرفة «أين يقع هذا الملفّ» من الكود وحده، فالأمر ليس سوء الكود، بل ببساطة لأنّ النطاق الذي تنظر إليه ليس كافياً بعد، وهذا أمر اعتياديّ.

8. الحدّ الأدنى من ترتيب القراءة

عندما تجد نفسك فجأة مضطرّاً لقراءة COBOL، الترتيب التالي آمن.

  1. اغسل كلّ الـ COPY إن استطعت فتح الـ copybook فافتحه. وإن لم يكن ممكناً ابحث عن listing أو الكود الموسَّع
  2. التقط تعريفات سجلّات مستوى 01 اجمع قائمة بأعلى عناصر FILE SECTION و WORKING-STORAGE و LINKAGE SECTION
  3. اقرأ PIC و USAGE تعرّف على المبالغ والتواريخ والأعداد والرموز والـ flag
  4. ابحث عن READ / WRITE / REWRITE / CALL / EXEC SQL / EXEC CICS أمسك أوّلاً بالإدخال/الإخراج والحدود الخارجيّة
  5. تتبّع المسار الرئيسيّ الأوّل فقط تتبّع سلسلة PERFORM من بداية PROCEDURE DIVISION
  6. انظر إلى 88 وعناصر status تصير معاني EOF والنجاح/الفشل ورموز الأنواع أسهل قراءةً
  7. علِّم على REDEFINES / OCCURS DEPENDING ON / COMP-3 هذه ستؤثّر لاحقاً بالتأكيد، لذلك ضعها كأشياء خطيرة سلفاً
  8. إن كانت ملفّات، انظر إلى FILE STATUS يقلّل ذلك كثيراً من سوء قراءة أعطال I/O

بهذا الترتيب لا تحتاج إلى قراءة كلّ النصّ بدقّة من البداية. بدلاً من محاولة فهم COBOL 100% منذ البداية، الأسهل بكثير هو الإمساك بالنقاط الثلاث السجلّ، والحدود الخارجيّة، والمسار الرئيسيّ ثمّ الذهاب إلى التفاصيل.

9. نقاط الاختناق الشائعة

أخيراً، نلخّص الأماكن التي يعلق فيها المبتدئون باحتمال مرتفع جدّاً.

اعتبار REDEFINES “متغيّراً منفصلاً”

خطأ. إنّه يقرأ المنطقة نفسها بشكل مختلف. إن أعدت كتابة أحدهما، يتغيّر شكل ظهور الآخر أيضاً.7

اعتبار 88 “bool مستقلّاً”

خطأ. إنّه فقط اسم مرتبط بقيمة العنصر السابق. SET WS-OK TO TRUE يضع، خلف الكواليس، القيمة المقابلة في العنصر الأساسيّ.3

تجاهل COPY وقراءة المتن فقط

ذلك يشبه دخول الجبل بنصف الخريطة مطويّة. من العاديّ أن تكون تعريفات الحقول والـ flag المشتركة و host variable في الخارج كاملةً.9

اعتبار MOVE تعييناً بسيطاً

MOVE ليس مجرّد memcpy. بحسب نوع الجهة المستقبلة، قد يحدث تحويل، وموازنة خانات، وحشو بأصفار، واقتطاع، وتحرير وإلغاء تحرير (edit/de-edit).16

الاستخفاف بأثر .

نقطة COBOL أثقل ممّا يُتخيّل. في الكود القديم بلا منهيات صريحة، إن أخطأت رؤية إلى أين تصل تلك النقطة، فستقرأ تدفّق التحكّم خطأً.12

اعتبار packed decimal أو EBCDIC “خرابَ ترميز”

ليس بالضرورة معطوباً. كثيراً ما يكون الأمر فقط أنّه ليس سلسلة محارف منذ البداية، أو أنّه ليس ASCII.46

اعتبار ما بعد OCCURS DEPENDING ON موقعاً ثابتاً

العناصر اللاحقة لـ table متغيّرة الطول قد تتحرّك مواقعها بحسب القيمة. إن قرأتها بعقليّة الطول الثابت، تنزاح كلّ حسابات الـ offset.8

10. جدول مرجعيّ سريع للنظر أوّلاً

الكلمة المُكتشَفة ما يجب التفكير فيه أوّلاً
01 أعلى السجلّ أو المجموعة. أمسك من هنا الصورة الكاملة
88 اسم معنى لـ flag أو رمز حالة. مفتاح لقراءة التفرّع
PIC X(...) عنصر حرفيّ
PIC 9(...) / S9(...)V... عنصر عدديّ. تأكّد من عدد الخانات وموقع الفاصلة العشريّة
COMP binary
COMP-3 packed decimal. احتمال كونه مبلغاً أو عدداً مرتفع
REDEFINES يفسّر المنطقة نفسها بشكل مختلف
OCCURS مصفوفة أو table
OCCURS DEPENDING ON متغيّر الطول. انتبه لمواقع ما بعده
FILLER بلا اسم لكنّه يحمل طولاً
COPY لا تظهر الصورة المكتملة دون النظر إلى الـ copybook
PERFORM الهيكل العظميّ للمسار الرئيسيّ
READ / WRITE / REWRITE I/O الملفّات
EXEC SQL معالجة DB
EXEC CICS معالجة transaction
FILE STATUS رمز نتيجة I/O

11. الخلاصة

COBOL ليس صعباً لأنّه قديم. بل لأنّ تعريفات البيانات والملفّات الخارجيّة وسياق التنفيذ مترابطة بإحكام، فالمدخل الأوّل يصعب رؤيته فحسب.

إن لخّصنا المجموعة الدنيا للقراءة مرّةً أخرى، فهي هكذا.

  • أمسك الخريطة بـ DIVISION
  • اقرأ DATA DIVISION أوّلاً
  • اقرأ شكل العناصر بـ PIC و USAGE
  • علِّم على COMP-3 و REDEFINES و OCCURS و 88 و COPY
  • تتبّع PERFORM و READ و WRITE و CALL
  • أمسك الحدود الخارجيّة بـ FILE STATUS و EXEC SQL و EXEC CICS
  • لا تستخفّ بمفعول .

عندما يصبح هذا مرئيّاً، يتحوّل COBOL من «سحر قديم غامض» إلى «لغة معالجة سجلّات». التقنيّات القديمة ليست مخيفة لأنّ اسمها قديم، بل لأنّ اختيار مقياس الرؤية الأوّل خاطئاً يجعلها فجأة صعبة الفهم. إن طابقت مقياس الخريطة، فإنّها تُقرأ بشكل عاديّ بشكل غير متوقّع.

12. المراجع

أهمّ المراجع المُشار إليها في النصّ.

  1. IBM, “Reference format” https://www.ibm.com/docs/en/cobol-zos/6.4.0?topic=structure-reference-format / IBM, “Area A or Area B” https://www.ibm.com/docs/en/cobol-zos/6.4.0?topic=format-area-area-b / Micro Focus, “Fixed Format” https://www.microfocus.com/documentation/visual-cobol/vc60/DevHub/HRLHLHINTR01U904.html  2

  2. IBM, “Level-numbers” https://www.ibm.com/docs/en/cobol-zos/6.3.0?topic=entry-level-numbers  2

  3. IBM, “Format 2: condition-name value” https://www.ibm.com/docs/en/cobol-zos/6.3.0?topic=vc-format-2  2

  4. IBM, “Examples: numeric data and internal representation” https://www.ibm.com/docs/en/cobol-zos/6.3.0?topic=data-examples-numeric-internal-representation  2

  5. IBM, “PACKED-DECIMAL (COMP-3)” https://www.ibm.com/docs/en/cobol-zos/6.4.0?topic=v6-packed-decimal-comp-3 

  6. IBM, “The EBCDIC character set” https://www.ibm.com/docs/en/zos-basic-skills?topic=mainframe-ebcdic-character-set / IBM, “Handling differences in ASCII SBCS and EBCDIC SBCS characters” https://www.ibm.com/docs/en/cobol-linux-x86/1.2.0?topic=fdcbdr-handling-differences-in-ascii-sbcs-ebcdic-sbcs-characters  2 3

  7. IBM, “REDEFINES clause” https://www.ibm.com/docs/en/cobol-zos/6.4.0?topic=entry-redefines-clause  2

  8. IBM, “OCCURS DEPENDING ON clause” https://www.ibm.com/docs/en/cobol-zos/6.4.0?topic=clause-occurs-depending  2

  9. IBM, “COPY statement” https://www.ibm.com/docs/en/cobol-linux-x86/1.2.0?topic=statements-copy-statement  2

  10. IBM, “Enterprise COBOL compiler options” https://www.ibm.com/docs/en/cobol-zos/6.3.0?topic=guide-enterprise-cobol-compiler-options 

  11. IBM, “PERFORM statement” https://www.ibm.com/docs/en/cobol-zos/6.4.0?topic=statements-perform-statement / IBM, “Procedure division structure” https://www.ibm.com/docs/en/cobol-zos/6.3.0?topic=division-procedure-structure 

  12. IBM, “Scope terminators” https://www.ibm.com/docs/en/cobol-aix/5.1.0?topic=division-scope-terminators / IBM, “Coding a choice of actions” https://www.ibm.com/docs/en/cobol-zos/6.3.0?topic=actions-coding-choice  2 3 4

  13. IBM, “Describing the structure of a file in detail” https://www.ibm.com/docs/en/cobol-linux-x86/1.2.0?topic=files-describing-structure-file-in-detail 

  14. IBM, “FILE STATUS clause” https://www.ibm.com/docs/en/cobol-linux-x86/1.2.0?topic=section-file-status-clause / IBM, “Using file status keys” https://www.ibm.com/docs/en/cobol-zos/6.4.0?topic=operations-using-file-status-keys 

  15. IBM, “Coding COBOL programs to run under CICS” https://www.ibm.com/docs/en/cobol-zos/6.3.0?topic=cics-coding-cobol-programs-run-under 

  16. IBM, “Elementary move rules” https://www.ibm.com/docs/en/cobol-zos/6.3.0?topic=moves-elementary-move-rules 

أحدث المقالات التي تشترك في نفس الوسوم. عمّق فهمك بمواضيع مرتبطة.

ما يجب التحقّق منه عندما لا يعمل ActiveX على Office 2024 / Microsoft 365 - الترتيب العمليّ لتغطية التعطيل الافتراضيّ، 32bit / 64bit، تسجيل COM، DLL التابعة، ووصولًا إلى IE mode

دليل عمليّ لتشخيص توقّف ActiveX على Office 2024 و Microsoft 365، يرتّب الفحوص من التعطيل الافتراضيّ إلى تطابق 32bit / 64bit وتسجيل COM وD...

دليل المراجعة الشاملة لـ VBA و Excel macro والأدوات الداخليّة استعدادًا لإيقاف VBScript - الجرد / الكشف الساكن / سجلّات التشغيل / اختيار البديل / الاختبار / النشر التدريجيّ

ملخّص عمليّ على صفحة واحدة لمسار الاستعداد لإيقاف VBScript تدريجيًّا: جرد VBA و Excel macro والأدوات الداخليّة، الكشف الساكن، تجميع سجلّا...

الملف الشخصي للمؤلف

صفحة الملف الشخصي لمؤلف المقالة.

غو كومورا

مؤسّس شركة كومورا سوفت ذ.م.م.

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

روابط عامة

العودة إلى المدونة