اكتمل التحويل في ثلاثة أشهر. تم تجميع تطبيق جافا، واجتاز اختبارات التحقق الأساسية، وأُعلن جاهزيته للنشر. بعد ستة أشهر من بدء التشغيل، لاحظ فريق المنصة مشكلة مقلقة: لم يتمكن أي فرد من فريق جافا من صيانة الكود. استغرقت المراجعات ضعف الوقت المعتاد لمراجعات جافا. أشارت تقارير الأخطاء إلى مفاهيم مثل التخزين المؤقت، ومنطق تقسيم الإجراءات، واتفاقيات حقول الأرقام العشرية المضغوطة، والتي لم يتمكن مطورو جافا الذين ليس لديهم خبرة في الحواسيب المركزية من فهمها. تم تحويل التطبيق من كوبول إلى جافا، لكن جافا الناتجة فكرت وهيكلت وتصرفت مثل كوبول. لقد كانت جافا كوبول.
Jobol (أو JOBOL اختصارًا) هو مصطلح مُركّب يُشير إلى كود جافا الذي يحتفظ بدلالات COBOL الإجرائية دون الاستفادة من إمكانيات جافا الكائنية. وقد عرّفه جيسون بلومبيرغ، مؤسس شركة التحليلات Intellyx، تعريفًا مباشرًا: Jobol هو كود جافا صالح تقنيًا، يُبقي على بنية البرنامج الأصلية ويحافظ على دلالات COBOL، مما يُلزم المطورين بالتعامل مع كود جافا كما لو كان COBOL. ويترتب على ذلك نتيجة حاسمة: فالمؤسسة التي تُحوّل COBOL إلى Jobol لم تُعفِ نفسها من الحاجة إلى خبرة COBOL، بل نقلت هذه الخبرة إلى لغة لا تدعم أنماط COBOL الموجودة في الكود بشكلٍ أصلي. وبذلك، أنشأت نظامًا أصعب صيانةً من COBOL الأصلي، ولا يُقدّم أيًا من مزايا جافا المتوقعة.
رسم بياني للتبعية قبل تصميم المجال
SMART TS XL يقوم برسم كل تبعية PERFORM و CALL بحيث تعكس طبقة خدمة Java بنية الاقتران الفعلية، وليس بنية فئة COBOL.
إعرف المزيد…الشكل الحقيقي لجوبول
قبل تشخيص الأسباب، يجب أن يكون النمط واضحًا. إليكم نفس منطق العمل، وهو فحص ائتمان العميل، بثلاثة أشكال: لغة كوبول الأصلية، ولغة جوبول التي تنتجها عادةً برامج التحويل الآلي، ولغة جافا الاصطلاحية التي ينتجها التحديث الماهر.
لغة كوبول الأصلية:
كوبول
PERFORM-CREDIT-CHECK.
MOVE WS-CUST-ID TO DB-CUST-KEY
READ CUSTOMER-FILE KEY IS DB-CUST-KEY
INVALID KEY
MOVE 'NOT FOUND' TO WS-STATUS
PERFORM HANDLE-MISSING-CUSTOMER
END-READ
IF CUST-CREDIT-SCORE < 650
MOVE 'DECLINED' TO WS-CREDIT-RESULT
MOVE 'Score below threshold' TO WS-DECLINE-REASON
ELSE IF CUST-OUTSTANDING-BALANCE > CUST-CREDIT-LIMIT
MOVE 'DECLINED' TO WS-CREDIT-RESULT
MOVE 'Balance exceeds limit' TO WS-DECLINE-REASON
ELSE
MOVE 'APPROVED' TO WS-CREDIT-RESULT
END-IF.
ملف Jobol الناتج عن محول سطر بسطر:
جافا
// Jobol: procedural COBOL logic mapped directly to Java
// No OOP, no encapsulation, static global state, COBOL naming conventions
public class CreditCheckProgram {
static String WS_CUST_ID;
static String DB_CUST_KEY;
static String WS_STATUS;
static String WS_CREDIT_RESULT;
static String WS_DECLINE_REASON;
static int CUST_CREDIT_SCORE;
static double CUST_OUTSTANDING_BALANCE;
static double CUST_CREDIT_LIMIT;
public static void PERFORM_CREDIT_CHECK() {
DB_CUST_KEY = WS_CUST_ID;
Customer customer = CustomerFile.read(DB_CUST_KEY);
if (customer == null) {
WS_STATUS = "NOT FOUND";
HANDLE_MISSING_CUSTOMER();
return;
}
CUST_CREDIT_SCORE = customer.getCreditScore();
CUST_OUTSTANDING_BALANCE = customer.getOutstandingBalance();
CUST_CREDIT_LIMIT = customer.getCreditLimit();
if (CUST_CREDIT_SCORE < 650) {
WS_CREDIT_RESULT = "DECLINED";
WS_DECLINE_REASON = "Score below threshold";
} else if (CUST_OUTSTANDING_BALANCE > CUST_CREDIT_LIMIT) {
WS_CREDIT_RESULT = "DECLINED";
WS_DECLINE_REASON = "Balance exceeds limit";
} else {
WS_CREDIT_RESULT = "APPROVED";
}
}
}
ينتج عن التحديث الماهر للغة جافا الاصطلاحية ما يلي:
جافا
// Idiomatic Java: domain model, encapsulation, value objects, Spring service
@Service
public class CreditCheckService {
private final CustomerRepository customerRepository;
public CreditCheckService(CustomerRepository customerRepository) {
this.customerRepository = customerRepository;
}
public CreditDecision check(CustomerId customerId) {
Customer customer = customerRepository.findById(customerId)
.orElseThrow(() -> new CustomerNotFoundException(customerId));
if (customer.creditScore() < CreditThresholds.MINIMUM_SCORE) {
return CreditDecision.declined("Score below threshold");
}
if (customer.outstandingBalance().compareTo(customer.creditLimit()) > 0) {
return CreditDecision.declined("Balance exceeds limit");
}
return CreditDecision.approved();
}
}
تتألف نسخة Jobol من 32 سطرًا من الحالة العامة الثابتة، ذات بنية إجرائية، وأسماء COBOL، ويستحيل اختبارها بشكل فردي دون تهيئة حالة الفئة العامة أولًا. أما النسخة الاصطلاحية فتتألف من 20 سطرًا، قابلة للحقن، وقابلة للاختبار، ويمكن لأي مطور Java قراءتها مباشرةً دون خلفية في COBOL. تُطبّق كلتا النسختين نفس قواعد العمل، إلا أن إحداهما فقط قابلة للصيانة من قِبل الفريق الذي كان من المفترض أن يُمكّنه التحديث.
أنماط جوبول الستة وأسباب إنتاجها من قبل شركات التحويل
النمط 1: استبدال حالة التخزين المؤقتة بحالة ثابتة عامة
يحتوي قسم التخزين المؤقت في لغة كوبول على متغيرات على مستوى البرنامج تبقى ثابتة عبر استدعاءات PERFORM. وهو يمثل حالة البرنامج المشتركة القابلة للتغيير، حيث تقرأ كل فقرة وتكتب نفس متغيرات التخزين المؤقت. تقوم المحولات الآلية بربط هذا القسم مباشرةً بحقول جافا الثابتة في فئة واحدة، مما يحافظ على دلالات الحالة المشتركة مع انتهاك جميع مبادئ التغليف في جافا.
لماذا تقوم المحولات بذلك؟ إنّ تحويل مساحة التخزين المؤقتة إلى حقول ثابتة هو تحويل آليّ مباشر. لا يفهم المحول أن نموذج التغليف في جافا يستبدل الحالة المشتركة على مستوى البرنامج بمتغيرات النسخة، ومعاملات الدوال، وقيم الإرجاع. فهو يحوّل ما يراه دون فهم سبب وجود البنية الأصلية.
والنتيجة: أن الحالة الثابتة غير قابلة للاختبار بمعزل عن غيرها، وغير آمنة للاستخدام المتزامن دون تزامن صريح، وهي مطابقة هيكليًا للغة كوبول التي حلت محلها. أي مطور يحتاج إلى إضافة خاصية التزامن إلى النظام عليه أولًا فك تشابك الحالة الثابتة، وهو عمل تم تأجيله من عملية التحويل إلى كل مطور لاحق.
الحل: ربط متغيرات مساحة التخزين المؤقتة بحقول الكائن، أو معلمات الدوال، أو القيم المُعادة بناءً على نطاق استخدامها. المتغيرات المستخدمة ضمن فقرة واحدة فقط تصبح متغيرات محلية. المتغيرات المُمررة بين الفقرات تصبح معلمات دوال أو قيمًا مُعادة. المتغيرات التي تُمثل حالة الكائن المشترك تُصبح حقول كائن في فئة مجال مُغلفة بشكل صحيح.
النمط 2: تنفيذ السلاسل التي تصبح طرقًا ثابتة طويلة
تُنظَّم برامج COBOL على شكل سلاسل PERFORM، حيث يُنفِّذ الإجراء الرئيسي سلسلة من الفقرات المُسماة، والتي قد تُنفِّذ كل منها فقرات أخرى. تُحوِّل برامج آلية كل فقرة إلى دالة ثابتة، وكل PERFORM إلى استدعاء دالة ثابتة. والنتيجة هي فئة واحدة تحتوي على عشرات الدوال الثابتة التي تستدعي بعضها البعض من خلال مخطط استدعاء يُحاكي بنية PERFORM في COBOL.
جافا
// Jobol: PERFORM chain mapped to static method calls
public class ProcessOrderProgram {
public static void main() {
validateOrder();
checkInventory();
calculateTotal();
applyDiscounts();
processPayment();
generateConfirmation();
updateInventory();
}
public static void validateOrder() { /* ... */ }
public static void checkInventory() { /* ... */ }
// ... 40 more static methods
}
لماذا تقوم المحولات بذلك؟ إنّ الربط الهيكلي من فقرة COBOL إلى دالة Java مباشر. يُحدد المحول بشكل صحيح أن PERFORM تعني "استدعاء وحدة التعليمات البرمجية هذه". لكن ما يغيب عنه هو أن نموذج كائنات Java يُنظم التعليمات البرمجية حول كيانات المجال، وليس حول خطوات المعالجة.
المأزق: حدد مفاهيم المجال المضمنة في سلسلة PERFORM. validateOrder, calculateTotalو applyDiscounts هي عمليات على أمر. processPayment هي عملية في سياق الدفع. checkInventory و updateInventory هي عمليات على المخزون. تعمل عملية إعادة الهيكلة على توزيع الطرق الثابتة على فئات المجال التي تنتمي إليها، مما يستبدل سلسلة استدعاءات إجرائية طويلة بطريقة تنسيق قصيرة تقوم بالتفويض إلى كائنات المجال المناسبة.
النمط 3: أنواع البيانات الرقمية بدون معالجة الدقة
تتميز حقول COBOL العشرية المضغوطة (COMP-3) بعمليات حسابية عشرية دقيقة. توجد محولات تربط COMP-3 بلغة Java double or float يؤدي ذلك إلى إدخال أخطاء تقريب منهجية في الفاصلة العائمة تتراكم عبر ملايين المعاملات المالية.
جافا
// Jobol: COMP-3 mapped to double (wrong)
static double WS_TRANSACTION_AMOUNT; // Was PIC S9(9)V99 COMP-3
static double WS_RUNNING_TOTAL;
// After 10M additions of 0.1:
// Expected: 1,000,000.00
// Actual: 1,000,000.0000000002 (floating point accumulation)
جافا
// Idiomatic Java: COMP-3 mapped to BigDecimal (correct)
private BigDecimal transactionAmount; // Preserves decimal precision
private BigDecimal runningTotal;
// After 10M additions of 0.1:
// Result: exactly 1,000,000.00
لماذا تقوم المحولات بذلك؟ double يُعدّ هذا النوع الرقمي هو النوع الافتراضي في لغة جافا. سيستخدم المحوّل الذي لا يفهم دلالات COMP-3 تحديدًا النوع الرقمي الأكثر شيوعًا في جافا، وهو الخيار الخاطئ لإجراء العمليات الحسابية العشرية الدقيقة.
المأزق: كل حقل من حقول COMP-3 يُطابق إلى BigDecimalتستخدم كل عملية حسابية رقمية تتضمن قيم COMP-3 BigDecimal الحساب. الـ scale() ل BigDecimal يطابق عدد المنازل العشرية الضمنية في عبارة PIC: PIC S9(9)V99 يحتوي على منزلتين عشريتين ضمنيتين، يتم ربطهما بـ BigDecimal بمقياس 2.
النمط 4: سلاسل EBCDIC وبقايا مصفوفات البايت
تعالج لغة كوبول بيانات الأحرف كسلاسل نصية ثابتة الطول مُضافة إليها مسافات في ترميز EBCDIC. غالبًا ما تُنتج برامج التحويل شيفرة جافا تحافظ على دلالات السلاسل النصية الثابتة الطول والمُضافة إليها مسافات حتى بعد التحويل إلى UTF-8، مما ينتج عنه جافا تتعامل مع السلاسل النصية كما لو كانت مُبرمج حاسوب مركزي في سبعينيات القرن الماضي.
جافا
// Jobol: preserves COBOL fixed-length string handling
static char[] WS_CUSTOMER_NAME = new char[40]; // Was PIC X(40)
static char[] WS_CUSTOMER_ADDR = new char[80]; // Was PIC X(80)
// COBOL-style space-padding comparison
if (new String(WS_CUSTOMER_NAME).trim().equals("SMITH")) { ... }
// COBOL-style string concatenation with padding
System.arraycopy(name.toCharArray(), 0, WS_CUSTOMER_NAME, 0,
Math.min(name.length(), 40));
جافا
// Idiomatic Java: proper String types and domain objects
private String customerName; // Trim on read, no padding
private String customerAddress;
// Clean comparison
if ("Smith".equalsIgnoreCase(customer.name())) { ... }
لماذا تقوم المحولات بذلك؟ يحتوي تعريف COBOL PIC X(40) على طول يحتفظ به المحول كحجم مصفوفة Java. قد تتم معالجة التحويل من EBCDIC إلى UTF-8، ولكن يتم نقل دلالات الطول الثابت دون داعٍ.
المأزق: خريطة PIC X(n) الحقول String الكائنات، والتقليم عند القراءة، وإزالة قيود الطول الثابت. السياق الوحيد الذي تكون فيه قيود الطول مهمة هو عند حدود الثبات (أطوال أعمدة قاعدة البيانات، ومواقع تنسيق الملف)، وليس في نموذج المجال.
النمط 5: معالجة الأخطاء عبر رموز الحالة
تُبلغ لغة كوبول عن حالات الخطأ من خلال رموز الحالة: FILE STATUS، SQLCODE، RETURN-CODE. تحافظ المحولات على هذا النمط في جافا، مما ينتج عنه كود يتحقق من رموز الحالة الصحيحة بعد كل عملية بدلاً من استخدام نموذج استثناءات جافا.
جافا
// Jobol: COBOL status code pattern in Java
static int WS_FILE_STATUS;
static int WS_SQL_CODE;
CustomerFile.read(DB_CUST_KEY);
WS_FILE_STATUS = CustomerFile.getLastStatus();
if (WS_FILE_STATUS == 10) {
// Not found
} else if (WS_FILE_STATUS == 35) {
// File not available
} else if (WS_FILE_STATUS != 0) {
// Unknown error
}
جافا
// Idiomatic Java: exceptions for error conditions
try {
Customer customer = customerRepository.findById(customerId)
.orElseThrow(() -> new CustomerNotFoundException(customerId));
// process customer
} catch (DatabaseUnavailableException e) {
log.error("Database unavailable during credit check", e);
throw new CreditCheckServiceException("Service temporarily unavailable", e);
}
لماذا تقوم المحولات بذلك؟ يُعدّ فحص رمز الحالة نمطًا برمجيًا في لغة كوبول؛ وتحويله إلى دالة في جافا تُعيد أو تُعيّن حقل حالة هو تحويل آلي. أما إدراك أن استثناءات جافا هي المكافئ الاصطلاحي في هذا النمط، فيتطلب حُكمًا معماريًا، وليس ترجمة آلية.
المأزق: قم بربط حالات خطأ COBOL باستثناءات Java. يصبح FILE STATUS 10 (لم يتم العثور على السجل) Optional.empty() أو استثناء خاص بالمجال. تتحول أخطاء SQLCODE إلى استثناءات قاعدة بيانات مُحددة النوع. يعكس هيكل كود Java الغرض، حيث تُستخدم try/catch لحالات الفشل المتوقعة، والاستثناءات غير المُدققة للحالات غير المتوقعة.
النمط 6: بنية الفئات المتجانسة
برامج كوبول مصممة لتكون متجانسة، حيث يتولى برنامج واحد وظيفة عمل كاملة. تقوم المحولات بإنشاء فئة جافا واحدة لكل برنامج كوبول، مما ينتج عنه فئات جافا قد يصل طولها إلى آلاف الأسطر وتتولى مسؤوليات متعددة كان من الممكن توزيعها في التصميم الكائني التوجه على عدة فئات متخصصة.
لماذا تقوم المحولات بذلك؟ لأن برنامج COBOL واحد يُقابل فئة Java واحدة، ووحدة الترجمة في المحول هي البرنامج نفسه. يصبح الهيكل الداخلي للبرنامج (فقراته، أقسامه، سلاسل PERFORM) هو الهيكل الداخلي للفئة دون الحاجة إلى تقسيمه إلى فئات أصغر.
الحل: تطبيق مبدأ المسؤولية الواحدة على كل فئة مُحوّلة. يجب أن تتحول فئة Jobol المكونة من 3,000 سطر، والتي تتحقق من صحة المدخلات، وتقرأ من قاعدة بيانات، وتطبق قواعد العمل، وتُنسق المخرجات، وتكتب إلى ملف، إلى: مُدقّق مدخلات، ومستودع، وخدمة مجال، ومُنسّق، وكاتب، كل منها قابل للاختبار بشكل منفصل، ويركز كل منها على مسؤولية واحدة.
متطلبات التحليل الإنشائي
لكل نمط من أنماط Jobol عملية إعادة هيكلة مقابلة. لكن لا يمكن للمُحوِّل تطبيق إعادة الهيكلة، بل يتطلب الأمر فهم وظيفة البرنامج قبل تحديد كيفية إعادة هيكلته. وهذا الفهم هو تحديدًا ما يوفره التحليل البنيوي لمصدر COBOL قبل تشغيل أي أداة تحويل.
وبشكلٍ أدق، يُنتج التحليل الهيكلي المدخلات التي تتطلبها قرارات التحويل:
جرد منطق الأعمال. يشمل هذا الجرد جميع شروط EVALUATE، وفروع IF، وصيغ COMPUTE في كل برنامج، أي ما يقرره البرنامج، وليس فقط هيكله. هذا الجرد هو المواصفات التي يجب أن يطابقها كود Java المُعاد هيكلته. يتطلب برنامج يحتوي على 847 شرط EVALUATE بنية فئة مستهدفة تستوعب 847 نقطة قرار؛ مخرجات المُحوِّل هي المسودة الأولية، وليست المنتج النهائي.
مخطط التبعية. أي البرامج تستدعي أي برامج أخرى. سلسلة PERFORM التي تمتد عبر برامج COBOL متعددة تتحول إلى مخطط استدعاء خدمة في Java. يحدد مخطط التبعية البرامج التي يمكن إعادة هيكلتها بشكل مستقل (عدد قليل من التبعيات الواردة) والبرامج التي يجب إعادة هيكلتها كمجموعات منسقة (العديد من التبعيات المشتركة من خلال ملفات النسخ أو البيانات المشتركة).
تحديد التعليمات البرمجية غير المستخدمة. تُعتبر الفقرات والأقسام التي لا يتم تنفيذها مطلقًا من أي مسار تنفيذ إنتاجي تعليمات برمجية غير مستخدمة، ويجب ألا تظهر في كود Java المُحوّل على الإطلاق. تُؤدي برامج التحويل التي تتضمن تعليمات برمجية غير مستخدمة إلى تضخيم قاعدة التعليمات البرمجية المُحوّلة وزيادة جهد إعادة هيكلتها لاحقًا.
استعادة نموذج البيانات. تتضمن هذه العملية إدخالات VSAM FD، وتعريفات جداول DB2، وهياكل ملفات النسخ التي تُعرّف بيانات البرنامج. يرتبط كل هيكل بيانات COBOL بكائن واحد أو أكثر من كائنات مجال Java؛ ويتم تحديد هذا الارتباط بواسطة نموذج البيانات، وليس بواسطة أسماء الحقول في WORKING-STORAGE.
| مدخلات التحليل | قرار التحويل الذي يحركه |
|---|---|
| تقييم/إذا عدد الفروع | تقسيم المجال إلى فئات، وعدد حالات القرار التي تعالجها كل خدمة |
| عدد التبعيات الواردة | تسلسل إعادة الهيكلة، البرامج ذات أقل عدد من التبعيات أولاً |
| نسبة الرموز الميتة | تقليل النطاق، استبعاد التعليمات البرمجية التي لا يمكن الوصول إليها من التحويل |
| حقول COMP-3 | BigDecimal تعيين لكل حقل رقمي |
| أطوال حقول PIC X | تعيين نوع السلسلة وقيود طبقة الاستمرارية |
| PERFORM graph structure | تفكيك طبقة الخدمة، وسلاسل PERFORM تصبح استدعاءات خدمة المجال |
| استخدام حالة الملف | تصميم نموذج الاستثناءات، وتحديد رموز الحالة التي ترتبط بأنواع الاستثناءات المختلفة. |
ما الذي ينبغي أن ينتجه التحويل بدلاً من ذلك؟
البديل لـ Jobol هو عملية تحويل تستخدم لغة COBOL كمواصفة وليس كقالب. يعرف برنامج COBOL منطق العمل، ويجب على برنامج Java التعبير عن هذا المنطق بلغة Java.
مبدأ التحويل: حوّل الغرض، لا الصيغة. لغة كوبول
IF CUST-CREDIT-SCORE < 650 MOVE 'DECLINED' TO WS-CREDIT-RESULTيقول: "يتم رفض العميل الذي تقل درجة ائتمانه عن 650". يجب أن يقول جافا الشيء نفسه بلغة جافا:if (customer.creditScore() < CreditThresholds.MINIMUM_SCORE) return CreditDecision.declined(...). ليسif (CUST_CREDIT_SCORE < 650) { WS_CREDIT_RESULT = "DECLINED"; }.
سير العمل العملي للتحويل الذي ينتج لغة جافا اصطلاحية:
الخطوة الأولى: التحليل الهيكلي لمصدر COBOL، ورسم بياني للتبعيات، وجرد منطق الأعمال، واستعادة نموذج البيانات، وتحديد التعليمات البرمجية غير المستخدمة. تُنتج هذه الخطوة المواصفات. لا يتم تحويل أي شيء حتى اكتمال هذه الخطوة.
الخطوة الثانية: تصميم نموذج المجال، وتحديد كيانات الأعمال (العميل، الحساب، المعاملة، السياسة) التي تعمل عليها برامج كوبول. تصبح هذه الكيانات فئات مجال جافا. أما متغيرات التخزين المؤقت التي تمثل حالة الكيان فتصبح حقولًا في فئة المجال المناسبة.
الخطوة الثالثة: تصميم طبقة الخدمة، وتحديد العمليات التجارية (التحقق من الائتمان، ومعالجة المدفوعات، وحساب الرصيد) التي تُنفذها فقرات وأقسام لغة كوبول. تُصبح هذه العمليات دوال خدمة جافا في فئة خدمة المجال المناسبة. وتُصبح سلسلة أوامر PERFORM التي تُرتّب الفقرات منطق تنسيق الخدمة.
الخطوة 4: التحويل الآلي كمولد مسودة، استخدم أداة التحويل لإنتاج مسودة جافا كنقطة بداية لكل برنامج، مستندة إلى نموذج المجال المصمم في الخطوتين 2 و3. راجع المسودة مقابل قائمة منطق الأعمال للتحقق من تمثيل كل فرع من فروع القرار.
الخطوة 5 : إعادة هيكلة منهجية وفقًا لأنماط Jobol، وتطبيق الإصلاحات الستة للأنماط المضادة: استبدال الحالة الثابتة بحالة الكائن، وتوزيع الأساليب الثابتة على فئات المجال، واستبدال رموز الحالة بالاستثناءات، واستبدال double مع BigDecimalاستبدل المصفوفات ذات الطول الثابت بـ String، تفكيك الفئات المتجانسة إلى خدمات ذات مسؤولية واحدة.
الخطوة السادسة: اختبار التكافؤ السلوكي، قم بتشغيل كود Java المُعاد هيكلته مقابل مجموعة اختبارات التوصيف المُولّدة من تحليل COBOL. يجب أن يحتوي كل شرط EVALUATE وفرع IF على حالة اختبار واحدة على الأقل تُفعّله وتتحقق من تكافؤه مع مُخرجات COBOL.
كيفية SMART TS XL يمنع استخدام دواء جوبول من المصدر
إن التحليل الهيكلي، وهو شرط أساسي لمنع أخطاء Jobol، ورسم بياني للتبعية، وجرد منطق الأعمال، وتحديد التعليمات البرمجية غير المستخدمة، واستعادة نموذج البيانات، هو بالضبط ما SMART TS XLيوفر تحليل مصدر COBOL قبل تشغيل أي أداة تحويل.
SMART TS XLالصورة تحليل الكود الثابت يُفصّل هذا الأمر كل شرط EVALUATE، وكل فرع IF، وكل صيغة COMPUTE، وكل علاقة PERFORM في مصدر COBOL، وهو مخزون منطق الأعمال الكامل الذي يجب أن يُمثله كود Java المُعاد هيكلته بدقة. عندما تُنتج أداة التحويل Jobol، يكون مخزون منطق الأعمال هو المواصفات التي يتم التحقق من صحة إعادة الهيكلة بناءً عليها: يجب أن يظهر كل شرط في المخزون في كود Java، في فئة المجال المناسبة، مُعبرًا عنه بلغة Java.
تُنتج عملية ربط تبعيات التطبيقات مخططَي PERFORM و PL/C، اللذين يُحددان بنية طبقة الخدمات في جافا. تنتمي البرامج التي تستدعي بعضها البعض بشكل متكرر إلى نفس السياق المحدود. أما البرامج التي تستدعيها برامج أخرى كثيرة فهي الخدمات المشتركة التي يجب تصميمها بعناية لدعم جميع مستخدميها في بنية جافا. يُعد مخطط التبعيات مُدخلاً لخطوة تصميم طبقة الخدمات، حيث يُحوّل بنية الربط الضمني في COBOL إلى بنية حقن التبعية الصريحة في جافا.
يُحدد تحليل تحديث الأنظمة القديمة الأجزاء البرمجية غير المستخدمة، والفقرات، والأقسام التي لا يتم الوصول إليها من مسارات التنفيذ في بيئة الإنتاج، والتي يجب استبعادها تمامًا من نطاق التحويل. إن تحويل لغة COBOL غير المستخدمة إلى لغة Jobol غير المستخدمة، ثم إعادة هيكلة لغة Jobol غير المستخدمة، يُهدر جهدًا كان من الممكن تجنبه من خلال خطوة تحديد الأجزاء البرمجية غير المستخدمة قبل بدء عملية التحويل.
تُؤكد خاصية تحليل الأثر صحة تسلسل إعادة الهيكلة: فعندما تتغير واجهة برنامج COBOL أثناء إعادة الهيكلة من لغة Jobol إلى لغة Java القياسية، يُحدد تحليل الأثر جميع البرامج الأخرى التي يجب تحديث نظيرتها في Java لتتوافق مع الواجهة المُغيرة. وتُقلل إعادة الهيكلة بترتيب التبعية، بدءًا من الأقل تبعية، من التنسيق المطلوب في كل خطوة.
تُترجم برامج التحويل الصيغة النحوية. أما التحديث فيُغير المعنى.
تُعدّ برامج التحويل الآلية من لغة كوبول إلى جافا أسرع من إعادة كتابة الكود يدويًا. كما أنها مُحسّنة لتحقيق هدف مختلف: التطابق النحوي بدلًا من التكافؤ الدلالي في لغة الهدف. تُعرف لغة جوبول بأنها نتاج التطابق النحوي عندما تختلف النماذج الهيكلية للغة المصدر (كوبول) عن لغة الهدف (جافا) اختلافًا جوهريًا.
إن المنظمات التي تتجنب استخدام Jobol ليست هي تلك التي تستخدم محولات أفضل، بل هي تلك التي تتعامل مع المحول كمولد مسودة بدلاً من منتج نهائي، وتستثمر في التحليل الهيكلي قبل بدء التحويل، وتصمم نموذج مجال Java قبل تشغيل المحول، وتطبق إعادة هيكلة منهجية على مخرجات المحول باستخدام جرد منطق الأعمال كمواصفات للتحقق.
يمكن تجنب استخدام لغة كوبول. تكمن تكلفة تجنبها في أعمال التحليل الهيكلي ونمذجة المجال التي ينبغي أن تسبق أي عملية تحويل. أما تكلفة عدم تجنبها فهي نظام جافا يتطلب خبرة في لغة كوبول لصيانته، مما يعني أن الفائدة المرجوة من التحديث، وهي القدرة على صيانة النظام بواسطة مطوري جافا، لن تتحقق أبدًا.
حوّل الغاية، لا الصيغة. الفرق هو القيمة الكاملة للتحديث.


