26.3.2024

Výber programovacieho jazyka pre realtime systémy alebo “V čom je napísaná D2000-ka?”

Jedno írečité slovenské príslovie hovorí, slušne povediac, o nemožnosti vytvorenia nástroja na poháňanie dobytka z materiálu s nízkou pevnosťou v ťahu.

Podstatou tohto príslovia je fakt, že na vykonanie rôznych úloh sú vhodné rôzne nástroje – a úspech človeka (ako aj to, koľko sa pri dosiahnutí cieľa narobí) výrazne závisí na zvolenom nástroji.

Obecná múdrosť je platná aj v oblasti vývoja softvéru. Akurát možných nástrojov – programovacích jazykov a prostredí – existuje široká paleta a pri meraní vhodnosti treba vziať do úvahy viacero kritérií.

Niektoré sú obecné – rýchlosť implementácie, pohodlie a možnosti vývojového prostredia, cena a licenčné podmienky ..

Iné kritériá sú špecifické pre oblasť použitia softvéru. Aké vlastnosti by mali mať systémy používané v priemysle – či už riadiace systémy, SCADA alebo MES systémy – a ktoré z týchto vlastností sú ovplyvniteľné výberom jazyka?

Jednoznačne  - z pohľadu zákazníka – sa musí jednať o stabilný a robustný softvér, schopný fungovať spoľahlivo, bez chýb. Teda žiadne presakovanie pamäte alebo iných systémových prostriedkov po týždňoch alebo mesiacoch fungovania. Rýchla detekcia, analýza a oprava problémov, pokiaľ nastanú. Multiplatformosť resp. možnosť migrácie medzi platformami v prípade potreby (napr. generačný prechod z x86 na x64 architektúru v prípade postupného nárastu rozsahu aplikácie).

Ada_1.jpg
Obr 1: padnutá nástenka miestnej káblovej televízie až tak nevadí ..

Z pohľadu vývojára sú dôležité vlastnosti ako dlhodobá udržovateľnosť (včítane možnosti zmeniť kompilátor tj. aj kompatibilita medzi kompilátormi), čitateľnosť kódu, modularita, “blbovzdornosť” kompilátora, automatické odhaľovanie runtime chýb ...

Takže – v čom sú písané SCADA a MES systémy? Niektoré v C, C++, prípadne C# (podľa http://www.dpstele.com/scada/programming-concepts.php je najčastejšie používané C alebo jeho deriváty). Novšie v Jave alebo v dotNet prostredí.

V čom je ale napísaný aplikačný server D2000? V Jave alebo dotNet asi nie, keďže má za sebou takmer štvrťstoročie vývoja. Takže Céčko?

Existuje jazyk, ktorý bol vyvinutý špeciálne pre embedded a realtime systémy na zakázku amerického ministerstva obrany (DoD). Po tom, ako štúdia z rokov 1973-74 ukázala, že míňajú ročne 3 miliardy dolárov na softvér (vyše polovicu z toho na embedded systémy) a používajú viac ako 450 programovacích jazykov, rozhodli sa štandardizovať. Zvolili pomerne zaujímavý a systematický prístup – na základe prieskumu (viac ako 200 ľudí z 85 organizácií DoD, 26 dodávateľských firiem, 16 univerzít a 7 iných organizácií) napísali špecifikáciu požiadaviek na jazyk pre embedded a realtime systémy, nazvali ju Strawman a nechali pripomienkovať odborníkom. Po viackolovom zapracovaní pripomienok vznikli detailnejšie dokumenty - Woodenman a neskôr Tinman. Následne vyhodnotili požiadavky Tinman-a voči 23 programovacím jazykom včítane Pascalu, Cobolu, Fortranu a Algolu. 

Ada_2.png
Obr 2: obrázok zo správy „Common programming language for the department of defense – background and technical requirements“  o spoločnom jazyku pre DoD z júna 1976 ukazuje rozloženie ročných nákladov DoD na počítačové systémy. Klasické sálové počítače (scientific) boli zodpovedné iba za 5% a takmer bez výnimky používali Fortran a Cobol.

V januári 1977 vyhodnotenie uzavreli s tým, že žiaden existujúci jazyk požiadavky nespĺňa – hoci Pascal, Algol 68 a PL/I by boli dobrý začiatok. Paralelne s tým vznikla ďalšia, ešte detailnejšia špecifikácia pre nový jazyk – Ironman. DoD si vybralo zo 17 záujemcov štyroch, ktorým zadalo úlohu navrhnúť jazyk podľa špecifikácie (vojaci vedia, čo je to redundancia a majú na ňu aj financie..). Kvôli objektívnosti boli vybraní záujemcovia kódovaní  ako zelený, červený, modrý a žltý tím (vojaci zrejme vedia aj čo je korupcia a politické tlaky).  Po roku práce bola vykonaná rozsiahla a verejná recenzia (vojaci vedia, že viac hláv, viac rozumu), na základe ktorej zostali iba dvaja finalisti – červený (Intermetrics) a zelený (Cii Honeywell Bull).

Ada_3.jpg
Obr 3: Chyba pretečenia 16-bitovej  Integer premennej v inerčnom navádzacom systéme nosiča Ariane 5 spôsobila v roku 1996 zničenie rakety s nákladom štyroch satelitov v súhrnnej cene cca 500 miliónov USD. Vývoj nosiča stál 7 miliárd USD.. Na obrázku satelity nazývané súhrnne Cluster.

V júni 1978 bol vypracovaný dokument Steelman obsahujúci finálne požiadavky na jazyk, ktoré museli finalisti zapracovať. V máji 1979 bol ako víťaz vybraný zelený tím (takže jazyk pre americkú armádu navrhli Francúzi). Nový jazyk bol nazvaný Ada na počesť prvej programátorky Ady Lovelace (aj keď programovala iba teoreticky, na papieri, keďže ‘hardvérista’ Charles Babbage nikdy svoj mechanický programovateľný počítač Analytical Engine nepostavil).

Treba si uvedomiť, že úlohou farebných tímov nebola implementácia (t.j. nevyvíjali kompilátory), ale iba dôkladný návrh nového jazyka.

V roku 1980 bol vydaný Referenčný manuál jazyka Ada, ktorý bol následne podrobený verejnej recenzii a v roku 1983 bol po pripomienkovaní zverejnený ako Referenčný manuál 1815A  a ANSI štandard. V tom istom roku bola validovaná prvá implementácia Ada/Ed (v skutočnosti to ešte nebol kompilátor, iba interpreter jazyka Ada).

Na rozdiel od iných jazykov, navrhnutých jednotlivcami (napr. C-čko vymysleli páni Kernighan & Ritchie, Pascal a Modulu pán Wirth, Javu pán Gosling z firmy Sun), bola Ada už od začiatku navrhovaná tak, aby spĺňala pomerne širokú škálu požiadaviek odbornej verejnosti. Súčasťou jazyka sú tasky (multithreading) a synchrónna komunikácia medzi nimi, silná typová kontrola, modularita, runtime kontroly (napr. poľa voči pretečeniu indexov), práca s časom a veľa ďalších vlastností. Neexistujú žiadne ‘varianty’ jazyka Ada – kompilátory musia spĺňať rozsiahle špecifikácie a teda kód je vysoko prenositeľný medzi platformami. Ada je navrhnutá na vývoj rozsiahlych projektov – má oddelenú špecifikáciu modulu od tela, takže moduly môžu byť kompilované nezávisle na sebe.

Štandard Ada83 bol v roku 1995 nahradený novším – Ada95, ktorý obsahoval už podporu pre objektové programovanie, protected objekty (so serializáciou prístupu z viacerých taskov), špecifikácie pre rozšírené štandardné knižnice a špecializované prílohy pre systémové a realtime programovanie (štandard bol vyvíjaný od roku 1988). Perlička – Ada95 bol prvým medzinárodne štandardizovaným objektovo orientovaným jazykom (štandardy ISO, ANSI, FIPS). V rokoch 2005 a 2012 vznikli ďalšie dva štandardy, ktoré priniesli iba drobné vylepšenia.

Ada_4.jpg
Obr 4: Sonda Mars Climate Orbiter sa rozpadla v roku 1998 pri snahe zaujať stabilnú obežnú dráhu okolo Marsu. Zo Zeme dostala povel na zapnutie ťahu v anglosaských jednotkách (pound-force) a softvér sondy očakával metrické (sila v Newtonoch), čo spôsobilo prílišné priblíženie sa k planéte. Sesterská sonda Mars Polar Lander bola zas zničená v dôsledku 40-metrového pádu počas pristávacieho manévru, keď softvér chybne vyhodnotil, že sonda už stojí.

Je vysoká pravdepodobnosť, že čitatelia o jazyku Ada ešte nepočuli. Je podstatne menej známy ako Java, C++ alebo Visual Basic. Kto a na čo ho dnes používa?

Okrem vojenských využití (DoD, NATO, Eurofighter, helikoptéry Apache) napríklad Airbus, Boeing (777 má 99.9% kódu napísaného v jazyku Ada, zvyšné promile je systém zábavy pre cestujúcich vytvorený v C++), systémy riadenia leteckej dopravy, francúzske a kórejské rýchlovlaky TGV (onboard systém ako aj riadenie trate), vesmírny program (NASA, väčšina kódu pre ISS je v jazyku Ada, rôzne satelity) a ďalšie – viď napr. http://www2.seas.gwu.edu/~mfeldman/ada-project-summary.html.

Ako sa k Ade dostala D2000-ka? Pôvodná implementácia D2000 (rok 1993) bola v prostredí OS/2 a v jazyku Modula-2. Po niekoľkých rokoch vznikla potreba portovať D2000 do prostredia Windows NT, kde nebola Modula-2 dostupná. Po dôkladnom prieskume sa prešlo na jazyk Ada (kompilátor ObjectAda od firmy Aonix). V roku 2002 bol kompilátor zmenený na Gnat od firmy AdaCore, čo umožnilo vytvoriť v tom istom roku prvý 64-bitový port D2000 pre OpenVMS a neskôr, v roku 2008, aj port pre HP-UX. V roku 2012 bola vydaná 64-bitová verzia D2000 pre Windows a v roku 2017 vydávame port pre Linux, na ktorom sa pracuje od jesene 2016. 

Ada_5.png
Obr 5: naše systémy musia fungovať dlho .. a dlho .. a dlho .. Redundantný systém s viac ako 5 a pol ročnou prevádzkou bez výpadku (2071 dní).

Trochu subjektívneho pohľadu? Programujem v Ade od roku 2003, predtým som robil s C/C++ (Visual Studio, Solaris, FreeBSD), trochu s Pascalom, assemblerom. Prechod na Adu bol pomerne jednoduchý, syntax čitateľná a jasná. Oproti C sa človek viac napíše, na druhej strane sa to bohato vráti pri prezeraní a úpravách kódov (svojich aj cudzích) a pri hľadaní chýb (svojich aj cudzích). Zacitujem tu výrok M. Kunscha, že Kernighan & Ritchie boli kryptomaniaci .. o čo úspornejšia syntax C vie byť pri písaní, o to ťažšie to má čitateľ kódu.

Nedávno som napríklad opravoval chyby v komunikačnom protokole, ktorý bol na žiadosť klienta písaný v C-čku (ako externá dll-ka pre D2000 KOM proces) a odovzdaný klientovi aj so zdrojovým kódom. Podarilo sa mi v rámci úprav eliminovať lokálnu premennú – kompilácia prešla, akurát výsledok nefungoval, pretože na jednom mieste ostalo zabudnuté meno onej premennej (ktorá bola pôvodne typu ukazovateľ) a kompilátor ju považoval za položku vymenovaného typu enum (teda typu integer) definovaného v hlavičkovom súbore. Takéto miešanie jabĺk a hrušiek by v Ade zachytil už kompilátor ..

Je mi trochu ľúto, že jazyku Ada sa nedostáva pozornosti, ktorú si pre svoje vlastnosti zaslúži. Na druhej strane dúfam, že s rastom počtu mission-critical systémov v reálnom živote sa kvalita začne presadzovať a programátorov v Ade bude pribúdať aj v komerčnej sfére. Softvérová technológia reálneho času D2000 je iba jeden z príkladov úspešného použitia tohto jazyka.

 

18.8.2017, Ing. Peter Humaj, www.ipesoft.com

 

Iné blogy