Ac jsem programator mainframu, a s COBOLem se obcas setkam (nastesti ne denne), ta cisla mi nejak nesedi. Zahraji si na dablova advokata:
1. Radek programu v COBOLu je 80%, radek programu v Jave a C je 20%.
2. Programatoru v COBOLu je 50%, programatoru v Jave a C je 50%.
Drive bylo programatoru radove mene. Presto mensi mnozstvi programatoru vyprodukovalo vice radek COBOLu. Neni tedy COBOL dobry jazyk, v kterem se programuje efektivneji nez v Jave nebo C?
Jak rika klasik, program s nula radky ma tu nejhorsi chybu na svete – je nanic :-)
Ale mate pravdu v tom, ze COBOLovsky program s nula radky je chybny, protoze v nem chybi vyzadovane oddily :-)
Mimochodem, zajimavy je, jak cecko (gcc) prelozi prazdny soubor – objektovy file ma neco pres 600 bajtu a po stripovani cca 400 bajtu…
Neznamena (a ja to vim moc dobre, znam Common Lisp). Napsal jsem to jako dabluv advokat. Proste tem cislum neverim, protoze takhle z nich vyplyva, ze programatori v COBOLu mohou (za jednotku casu) napsat mnohem vic radek nez lide v ostatnich jazycich. Nesedi mi to dokonce ani kdybychom prijali, ze je COBOL (o neco) ukecanejsi.
Problém je od začátku v tom, že počet LOC je dost nesmyslná metrika. Důležité je, co daný program umí, což lze pojmout jako množství implementovaných vlastností nebo užitnou hodnotu programu vytvořené za jednotku času. Což samozřejmě není totéž a neplatí mezi tím nutně ani přímá úměra. A ani jedna z těch metrik není závislá jenom na jazyku, ale i na knihovnách apod.
To jestli je ukecanejsi, zalezi na resenem problemu, to se tezko obecne porovnava (stejne jako efektivita prekladace na netrivialnich prikladech). Treba typicke one-linery se v COBOLu musi rozepsat treba na 30 radku – viz napriklad vyse uvedeny vypocet faktorialu, na druhou stranu nejaka vysokourovnova prace s daty (ala SQL) by v COBOLu mohla vyjit jako docela kratky program.
Mozna je to tak, ze COBOListi „musi“ napsat vice radku kodu aby udelali stejnou praci jako v jinych jazycich. No, priste si ukazeme APL, ten na to jde presne opacne nez COBOL – zadna klicova slova, pouze symboly :-)
> … vyplyva, ze programatori v COBOLu mohou (za jednotku casu) napsat mnohem vic radek nez lide v ostatnich jazycich.
Preco nie? Predpokladajme, ze programator bez ohladu na jazyk vymysli algoritmus za rovnaky cas. Programator vo FORTRANe ho ale implementuje napriklad za pol hodinu a dalsiu pol hodinu potom relaxuje. Programator v COBOLe nema ale cas na relaxaciu, pretoze na implementaciu toho isteho algoritmu musi napisat viac riadkov. Takze mu implementacia zaberie celu hodinu a za tuto hodinu vyprodukuje 2-krat tolko riadkov ako programator vo FORTRANe. To ale neznamena, ze by bol COBOL, alebo programator v COBOLe produktivnejsi. Oba programy (v COBOLe a vo FORTRANe) predsa robia to iste, akurat ze implementacia v COBOLe je pracnejsia.
Co myslite tim „efektivne“? Pokud cas od zadani k vysledku, tak to hodne zavisi na konkretnim problemu. Jednak jak moc je pro nej jazyk vhodny svym principem imperativni vs jiny a jednak jak moc je pro nej knihoven. A zrovna v tomhle jsou na tom Java i C ve vetsine oblasti docela dobre :-)
Pokud to myslite na „delku kodu“, tak tam je dulezita i citelnost kodu a v tomhle jsou na tom Java i C opet pomerne dobre.
S tou prehlednosti v C doporucuji se podivat na http://www.ioccc.org/
V dobách kralování mainframů jsem programoval v jazyce PL/1, který pro svojí nepřenositelnost už v podstatě zanikl. Na co mi stačilo deset řádků, nestačilo kolegům cobolistům ani deset stránek. Zvláště pak v deklaracích, které tvořily asi tak 80% programu, šlo o mechanické opisování téhož v podstatě do blba. V historii neexistoval ukecanější jazyk a cobolisti byli snadno k rozpoznání podle tenisového lokte. Nikdy jsem nechápal, jak vůbec mohl tak příšerný jazyk vzniknout.(V jedné porovnávací studii programovacích jazyků autor napsal, že COBOl je určen těm, kteří chápou, co znamení vezmi a, přičti k němu b a výsledek ulož do c, ale nikdy by nepochopili příkaz c=a+b). Teprve tento článek mi osvětlil, že je to kvůli managementu.
Tak velké množství řádů bylo nutno napsat právě proto, že COBOL je zoufale neproduktivní. A nejhorší bylo, že že většina z nich je mechanické opisování bez nároků na intelekt. Řekl bych, že cobolisti díky tomu moc radosti z tvůrčí práce nezažili.
Tiez mam par rokov odprogramovanych v COBOL-e na SMEP-ke a nikdy nezabudnem na tie dlhe hodiny plne rozhovorov s kolegami kym sme cakali na compilaciu programu a prvy vypis chyb. My sme mali na COBOL-e postaveny cely ASRP a cuduj sa svete, skutocne to fungovalo. A flias sme mali plnu skrinu :)
Inak praca programatora v COBOL-e je jedna zo siedmych najhorsich prac okolo pocitacov. :)
Neviem porovnat COBOL s PL/I, lebo v tom som nikdy neprogramoval. COBOL sa na zlozitejsie vypocty nehodi, je na manipulaciu s datami. Produktivita zavisi aj od prostredia. Napriklad na PC by som nikdy nepisal v COBOLe, ale na AS/400 napisem batchovy program rychlejsie v COBOLe ako v C.
Myslim, ze su to akademicke predsudky, ze vacsina COBOListov nemusi rozmyslat. Pre mnoho z tych co poznam ja tvori COBOL len jeden z mnoha jazykov, ktore pouzivaju. Velke percento prace COBOListov totiz tvori sklbenie stareho a noveho sveta, t.j. volanie COBOLovskych programov z webovych aplikacii a maintenance + troubleshooting, takze su hladani hlavne ludia, ktori ovladaju nove technologie a COBOL este k tomu.
Nechcem tym ale nijako COBOL obhajovat – je to z dnesneho hladiska kuriozne sice navrhnuty jazyk ale predsa tu mame aj podobne novsie varianty ako SQL a ABAP.
Preco sa produkuje v COBOLe viac riadkov ako v inom jazyku?
Pokusim sa to objasnit, ako mozno jediny aktivny COBOLista tu na roote :-)
Je to preto ze COBOL je ukecanejsi a a vsetky premenne v jednom programe su globalne. Kedze premenne su globalne, tak aby sa udrzal nejaky poriadok je zavedena urcita stabna kultura. Napriklad ak ma COBOLOvsky podprogram (tzv. paragraf) SUBR vstupne argumenty ARG1, ARG2,…,ARGn a dava vysledky VYSL1, VYSL2,..,VYSLm tak pred zavolanim SUBR sa najprv naplnia hodnoty globalnych premennych do argumentov a po zavolani sa zase nakopiruju vysledky do globalnych premennych, napr. takto (WS = Working Storage):
MOVE WS-VAR1 TO SUBR-ARG1 MOVE WS-VAR2 TO SUBR-ARG2 ... MOVE WS-VARn TO SUBR-ARGn PERFORM SUBR MOVE SUBR-VYSL1 TO WS-VYSL1 MOVE SUBR-VYSL2 TO WS-VYSL2 ... MOVE SUBR-VYSLm TO WS-VYSLm
Naproti tomu napriklad vo FORTRANe staci zavolat podprogram SUBR jednoducho nahradenim formalnych argumentov skutocnymi takto:
CALL SUBR(SUBR-ARG1,SUBR-ARG2,..,SUBR-ARGn,SUBR-VYSL1,SUBR-VYSL2,..,SUBR-VYSLm)
Z toho vyplyva, ze volanie subrutiny moze byt v COBOLe o m+n riadkov vacsie ako vo Fortrane. Okrem toho COBOL ma vacsi overhead – treba deklarovat 4 divisions a zapis aritmetickych vyrazov je tiez dlhsi, takze zrejme aj implementacia SUBR bude mat v COBOLe viac riadkov ako vo FORTRANe.
Okrem toho existuju prikazy ktore sa zvyknu pisat na viac riadkov, napr. spujenie viacerych substringov do jedneho stringu
STRING SUBSTR1 DELIMITED BY SIZE SUBSTR2 DELIMITED BY SIZE .... SUBSTRn DELIMITED BY SPACE INTO VYSLEDNY-STRING END-STRING
Dalej je to pouzivanie copybookov, t.j. cele casti zdrojoveho kodu (hlavne deklaracie premennych) ktore sa vytvoria v jednom zdrojovom subore a kopiruju do inych zdrojakov.
IMHO, vacsi pocet riadkov a produktivita az tak moc nesuvisia. Programator v COBOLe musi tak isto dlho rozmyslat nad nejakym algoritmom ako napriklad programator vo Fortrane, ale okrem toho si to este musi odmakat aj manualne, pretoze na implementaciu podobneho algoritmu musi napisat ovela viac riadkov kodu. To sa da vsak aj zoptimalizovat napr. vyskladnenim opajucich sa casti kodu do separatnych zdrojakov tzv. copybookov a ich kopirovanim do inych zdrojakov (prikaz COPY) a pripadne aj pouzitim dobreho editoru a Copy+Replace.
Aj ked sam ako matematik si vazim osobnost ako E. W. Dijkstra v ziadnom pripade nesuhlasim s jeho tvrdenim, ze: „The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offense.“
To ze Dijkstra toto povedal potvrdzuje iba to, ze v tomto jazyku nikdy vazne neprogarmoval. Je to prave naopak: Pretoze COBOL je dost zastaraly a na rozdiel od Javy alebo C#, kde su na vsetko metody v standardnej kniznici, alebo sa daju stiahnut zadarmo, v COBOLe nie je nic podobneho, je tam niekolko tzv. INTRINSIC FUCTIONS a inac si programator musi vsetko vymysliet sam, takze programatorov mozog zatazuje COBOL asi viac ako Java alebo C#. Mozno preto v COBOLe neradi ludia programuju. Na druhej strane asi preto sa za COBOL plati lepsie ako za main stream jazyky :-)