ABAP/4 se COBOLu zatraceně podobá. Jako vejce vejci. Všechno má svoje, i na tohle se dá zvyknout, ale začátky jsou holt těžké: http://www.jaros.in/…sapem-1-cast
ABAP urcite vychadzal z COBOLu. Mne pripada ako vylepseny COBOL s integrovanym SQL.
COBOL sice umoznuje pouzivat ESQL, ale vsetky premenne v programe su globalne a neumoznuje standardne ani rekurziu. Pretoze som mal skusenosti s COBOLom programovanie v ABAPe sa mi zdalo ovela lahsie ako v COBOLe – ale s ABAPom nemam zase moc skusenosti, pretoze som som ho skusal len niekolko dni. Nejake zdrojaky som si ale odlozil – napriklad, vypocet faktorialu pomocou rekurzie je v ABAPe celkom prirodzeny, ale v COBOLe to az tak jednoduche nie je a je to pracnejsie:
ABAP:
REPORT zrm071. PARAMETERS: nummer TYPE i DEFAULT 5. DATA: fak_ergebnis TYPE f, result TYPE p, n TYPE i. START-OF-SELECTION. n = 1. WHILE n <= nummer. PERFORM faktorial USING n CHANGING fak_ergebnis. result = fak_ergebnis. WRITE: / 'Faktorial(', n, ') = ', result. n = n + 1. ENDWHILE. FORM faktorial USING value(n) TYPE i CHANGING fak TYPE f. DATA: n_1 TYPE i, fak_n_1 TYPE f. IF n <= 0. fak = 1. ELSE. n_1 = n - 1. PERFORM faktorial USING n_1 CHANGING fak_n_1. fak = n * fak_n_1. ENDIF. ENDFORM. END-OF-SELECTION.
COBOL:
Program sa musi specialne deklarovat ako RECURSIVE
1. sposob je pouzit LOCAL-STORAGE SECTION:
IDENTIFICATION DIVISION. PROGRAM-ID. FACTORIAL RECURSIVE. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-ISERIES. OBJECT-COMPUTER. IBM-ISERIES. DATA DIVISION. WORKING-STORAGE SECTION. 01 NUMB PIC 9(4) VALUE 5. 01 FACT PIC 9(8) VALUE 0. LOCAL-STORAGE SECTION. 01 NUM PIC 9(4). PROCEDURE DIVISION. MOVE NUMB TO NUM. IF NUMB = 0 MOVE 1 TO FACT ELSE SUBTRACT 1 FROM NUMB CALL "FACTORIAL" MULTIPLY NUM BY FACT END-IF. DISPLAY NUM "! = " FACT. GOBACK. END PROGRAM FACTORIAL.
2. sposob je elegantnejsi ale zrejme specificky pre ILE COBOL na AS/400 (pouzit CALL PROCEDURE)
IDENTIFICATION DIVISION. PROGRAM-ID. FACTORIAL RECURSIVE. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-AS400. OBJECT-COMPUTER. IBM-AS400. DATA DIVISION. WORKING-STORAGE SECTION. 01 RESULT PIC 9(20). 01 CALL-RESULT PIC 9(20). 01 N-MINUS-1 PIC 9(4). LINKAGE SECTION. 01 N PIC 9(4). PROCEDURE DIVISION USING BY VALUE N RETURNING RESULT. IF N = 0 COMPUTE RESULT = 1 ELSE COMPUTE N-MINUS-1 = N - 1 CALL PROCEDURE 'FACTORIAL' USING BY VALUE N-MINUS-1 RETURNING INTO CALL-RESULT COMPUTE RESULT = N * CALL-RESULT END-IF. GOBACK.
a tu je volajuci program:
IDENTIFICATION DIVISION. PROGRAM-ID. RECURTEST. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-AS400. OBJECT-COMPUTER. IBM-AS400. SPECIAL-NAMES. DATA DIVISION. WORKING-STORAGE SECTION. 01 N PIC 9(4). 01 RESULT PIC 9(20). LINKAGE SECTION. PROCEDURE DIVISION. PERFORM VARYING N FROM 0 BY 1 UNTIL N = 21 CALL PROCEDURE 'FACTORIAL' USING BY VALUE N RETURNING INTO RESULT DISPLAY N "! = " RESULT END-PERFORM. GOBACK.
Ani skompilovat a zlinkovat to nie je jednoduche – o tom si mozete precitat napriklad v tomto threade: Back with recursion in COBOL again! a sami si to aj mozete prakticky vyskusat ak si vytvorite konto na free AS/400
Kazdopadne ABAP ani COBOl nie su jazyky navrhnute primarne na implementaciu nejakych komplikovanych algoritmov ale na pracu s datami.
OpenCobol som nikdy neskusal. Neviem ci vobec tento projekt este zije. Rekurzia je podporovana zrejme v standarde COBOL 85. pouzitim klucoveho slova RECURSIVE.
Takisto COBOL nie je moje hobby, pouzivam ho len v praci ked je to nutne. Okrem Open COBOL a Tiny COBOL sa daju stiahnut este volne COBOL-IT a MF Net Express. Netexpress je ale obmedzeny na 2200 risdkov kodu a takisto neviem, ci skusobna verzia COBOL-IT nie je crippleware.
Doporucujem ale radsej vytvorit si konto na free AS/400 kde jek dispozicii enterprise class compiler a 50 MB diskoveho priestoru zadara: Holger Scherer.
Mimochodom nepoznate niekto nejaky mainframe so z/OS,kde by som mohol ziskat konto zadarmo? Moc by ma to zaujimalo.
nejjednodussi je pouzit IGYWCG (compile and go) proceduru, viz. JCL:
//COBOLC JOB (12345678),PRG,MSGCLASS=H, // MSGLEVEL=(1,1),CLASS=A,NOTIFY=&SYSUID //STEPA EXEC PROC=IGYWCG //COBOL.SYSIN DD * IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. PROCEDURE DIVISION. DISPLAY "HELLO, WORLD!". STOP RUN.
pro zakladni informace doporucuji http://www.redbooks.ibm.com/…g246366.html