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