Strukturální programování je programovací paradigma založené na reprezentaci programu ve formě hierarchické blokové struktury . Konceptualizován byl koncem 60. a začátkem 70. let na základě Boehm-Jacopiniho teorému , který matematicky dokládá možnost strukturální organizace programů, a práce Edsgera Dijkstra „O nebezpečích operátora goto“ ( angl. Goto považováno za škodlivé ).
V souladu s paradigmatem se každý program, který je sestaven bez použití příkazu goto, skládá ze tří základních řídicích struktur: sekvence, větev , smyčka ; navíc se používají podprogramy . Současně se vývoj programu provádí krok za krokem metodou „shora dolů“.
Metodika strukturovaného programování se objevila v důsledku zvyšující se složitosti úloh řešených na počítačích, a tedy i složitosti softwaru. V 70. letech dosáhl objem a komplexnost programů takové úrovně, že tradiční (nestrukturovaný) vývoj programů již nevyhovuje potřebám praxe. Programy se staly příliš složitými na to, aby je bylo možné řádně udržovat. Proto byla nutná systematizace procesu vývoje a struktury programů.
Metodika strukturálního vývoje softwaru byla uznána jako „nejsilnější formalizace 70. let“.
Podle Bertranda Meyera „Revoluce programování zahájená Dijkstrou vedla k hnutí známému jako strukturované programování, které navrhlo systematický, racionální přístup k navrhování programů. Strukturované programování se stalo základem všeho, co se dělá v metodologii programování, včetně objektového programování “ [1] .
Zpočátku se myšlenka strukturovaného programování zrodila v souvislosti s operátorem goto a pochybnostmi o vhodnosti jeho použití. Takové pochybnosti poprvé vyjádřil Heinz Zemanek na setkání o algolštině počátkem roku 1959 v Kodani. Tento projev však nevzbudil pozornost a neměl žádné následky. Edsger Dijkstra vzpomíná: „Do jisté míry si vyčítám, že jsem tehdy nedokázal ocenit význam této myšlenky“ [2] [3] [4] .
Situace se dramaticky změnila o deset let později, když Dijkstra v březnu 1968 zveřejnil svůj slavný dopis Go To Statement Považovaný za škodlivý . Jedná se o skutečně historický dokument, který výrazně ovlivnil další vývoj programování.
Osud samotného dokumentu je velmi zajímavý. Faktem je, že Dijkstra dal článku úplně jiný název: „Argumenty proti prohlášení GO TO“ (Případ proti prohlášení GO TO).
V době zveřejnění se však stalo něco nepochopitelného – článek se z nějakého důvodu záhadně proměnil v „Dopis redaktorovi“ a bývalý titul stejně záhadně zmizel. co se vlastně stalo? Dijkstra záhadnou přeměnu článku na dopis vysvětlil až o mnoho let později, v roce 2001, rok před svou smrtí.
Komunikace ACM zveřejnila můj text s názvem "Prohlášení GOTO je považováno za škodlivé. " V pozdějších letech byl často citován. Bohužel to často dělali lidé, kteří v tom neviděli nic víc, než říká nadpis. Tento titul se stal základním kamenem mé slávy...
Jak se to všechno stalo? Odeslal jsem článek s názvem „Případ proti prohlášení GO TO“. Pro urychlení publikování editor přeměnil můj článek na Dopis redaktorovi. Zároveň vymyslel nový název článku, který sám vymyslel. Editorem byl Niklaus Wirth [5] [6] .
Účelem strukturovaného programování je zvýšit produktivitu programátorů, a to i při vývoji velkých a složitých softwarových systémů, snížit počet chyb, zjednodušit ladění, úpravy a údržbu softwaru.
Tento cíl byl stanoven v souvislosti se zvyšující se složitostí programů a neschopností vývojářů a manažerů velkých softwarových projektů vyrovnat se s problémy, které vznikly v letech 1960-1970 v souvislosti s vývojem softwarových nástrojů [7] .
Strukturované programování je navrženo zejména k odstranění nepořádku a chyb v programech způsobených obtížemi při čtení kódu, nesystematizovaným, nepohodlným pro vnímání a analýzu zdrojového kódu programu. Takový text je často charakterizován jako „ kód špaget “.
Špagetový kód je špatně navržený, špatně strukturovaný, matoucí a těžko pochopitelný program , který obsahuje spoustu příkazů goto (zejména zpětných skoků), výjimek a dalších konstrukcí, které degradují strukturu [8] . Jeden z nejznámějších programovacích anti -vzorů .
Kód špaget je tak pojmenován, protože tok programu je jako mísa špaget , tedy klikatý a spletitý. Někdy se nazývá „klokaní kód“ kvůli mnoha instrukcím pro skok .
V dnešní době se tento termín používá nejen pro případy zneužití goto, ale také pro jakýkoli "multi-linked" kód, ve kterém je stejný malý fragment vykonáván ve velkém množství různých situací a plní mnoho různých logických funkcí [8] .
Kód špaget lze odladit a spustit správně a s vysokým výkonem, ale je extrémně obtížné jej udržovat a vyvíjet [8] . Zdokonalení kódu špaget pro přidání nových funkcí někdy s sebou nese významný potenciál pro zavádění nových chyb. Z tohoto důvodu je téměř nevyhnutelné, že refaktorizace je hlavním lékem na špagety.
Počínaje 70. lety byl operátor bezpodmínečného skoku goto středem systematické a rostoucí kritiky. Nesprávné a bezmyšlenkovité použití příkazu goto ve zdrojovém kódu programu vede k matoucímu, nečitelnému „ kódu špaget “. Z textu takového kódu je téměř nemožné pochopit pořadí provádění a vzájemnou závislost fragmentů.
Tento úhel pohledu se poprvé odrazil v článku Edsgera Dijkstra „ Operátor Go To je považován za škodlivý“ [3] [9] . Dijkstra si všiml, že kvalita kódu je nepřímo úměrná počtu příkazů goto v něm. Článek získal širokou publicitu, v důsledku čehož byly výrazně přepracovány názory na použití operátoru goto. V Notes on Structured Programming [10] Dijkstra tvrdil, že je mnohem snazší zkontrolovat formální správnost kódu bez goto .
Kód s goto je obtížné formátovat, protože může narušit hierarchii provádění (paradigma strukturovaného programování), a proto nemusí být odsazení, navržené tak, aby odráželo strukturu programu, vždy správně nastaveno. Příkaz goto navíc brání kompilátorům v optimalizaci řídicích struktur [11] .
Některá použití goto mohou způsobit problémy s logikou provádění programu:
Argumenty proti prohlášení goto se ukázaly být natolik závažné, že ve strukturovaném programování začaly být považovány za vysoce nežádoucí. To se odrazilo v návrhu nových programovacích jazyků. Například goto je nelegální v Javě a Ruby . V řadě moderních jazyků je stále ponechán z důvodů účinnosti v těch vzácných případech, kdy je použití goto oprávněné. Například goto přežilo v Ada , jednom z architektonicky nejsofistikovanějších jazyků v historii [12] .
V jazycích na vysoké úrovni, kde byl tento operátor zachován, však jeho použití zpravidla podléhá přísným omezením, která brání použití nejnebezpečnějších způsobů jeho použití: například je zakázáno předávat kontrolu z vnějšku smyčka, procedura nebo funkce uvnitř. Jazykový standard C++ zakazuje obejít inicializaci proměnné pomocí goto.
Větu formulovali a dokázali italští matematici Corrado Böhm a Giuseppe Jacopini. Vydali ji v roce 1965 v italštině a v roce 1966 v angličtině [13] . Spolu s teorémem článek Boehma a Jacopiniho popsal metody pro převod nestrukturálních algoritmů na strukturální algoritmy pomocí programovacího jazyka P′′ vytvořeného Bohmem jako příklad . Jazyk P′′ je prvním Turingovým úplným programovacím jazykem bez operátoru goto .
Böhm-Jacopiniho věta je napsána složitým jazykem a v neobvyklé notaci. Pokud použijeme moderní terminologii a notaci, bude mít podobu:
Jakýkoli program ve formě vývojového diagramu lze reprezentovat pomocí tří řídicích struktur:
kde f, g jsou bloková schémata s jedním vstupem a jedním výstupem,
p - podmínka, THEN, IF, ELSE, WHILE, DO jsou klíčová slova [14] .Vysvětlení. Vzorec f THEN g znamená následující: nejprve se provede program f, potom se provede program g.
Jak poznamenává Harlan Mills , tento teorém ostře kontrastuje s obvyklou ( v 60.–70. letech) programátorskou praxí, kdy se masivně používaly operátory goto skoku [14] .
Boehm a Jacopini nepoužili termín „strukturované programování“. Nicméně jimi dokázaná věta (a její následné variace různými autory) se následně začala nazývat „teorém strukturního programování“, „strukturální teorém“ [14] , „strukturovací teorém“ [15] .
Vznik a rozvoj strukturovaného programování je spojen se jménem Edsger Dijkstra [10] [16] .
Princip 1. Měli byste přestat používat operátor nepodmíněného skoku goto.
Princip 2. Každý program se skládá ze tří základních řídicích struktur: sekvence, větvení, cyklus.
Princip 3. V programu mohou být základní řídicí struktury vnořeny do sebe libovolným způsobem. Nejsou k dispozici žádné jiné prostředky pro řízení sledu operací.
Princip 4. Opakující se části programu mohou být uspořádány ve formě podprogramů (procedur a funkcí ). Stejným způsobem (ve formě podprogramů) lze uspořádat logicky celistvé fragmenty programu, i když se neopakují.
Zásada 5. Každá logicky úplná skupina instrukcí by měla být uspořádána jako blok . Bloky jsou základem strukturovaného programování.
Blok je logicky seskupená část zdrojového kódu, jako je sada instrukcí zapsaných v řadě ve zdrojovém kódu programu. Koncept bloku znamená, že s blokem instrukcí by se mělo zacházet jako s jedinou instrukcí. Bloky slouží k omezení rozsahu proměnných a funkcí. Bloky mohou být prázdné nebo vnořené do sebe. Hranice bloku jsou přesně definovány. Například v příkazu if je blok ohraničen kódem BEGIN..END(v Pascalu) nebo složenými závorkami {...} (v C) nebo odsazením (v Pythonu).Princip 6. Všechny uvedené struktury musí mít jeden vstup a jeden výstup.
Libovolné řídicí struktury (jako například v misce na špagety) mohou mít libovolný počet vstupů a výstupů. Tím, že se omezíme na řídicí struktury s jedním vstupem a jedním výstupem, získáme schopnost vytvářet libovolné algoritmy libovolné složitosti pomocí jednoduchých a spolehlivých mechanismů [17] .Zásada 7. Vývoj programu se provádí krok za krokem metodou „shora dolů“ (metoda shora dolů) [18] .
Nejprve se zapíše text hlavního programu, do kterého se místo každého připojeného logického fragmentu textu vloží volání podprogramu, který tento fragment provede. Místo skutečných fungujících podprogramů jsou do programu vkládány fiktivní části - pahýly , které zjednodušeně řečeno nic nedělají.
Přesněji řečeno, stub splňuje požadavky rozhraní nahrazovaného fragmentu (modulu), ale neplní své funkce nebo je plní částečně. Pahýly jsou pak nahrazeny nebo upgradovány na skutečné plnohodnotné fragmenty (moduly) podle programového plánu. V každé fázi implementačního procesu musí již vytvořený program správně fungovat ve vztahu k nižší úrovni. Výsledný program je zkontrolován a odladěn [19] .
Poté, co se programátor přesvědčí, že podprogramy jsou volány ve správném pořadí (to znamená, že obecná struktura programu je správná), jsou stub rutiny postupně nahrazeny skutečnými a vývoj každého podprogramu se provádí ve stejném pořadí. způsobem jako hlavní program. Vývoj končí, když nezůstanou žádné pahýly.
Taková sekvence zajišťuje, že v každé fázi vývoje se programátor současně zabývá viditelnou a srozumitelnou sadou fragmentů a může si být jistý, že obecná struktura všech vyšších úrovní programu je správná.
Při údržbě a provádění změn programu se ukazuje, které postupy je potřeba změnit. Jsou zavedeny, aniž by ovlivnily části programu, které s nimi přímo nesouvisí. Tím je zajištěno, že při provádění změn a opravách chyb nedojde k selhání některé části programu, která je aktuálně mimo oblast pozornosti programátora [18] [20] [21] [22] [23] [24 ] .
Je třeba také poznamenat, že v "Předmluvě" ke knize "Structured Programming" [25] Tony Hoare poznamenává, že principy strukturovaného programování lze stejně aplikovat na vývoj programů jak "shora dolů", tak "zdola nahoru" [26] .
Podprogramy nebyly nezbytnou podmínkou pro možnost implementace strukturovaného programování [27] . Zpočátku se podprogramy objevovaly jako prostředek k optimalizaci programů z hlediska množství zabrané paměti – umožňovaly neopakovat stejné bloky kódu v programu, ale jednou je popsat a volat podle potřeby. Zatím[ kdy? ] se tato funkce podprogramů stala pomocnou, jejich hlavním účelem je strukturování programu za účelem jeho snadnějšího pochopení a údržby.
Oddělení sady akcí do podprogramu a jeho volání podle potřeby umožňuje logicky vybrat integrální dílčí úkol, který má typické řešení. Taková akce má oproti opakování stejného typu akcí ještě jednu (kromě úspory paměti) výhodu. Jakákoli změna (oprava chyb, optimalizace, rozšíření funkčnosti) provedená v podprogramu se automaticky projeví ve všech jeho voláních, zatímco při duplikaci musí být každá změna provedena při každém výskytu měněného kódu.
I v případech, kdy je podprogramu přidělena jednorázová sada akcí, je to oprávněné, protože to umožňuje snížit velikost integrálních bloků kódu, které tvoří program, to znamená, aby byl program srozumitelnější. a viditelné.
Dodržováním principů strukturovaného programování byly texty programů, a to i poměrně rozsáhlé, běžně čitelné. Pochopení programů se výrazně zjednodušilo, umožnilo se vyvíjet programy v běžném průmyslovém režimu, kdy programu bez větších potíží rozumí nejen jeho autor, ale i ostatní programátoři. To umožnilo silami vývojových týmů vyvíjet na tehdejší dobu poměrně velké softwarové systémy a udržovat tyto komplexy po mnoho let i při nevyhnutelných změnách ve složení personálu.
Strukturované programování výrazně zlepšuje přehlednost a čitelnost programů [28] . Edward Jordan vysvětluje:
Chování mnoha nestrukturálních programů je často bližší Brownovu pohybu než jakémukoli organizovanému procesu. Jakýkoli pokus o přečtení výpisu přivádí člověka k zoufalství, protože takový program obvykle provede několik příkazů, po kterých se řízení přenese o několik stránek níže. Provede se tam několik dalších příkazů a řízení se opět přenese do nějakého náhodného bodu. Zde jsou provedeny další operátory atd. Po několika takových přenosech čtenář zapomene, jak to všechno začalo. A ztrácí svůj myšlenkový pochod.
Strukturální programy na druhé straně bývají organizovány a prováděny postupně [29] .
Zlepšení čitelnosti strukturovaných programů je způsobeno tím, že absence příkazu goto umožňuje čtení programu shora dolů bez přerušení způsobených řídicími přenosy. Díky tomu můžete okamžitě (na první pohled) zjistit podmínky nutné pro úpravu té či oné části programu [30] .
P-technologie pro výrobu programů neboli „technologie dvourozměrného programování“ [31] vznikla v Ústavu kybernetiky V. M. Glushkova [32] . Grafický systém technologie R-programování je zakotven v normách GOST 19.005-85 [33] , GOST R ISO/IEC 8631-94 [34] a mezinárodní normě ISO 8631Н.
Autor technologie R-programování, doktor fyzikálních a matematických věd, profesor Igor Velbitsky, navrhl přehodnotit samotný koncept „programové struktury“. Podle něj „struktura je multidimenzionální koncept. Proto zobrazení tohoto konceptu pomocí lineárních textů (sekvencí operátorů) téměř na nic redukuje výhody strukturálního přístupu. Obrovské asociativní možnosti zrakového aparátu a aparátu lidského myšlení jsou prakticky marně využívány – k rozpoznávání strukturálních obrazů v podobě jednotné sekvence symbolů“ [35] .
Metodika dvourozměrného strukturovaného programování se výrazně liší od klasického jednorozměrného (textového) strukturovaného programování [36] [37] .
Myšlenky strukturovaného programování byly vyvinuty, když počítačová grafika ve skutečnosti ještě neexistovala a hlavním nástrojem pro algoritmisty a programátory byl jednorozměrný (lineární nebo stupňovitý ) text. Před nástupem počítačové grafiky byla nejlepším řešením metodika klasického strukturovaného programování [10] .
S příchodem počítačové grafiky se situace změnila. Pomocí výrazových prostředků grafiky bylo možné upravovat, rozvíjet a doplňovat tři typy základních (textových) řídících strukturních struktur a také zcela opustit klíčová slova if , then, else, case , switch, break, while , do, opakujte, dokud, pro , foreach, continue, loop, exit, when, last atd. a nahraďte je řídicí grafikou, tedy použijte dvourozměrné strukturované programování [33] [36] .
![]() |
|
---|