ODCHOD - COMEFROM
v programování, ODCHOD (nebo POCHÁZET Z) je nejasný regulační tok struktura použitá v některých programovací jazyky, původně jako vtip. ODCHOD
je inverzní k JÍT DO
v tom, že může trvat stav provádění z libovolného bodu v kódu na a ODCHOD
prohlášení.
Bod v kódu, kde dochází k přenosu stavu, je obvykle uveden jako a parametr na ODCHOD
. Zda k přenosu dojde před instrukcí nebo po ní ve stanoveném místě přenosu, závisí na použitém jazyce. V závislosti na použitém jazyce několikanásobné ODCHOD
s odkazování na stejný výchozí bod může být neplatné, může být nedeterministické, může být provedeno v nějaké definované prioritě nebo dokonce může vyvolat paralelní nebo jinak souběžně poprava, jak je vidět v Závitový Intercal.[Citace je zapotřebí ]
Jednoduchý příklad „ODCHOD x
"prohlášení je a označení X
(který nemusí být fyzicky umístěn nikde poblíž jeho odpovídajícího ODCHOD
), který funguje jako „padací dveře“. Když spuštění kódu dosáhne štítku, ovládací prvek se předá příkazu následujícímu za ODCHOD
. To může být také podmíněné, předávání řízení pouze v případě, že je splněna podmínka, analogické s GOTO v rámci příkazu IF. Primární rozdíl od GOTO spočívá v tom, že GOTO závisí pouze na místní struktuře kódu, zatímco COMEFROM závisí na globální struktuře - GOTO přenáší ovládací prvek, když dosáhne řádku s příkazem GOTO, zatímco COMEFROM vyžaduje skenování celého programu nebo rozsahu do zkontrolujte, zda jsou v řádku nějaké příkazy COMEFROM, a pak ověřte, zda je splněna podmínka. Účinkem toho je především to, aby bylo ladění (a pochopení toku řízení programu) extrémně obtížné, protože v blízkosti dotyčného řádku nebo štítku není žádný náznak, že ovládání záhadně přeskočí na jiný bod programu - člověk musí studovat celý program, aby zjistil, zda nějaké příkazy COMEFROM odkazují na tento řádek nebo štítek.
Háčky debuggeru lze použít k implementaci příkazu COMEFROM, jako ve vtipném Pythonu jít do modul;[1] vidět níže. To lze také implementovat pomocí funkce gcc "asm goto", kterou používá Linuxové jádro možnost konfigurace CONFIG_JUMP_LABEL. No-op má své umístění uložené a má být nahrazeno skokem na spustitelný fragment, který se na konci vrátí do instrukce po no-op.
Dějiny
ODCHOD
byl původně viděn v seznamech vtipů montážní jazyk pokyny (jako „CMFRM“). Bylo to rozpracováno v Datamace článek od R. Lawrence Clark v roce 1973,[2] napsáno v reakci na Edsger Dijkstra dopis Přejít na prohlášení považováno za škodlivé. COMEFROM byl nakonec implementován ve variantě C-INTERCAL esoterický programovací jazyk INTERCAL spolu s ještě nejasnějšími vypočítanými ODCHOD
'. Byly tam také Fortran návrhy[3] pro 'přiřazeno POCHÁZET Z
„a“DONT
„klíčové slovo (k doplnění stávajícího“DĚLAT
'smyčka).
1. dubna 2004 Richie Hindle zveřejnil implementaci obou JÍT DO
a ODCHOD
pro Programovací jazyk Python.[1] Přesto, že byl propuštěn na apríl a není určen pro seriózní použití, syntaxe je platná a implementace plně funguje.
Praktické využití
Příklady
Následuje příklad programu v hypotetické podobě ZÁKLADNÍ dialekt s „ODCHOD
" namísto "JÍT DO
".
10ODCHOD4020VSTUP"JAK SE JMENUJEŠ? ";A $30TISK"AHOJ, ";A $40REM
Tento program (hypoteticky) funguje tak, že se uživatele zeptá na jeho jméno, pozdraví ho se stejným jménem a pokračuje znovu. Pokyn „REM
"on line 40 je prostě a NOP (v tomto případě a komentář ) - „ODCHOD
"příkaz na řádku 10 způsobí větev zpět na tento řádek, když spuštění dosáhne řádku 40, bez ohledu na jeho obsah.
Plně spustitelný příklad v Pythonu s vtipem jít do
nainstalovaný modul (který používá háčky debuggeru k řízení provádění programu) vypadá takto:
z jít do import pocházet, označenípocházet .opakovatnázev = Hrubý vstup('Jak se jmenuješ? '')-li název: tisk("Ahoj", název) označení .opakovattisk("Ahoj!")
Toto je implementace v Rubín příkazu Intercal COME FROM.
$ come_from_labels = {}def označení(l) -li $ come_from_labels[l] $ come_from_labels[l].volání koneckonecdef přijít_od(l) callcc dělat |blok| $ come_from_labels[l] = blok koneckonec
OS / 360 Fortran G
Kompilátor OS / 360 Fortran G má funkci ladicího paketu. Jeho příkaz „AT“ je podobný příkazu COMEFROM v tom, že předává tok řízení přes ladicí blok. Hraniční body obecně jsou podobné.[4]
- Příklad 1: hodnoty SOLON, GFAR a EWELL jsou zkoumány tak, jak byly při dokončení příkazu 10. Příkaz AT označuje příkaz 11.
CELÉ ČÍSLO SOLON, GFAR, EWELL . . .10 SOLON = GFAR * SQRT(PLOVÁK(EWELL))11 LI (SOLON) 40, 50, 60 . . . LADIT JEDNOTKA(3) NA 11 ZOBRAZIT GFAR, SOLON, EWELL KONEC
- Příklad 2: všechny hodnoty STOCK se zobrazí, když dojde k příkazu 35.
DIMENZE SKLADEM(1000),VEN(1000) . . . DĚLAT 30 Já=1, 100025 SKLADEM(Já)=SKLADEM(Já) - VEN(Já)30 POKRAČOVAT35 A = B + C . . . LADIT JEDNOTKA(3) NA 35 ZOBRAZIT SKLADEM KONEC
- Příklad 3: trasování začíná na příkazu 10, na příkazu 20, trasování se zastaví, když je smyčka spuštěna, a pokračuje po smyčce. Trasování se zastaví těsně před provedením příkazu 30.
10 A = 1.512 L = 115 B = A + 1.520 DĚLAT 22 Já = 1,5 . . .22 POKRAČOVAT25 C = B + 3.1630 D = C/2 STOP . . . LADIT JEDNOTKA(3), STOPAC DEBUG PACKET ČÍSLO 1 NA 10 STOPA NAC ČÍSLO ODLOŽENÍ BALÍKU 2 NA 20 STOPA VYPNUTO DĚLAT 35 Já = 1,3 . . .35 POKRAČOVAT STOPA NAC ČÍSLO ODBALENÍ BALÍČKU 3 NA 30 STOPA VYPNUTO KONEC
Viz také
- F. X. Reid, odborník na sémantiku jazyka
ODCHOD
[5] - Akce na dálku
- Intercal
Vážné programovací výhody zahrnující myšlenky připomínající KOMEFROM:
- Pointcut v aspektově orientované programování
- Pokračování
- Spouštěče databáze
- Goto / From signal routing blocks in MATLAB Simulink
Reference
- ^ A b Hindle, Richie (1. dubna 2004), jděte na Python, Entrian.
- ^ Clarke, Lawrence, „Nevíme, kam jít, pokud nevíme, odkud jsme přišli. Tato jazyková inovace splňuje všechna očekávání.“, Datamace (článek), archivovány z originál dne 16. července 2018, vyvoláno 2004-09-24.
- ^ Modell, Howard; Slater, William (duben 1978). „Strukturované programování považováno za škodlivé“. Oznámení ACM SIGPLAN. 13 (4): 76–79. doi:10.1145/953411.953418. Citováno 18. července 2014.
- ^ IBM System / 360 and System / 370 Fortran IV Language, GC28-6515-10, květen 1974
- ^ F. X. Reid, O formální sémantice prohlášení COMEFROM. FAKTA FAKTA, Vydání 2006-1, strany 18–20, březen 2006.