
Πώς να μετατρέψετε αυτόματα την COBOL σε Go
Παρόλο που η COBOL μπορεί να θεωρηθεί ως γλώσσα κληρονομιάς, εξακολουθούν να υπάρχουν δισεκατομμύρια γραμμές COBOL στην παραγωγή. Ο εκσυγχρονισμός αυτών των συστημάτων που έχουν υψηλό κόστος λειτουργίας και συντήρησης αποτελεί πρόκληση. Μια λύση σε αυτό το ζήτημα είναι ένας μεταγλωττιστής COBOL σε Go που θέλω να παρουσιάσω σε αυτό το άρθρο.
COBOL
Η COBOL πρωτοεμφανίστηκε το 1959 και είναι μια μεταγλωττισμένη γλώσσα σχεδιασμένη για επιχειρηματική χρήση. Σήμερα, κυρίως μεγάλα χρηματοπιστωτικά ιδρύματα και κυβερνητικοί οργανισμοί έχουν συστήματα που χρησιμοποιούν COBOL στην παραγωγή. Αναπτύσσεται συχνά σε υπολογιστές mainframe, για παράδειγμα στον Z Mainframe που τρέχει z/OS της IBM.
Πρόκειται για μια σημαντική αγορά, διότι σε όλο τον κόσμο λειτουργούν περίπου 10.000 υπολογιστές mainframe. Αν και τώρα υπάρχουν και αντικειμενοστραφή χαρακτηριστικά, η COBOL είναι κυρίως μια διαδικαστική και προστακτική γλώσσα. Αυτό είναι ένα απλό πρόγραμμα hello word σε COBOL:
hello.cob
* Sample COBOL program
IDENTIFICATION DIVISION.
PROGRAM-ID. hello.
PROCEDURE DIVISION.
DISPLAY "Hello, world!".
STOP RUN.
Μπορείτε να το δοκιμάσετε στον δικό σας υπολογιστή, για παράδειγμα με το GnuCOBOL εκτελώντας την ακόλουθη εντολή μεταγλώττισης:
$ cobc -x hello.cob
$ ./hello
Go
Η Go είναι μια στατικά τυποποιημένη, μεταγλωττισμένη γλώσσα προγραμματισμού υψηλού επιπέδου που σχεδιάστηκε στην Google από τους Robert Griesemer, Rob Pike και Ken Thompson. Τα πλεονεκτήματά της είναι το χαμηλό εμπόδιο εισόδου για νέους προγραμματιστές και ότι είναι μια μεταγλωττισμένη γλώσσα με γρήγορη εκτέλεση.
Έτσι, είναι μια καλή επιλογή όταν προσπαθείτε να εκσυγχρονίσετε παλαιές εφαρμογές COBOL. Ο πηγαίος κώδικας της Go είναι εύκολα κατανοητός ακόμη και για προγραμματιστές που είναι νέοι στην Go. Αυτό είναι ένα πλεονέκτημα επειδή η αγορά για προγραμματιστές λογισμικού COBOL είναι δύσκολη, όπως περιγράφω στην επόμενη ενότητα.
Αγορά για προγραμματιστές COBOL
Πολλές μεγάλες εταιρείες που έχουν συστήματα που λειτουργούν σε COBOL δυσκολεύονται να προσελκύσουν προγραμματιστές που μπορούν να συντηρήσουν αυτά τα συστήματα. Ο μέσος όρος ηλικίας των προγραμματιστών λογισμικού COBOL είναι υψηλός και υπάρχουν λίγοι νέοι προγραμματιστές που θέλουν να μάθουν COBOL. Αυτό αποτελεί κίνδυνο για τις εταιρείες που έχουν πολλά δισεκατομμύρια γραμμές COBOL σε παραγωγή. Γι' αυτό μια πιθανή λύση μετάβασης όπως το COBOL-to-Go από τον Enno Richter είναι χρήσιμη.
Μετατροπέας COBOL-to-Go
Ο ανώτερος προγραμματιστής COBOL Enno Richter με πολλές δεκαετίες (50 χρόνια) εμπειρίας στον προγραμματισμό COBOL ανέπτυξε έναν μετατροπέα COBOL σε Go που ονομάζεται COBOL-to-Go. Ο μεταγλωττιστής προέκυψε από ένα παλαιότερο έργο RPG-to-COBOL. Υποστηρίζει το πρότυπο COBOL-85, αλλά χαρακτηριστικά των νεότερων προτύπων COBOL μπορούν να προστεθούν κατά παραγγελία. Ένα από τα πλεονεκτήματά του είναι ότι ο κώδικας Go που προκύπτει είναι ευανάγνωστος και σαφώς δομημένος. Δεν απαιτείται σύστημα χρόνου εκτέλεσης και έτσι ο κώδικας Go που προκύπτει παραμένει ανεξάρτητος από το σύστημα COBOL-to-Go.
Η Go μεταγλωττίζει σε πολλά λειτουργικά συστήματα και έτσι το πρόγραμμα COBOL μπορεί να εκτελεστεί σε δυνητικά πολλά λειτουργικά συστήματα. Όλα τα δικαιώματα του κώδικα Go που προκύπτει παραμένουν στους κατόχους των πνευματικών δικαιωμάτων του κώδικα COBOL. Υπάρχουν εναλλακτικοί μεταγλωττιστές COBOL, όπως ένας μεταγλωττιστής COBOL σε Java στην αγορά, αλλά ο Enno Richter ισχυρίζεται ότι τα αποτελέσματα του μεταγλωττιστή Go που χρησιμοποιεί είναι ευκολότερα κατανοητά και συντηρήσιμα.
Παράδειγμα κώδικα
Το παρακάτω απόσπασμα δείχνει τον κώδικα COBOL στην αριστερή πλευρά και τον κώδικα Go που προκύπτει από τη μεταγλώττιση στη δεξιά πλευρά. Ίσως χρειαστεί να κάνετε οριζόντια κύλιση για να δείτε τον κώδικα Go που προκύπτει: `
* :00190: // 00190: *
*----------------------------------------------------------------* :00191: // 00191: *----------------------------------------------------------------
**------* *-----------------------------------------------------** :00192: // 00192: **------* *-----------------------------------------------------*
** 30 * * P R O G R A M M A B L A U F ** :00193: // 00193: ** 30 * * P R O G R A M M A B L A U F *
**------* *-----------------------------------------------------** :00194: // 00194: **------* *-----------------------------------------------------*
PROCEDURE DIVISION. :00195:
**---------------------------------------------------------------* :00196: // 00196: **---------------------------------------------------------------
** V e r a r b e i t u n g * :00197: // 00197: ** V e r a r b e i t u n g
**---------------------------------------------------------------* :00198: // 00198: **---------------------------------------------------------------
DISPLAY "Test_02400_START --------". :00199: erse.DISlx(&DIS, "Test_02400_START --------") // COBZEI:00199
ersestr1 = erse.DISout(fDISPLAY, &DIS, " ") // COBZEI:00199
* :00200: // 00200: *
* :00201: // 00201: *
**-----------------------------------------------------------* :00202: // 00202: **-----------------------------------------------------------*
** IF LITERAL --- NUMERISCH (Struktur) * :00203: // 00203: ** IF LITERAL --- NUMERISCH (Struktur) *
**-----------------------------------------------------------* :00204: // 00204: **-----------------------------------------------------------*
* IF 12 > BBB-8 :00205: // 00205: * IF 12 > BBB-8
* MOVE SPACE TO BBB-1 :00206: // 00206: * MOVE SPACE TO BBB-1
* END-IF. :00207: // 00207: * END-IF.
* :00208: // 00208: *
* :00209: // 00209: *
**-----------------------------------------------------------* :00210: // 00210: **-----------------------------------------------------------*
** IF NUMERISCH (Struktur) --- LITERAL * :00211: // 00211: ** IF NUMERISCH (Struktur) --- LITERAL *
**-----------------------------------------------------------* :00212: // 00212: **-----------------------------------------------------------*
* IF BBB-8 > 12 :00213: // 00213: * IF BBB-8 > 12
* MOVE SPACE TO BBB-1 :00214: // 00214: * MOVE SPACE TO BBB-1
* END-IF. :00215: // 00215: * END-IF.
* :00216: // 00216: *
* :00217: // 00217: *
**-----------------------------------------------------------* :00218: // 00218: **-----------------------------------------------------------*
** IF LITERAL --- NUMERISCH (Nativ) * :00219: // 00219: ** IF LITERAL --- NUMERISCH (Nativ) *
**-----------------------------------------------------------* :00220: // 00220: **-----------------------------------------------------------*
* IF 12 > Z3 :00221: // 00221: * IF 12 > Z3
* MOVE SPACE TO BBB-1 :00222: // 00222: * MOVE SPACE TO BBB-1
* END-IF. :00223: // 00223: * END-IF.
* :00224: // 00224: *
* :00225: // 00225: *
**-----------------------------------------------------------* :00226: // 00226: **-----------------------------------------------------------*
** IF NUMERISCH (Nativ) --- LITERAL * :00227: // 00227: ** IF NUMERISCH (Nativ) --- LITERAL *
**-----------------------------------------------------------* :00228: // 00228: **-----------------------------------------------------------*
* IF Z3 > 12 :00229: // 00229: * IF Z3 > 12
* MOVE SPACE TO BBB-1 :00230: // 00230: * MOVE SPACE TO BBB-1
* END-IF. :00231: // 00231: * END-IF.
* :00232: // 00232: *
* :00233: // 00233: *
**-----------------------------------------------------------* :00234: // 00234: **-----------------------------------------------------------*
** IF NUMERISCH (Struktur) ---- NUMERISCH (Struktur) * :00235: // 00235: ** IF NUMERISCH (Struktur) ---- NUMERISCH (Struktur) *
**-----------------------------------------------------------* :00236: // 00236: **-----------------------------------------------------------*
IF BBB_8 > HHH :00237: if erse.IFNCVCV(&BBB_8_cv, ">", &HHH_cv) {
MOVE SPACE TO BBB_1 :00238: erse.MVACVLI(&BBB_1_cv,"SPACE") // COBZEI:00238
END-IF. :00239: } // ENDIF
* :00240: // 00240: *
* :00241: // 00241: *
**-----------------------------------------------------------* :00242: // 00242: **-----------------------------------------------------------*
** P R O G R A M M - E N D E * :00243: // 00243: ** P R O G R A M M - E N D E *
**-----------------------------------------------------------* :00244: // 00244: **-----------------------------------------------------------*
DISPLAY "Test_02400 ENDE -------------". :00245: erse.DISlx(&DIS, "Test_02400 ENDE -------------") // COBZEI:00245
ersestr1 = erse.DISout(fDISPLAY, &DIS, " ") // COBZEI:00245
STOP RUN. :00246: //---------------------------------------------------------------
// STOP-RUN (Ende der Programmlogik)
//---------------------------------------------------------------
os.Exit(0)
**--------------------------------------------------------------** :00247: // 00247: **--------------------------------------------------------------*
** Ende : ** :00248: // 00248: ** Ende : *
** ~~Projekt~111COBOL~Sourcen~Test_02400.cbl (2023-04-20 ** :00249: // 00249: ** //Projekt/111COBOL/Sourcen/Test_02400.cbl (2023-04-20 *
* ** :00250: // 00250: * *
**--------------------------------------------------------------** :00251: // 00251: **--------------------------------------------------------------*
Όπως μπορείτε να δείτε, ο κώδικας Go που προκύπτει είναι εύκολα κατανοητός και συντηρήσιμος. Ο Enno Richter αναζητά εταιρείες συνεργασίας που μπορούν να διανείμουν το πολύτιμο έργο του. Αν ενδιαφέρεστε, γράψτε μου ένα μήνυμα ή επικοινωνήστε απευθείας με τον Enno Richter
Συμπέρασμα
Με αυτό το άρθρο ελπίζω να μπορέσατε να δείτε ότι υπάρχουν λύσεις στο ζήτημα της έλλειψης προγραμματιστών COBOL στην αγορά. Μια τέτοια λύση είναι ο μεταγλωττιστής COBOL-to-Go που μπορεί να είναι το κομμάτι που σας λείπει για τη μετάβαση στην COBOL.
Αναφορές
- Enno Richter Software: https://www.richter-software.de
- COBOL-to-Go: https://www.richter-software.de/fileadmin/pdf/COBOL-to-Go_Marketing_Folien_Web_Deutsch.pdf
- GnuCOBOL: https://gnucobol.sourceforge.io
- COBOL Programming Course: https://openmainframeproject.org/projects/cobol-programming-course
Φωτογραφία εξωφύλλου από Pete Linforth από Pixabay
Δημοσιευμένο
3 Αυγ 2024
