ما يجب أن تعرفه كحدّ أدنى عندما تجد نفسك فجأة مضطرّاً لقراءة كود 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 الأعمال يكون عادةً كالآتي.
- قراءة سجلّ من ملفّ أو DB
- وضعه في عنصر داخل
WORKING-STORAGE - التفرّع الشرطيّ
- إعادة تعبئته في سجلّ آخر
- كتابته خارجاً
أي إنّ التخطيط (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: السجلّ الأعلى مستوى لمجموعة، أو group02-49: المستويات الأدنى منه77: عنصر مستقلّ مفرد88: condition-name. يربط اسماً بقيمة العنصر السابق366: لـ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-IFEND-PERFORMEND-READ
الكود الذي فيه منهيات صريحة (explicit terminators) أسهل قراءةً نسبيّاً.
المشكلة في الكود القديم. في COBOL يعمل . بوصفه scope terminator ضمنيّاً، فيُنهي معاً الجمل التي لم تُغلَق بعد.12
أي إنّ نقطةً واحدةً تغيّر:
- إلى أين يمتدّ
IF - إلى أين يمتدّ
PERFORM - أين الانتقال إلى الـ sentence التالية
كذلك NEXT SENTENCE ليس مماثلاً لـ CONTINUE.
NEXT SENTENCE يتقدّم إلى ما بعد النقطة التالية، لذا تختلف وجهة القفز بحسب موقع الـ . اللاحق.12
عند قراءة COBOL القديم، الأنسب أن تنظر لا إلى نهاية السطر، بل إلى النقطة.
6.3 READ / WRITE / CALL
ما يتكرّر كثيراً في COBOL الأعمال هو من هذا القبيل.
READWRITEREWRITESTARTCALL
وبخاصّة 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، الترتيب التالي آمن.
- اغسل كلّ الـ
COPYإن استطعت فتح الـ copybook فافتحه. وإن لم يكن ممكناً ابحث عن listing أو الكود الموسَّع - التقط تعريفات سجلّات مستوى
01اجمع قائمة بأعلى عناصرFILE SECTIONوWORKING-STORAGEوLINKAGE SECTION - اقرأ
PICوUSAGEتعرّف على المبالغ والتواريخ والأعداد والرموز والـ flag - ابحث عن
READ/WRITE/REWRITE/CALL/EXEC SQL/EXEC CICSأمسك أوّلاً بالإدخال/الإخراج والحدود الخارجيّة - تتبّع المسار الرئيسيّ الأوّل فقط
تتبّع سلسلة
PERFORMمن بدايةPROCEDURE DIVISION - انظر إلى
88وعناصر status تصير معاني EOF والنجاح/الفشل ورموز الأنواع أسهل قراءةً - علِّم على
REDEFINES/OCCURS DEPENDING ON/COMP-3هذه ستؤثّر لاحقاً بالتأكيد، لذلك ضعها كأشياء خطيرة سلفاً - إن كانت ملفّات، انظر إلى
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. المراجع
أهمّ المراجع المُشار إليها في النصّ.
-
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
-
IBM, “Level-numbers” https://www.ibm.com/docs/en/cobol-zos/6.3.0?topic=entry-level-numbers ↩ ↩2
-
IBM, “Format 2: condition-name value” https://www.ibm.com/docs/en/cobol-zos/6.3.0?topic=vc-format-2 ↩ ↩2
-
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
-
IBM, “PACKED-DECIMAL (COMP-3)” https://www.ibm.com/docs/en/cobol-zos/6.4.0?topic=v6-packed-decimal-comp-3 ↩
-
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
-
IBM, “REDEFINES clause” https://www.ibm.com/docs/en/cobol-zos/6.4.0?topic=entry-redefines-clause ↩ ↩2
-
IBM, “OCCURS DEPENDING ON clause” https://www.ibm.com/docs/en/cobol-zos/6.4.0?topic=clause-occurs-depending ↩ ↩2
-
IBM, “COPY statement” https://www.ibm.com/docs/en/cobol-linux-x86/1.2.0?topic=statements-copy-statement ↩ ↩2
-
IBM, “Enterprise COBOL compiler options” https://www.ibm.com/docs/en/cobol-zos/6.3.0?topic=guide-enterprise-cobol-compiler-options ↩
-
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 ↩
-
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
-
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 ↩
-
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 ↩
-
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 ↩
-
IBM, “Elementary move rules” https://www.ibm.com/docs/en/cobol-zos/6.3.0?topic=moves-elementary-move-rules ↩
مقالات ذات صلة
أحدث المقالات التي تشترك في نفس الوسوم. عمّق فهمك بمواضيع مرتبطة.
ما هو Reg-Free COM - كيف يعمل Registration-Free COM وأين يلائم وأين لا يلائم
مقالة تشرح Reg-Free COM كآليّة تنشيط مبنيّة على manifests بدلاً من الـ registry، توضّح متى يلائم في تطبيقات سطح المكتب ومتى لا يحلّ مشكلا...
كيف نُطيل عمر أنظمة الويب الداخليّة المعتمدة على IE mode وكيف نخرج منها - تنظيم الاستراتيجيّات الميدانيّة من الإدارة المركزيّة لقائمة المواقع، إلى WebView2، والإعادة الهيكليّة التدريجيّة، ووصولًا إلى عزل VDI
نتناول استراتيجيّةً عمليّةً لإطالة عمر أنظمة الويب الداخليّة المعتمدة على IE mode والخروج منها تدريجيًّا عبر إدارة قائمة المواقع وتغليف W...
ما يجب التحقّق منه عندما لا يعمل 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 والأدوات الداخليّة، الكشف الساكن، تجميع سجلّا...
تنظيم أسباب عدم وصول رسائل contact form - تصميم SPF / DKIM / DMARC وحقل From، ومعالجة كلّ حالة على حدة لـ external SMTP / shared hosting / PHP mail()
نشرح أسباب عدم وصول إشعارات contact form من خلال SPF و DKIM و DMARC وحقل From، مع إعدادات external SMTP و shared hosting و PHP mail() وخط...
الملف الشخصي للمؤلف
صفحة الملف الشخصي لمؤلف المقالة.
غو كومورا
مؤسّس شركة كومورا سوفت ذ.م.م.
يركّز على تطوير برامج ويندوز، والاستشارات التقنية، والتحقيق في الأخطاء، ويتميّز في المشاريع التي تبقى فيها الأصول القديمة ناشطة، وفي تشخيص الأعطال التي يصعب تحديد سببها.
روابط عامة