POCHODZIĆ Z
W programowaniu komputerowym COMEFROM (lub COME FROM ) to niejasna struktura przepływu sterowania używana w niektórych językach programowania , pierwotnie jako żart. COMEFROM
jest odwrotnością GOTO
w tym sensie, że może przenieść stan wykonania z dowolnego punktu w kodzie do instrukcji COMEFROM
.
Punkt w kodzie, w którym odbywa się transfer stanu, jest zwykle podawany jako parametr do COMEFROM
. To, czy transfer nastąpi przed czy po instrukcji w określonym punkcie transferu, zależy od używanego języka. W zależności od używanego języka, wiele COMEFROM
odwołujących się do tego samego punktu wyjścia może być nieważne, być niedeterministyczne, być wykonywane z jakimś określonym priorytetem, a nawet indukować równoległe lub w inny sposób współbieżne wykonanie, jak widać w Threaded Intercal . [ potrzebne źródło ]
Prostym przykładem instrukcji „ COMEFROM x
” jest etykieta x
(która nie musi być fizycznie umieszczona w pobliżu odpowiadającej jej instrukcji COMEFROM
), która działa jak „pułapka”. Gdy wykonanie kodu dotrze do etykiety, kontrola zostaje przekazana do instrukcji następującej po COMEFROM
. Może to być również warunkowe przekazanie sterowania tylko wtedy, gdy warunek jest spełniony, analogicznie do GOTO w instrukcji IF. Podstawowa różnica w stosunku do GOTO polega na tym, że GOTO zależy tylko od lokalnej struktury kodu, podczas gdy COMEFROM zależy od struktury globalnej — GOTO przekazuje kontrolę, gdy osiągnie linię z instrukcją GOTO, podczas gdy COMEFROM wymaga przeskanowania całego programu lub zakresu do sprawdź, czy jakiekolwiek instrukcje COMEFROM są w zasięgu linii, a następnie sprawdź, czy spełniony jest warunek. Efektem tego jest przede wszystkim to, że debugowanie (i zrozumienie przebiegu sterowania programem) jest niezwykle trudne, ponieważ w pobliżu linii lub etykiety, o której mowa, nie ma żadnych wskazówek, że sterowanie w tajemniczy sposób przeskoczy do innego punktu programu – należy przestudiować cały program, aby sprawdzić, czy jakiekolwiek instrukcje COMEFROM odwołują się do tej linii lub etykiety.
Haki debugera mogą być użyte do zaimplementowania instrukcji COMEFROM, tak jak w humorystycznym module goto Pythona; patrz poniżej . Można to również zaimplementować za pomocą funkcji gcc „asm goto”, używanej przez jądra Linuksa CONFIG_JUMP_LABEL. No-op ma zapisaną lokalizację, którą można zastąpić skokiem do wykonywalnego fragmentu, który na końcu powraca do instrukcji po no-op.
Historia
COMEFROM
był początkowo widziany na listach żartobliwych instrukcji asemblera (jako „CMFRM”). Został on rozwinięty w Datamation autorstwa R. Lawrence'a Clarka z 1973 roku, napisanym w odpowiedzi na list Edsgera Dijkstry Go To Statement Considered szkodliwe . COMEFROM został ostatecznie zaimplementowany w wariancie C-INTERCAL ezoterycznego języka programowania INTERCAL wraz z jeszcze bardziej niejasnym „computed COMEFROM
”. Pojawiły się również Fortrana dla „przypisane COME FROM
” i słowa kluczowego „ DONT
” (aby uzupełnić istniejącą pętlę „ DO
”).
1 kwietnia 2004 r. Richie Hindle opublikował implementację GOTO
i COMEFROM
dla języka programowania Python . Pomimo tego, że został wydany w prima aprilis i nie jest przeznaczony do poważnego użytku, składnia jest poprawna, a implementacja w pełni działa.
Praktyczne zastosowania
Przykłady
Poniżej znajduje się przykład programu w hipotetycznym dialekcie języka BASIC z „ COMEFROM
” zamiast „ GOTO
”.
10 POCHODZ Z 40 20 WPISZ „JAK JEST TWOJE IMIĘ?” ; A$ 30 DRUKUJ „WITAJ”, ; 40 REM AUD
Ten program (hipotetycznie) działa, pytając użytkownika o jego imię, witając go tym samym imieniem i kontynuując od nowa. Instrukcja „ REM
” w linii 40 to po prostu NOP (w tym przypadku REMark lub komentarz ) — instrukcja „ COMEFROM
” w linii 10 powoduje powrót do tej linii, gdy wykonanie osiągnie linię 40, niezależnie od jej zawartości.
W pełni działający przykład w Pythonie z zainstalowanym modułem joke goto
(który używa haków debuggera do kontrolowania wykonywania programu) wygląda następująco:
from goto import comefrom , label comefrom . repeat name = raw_input ( 'Jak masz na imię?' ) if name : print ( "Cześć" , imię ) label . powtórz drukowanie ( "Do widzenia!" )
Jest to implementacja w języku Ruby instrukcji Intercal COME FROM.
$pochodzenie_z_etykiet = {} def label ( l ) if $pochodzenie_z_etykiet [ l ] $pochodzenie_z_etykiet [ l ]. call end end def come_from ( l ) callcc do | blok | $come_from_labels [ l ] = koniec bloku koniec
OS/360 Fortran G
Kompilator OS/360 Fortran G ma funkcję debugowania pakietów. Jego instrukcja „AT” jest podobna do instrukcji COMEFROM, ponieważ przekazuje przepływ sterowania do bloku debugowania. Ogólnie punkty przerwania są podobne.
- Przykład 1: wartości SOLON, GFAR i EWELL są sprawdzane tak, jak były przy zakończeniu instrukcji 10. Instrukcja AT wskazuje na instrukcję 11.
INTEGER SOLON , GFAR , EWELL . . . 10 SOLON = GFAR * SQRT ( FLOAT ( EWELL )) 11 JEŻELI ( SOLON ) 40 , 50 , 60 . . . JEDNOSTKA DEBUGOWANIA ( 3 ) NA WYŚWIETLACZU 11 GFAR , SOLON , EWELL END
- Przykład 2: wszystkie wartości STOCK są wyświetlane po napotkaniu instrukcji 35.
WYMIAR MAGAZYNU ( 1000 ), OUT ( 1000 ) . . . ZROBIĆ 30 I = 1 , 1000 25 MAGAZYN ( I ) = MAGAZYN ( I ) - OUT ( I ) 30 KONTYNUUJ 35 A = B + C. _ . . JEDNOSTKA DEBUGOWANIA ( 3 ) NA 35 KOŃCU WYŚWIETLACZA _
- Przykład 3: śledzenie rozpoczyna się w instrukcji 10, w instrukcji 20 śledzenie zatrzymuje się podczas wykonywania pętli i wznawia po jej zakończeniu. Śledzenie zatrzymuje się tuż przed wykonaniem instrukcji 30.
10 ZA = 1,5 12 L = 1 15 b = ZA + 1,5 20 DO 22 Ja = 1 , 5 . . . 22 KONTYNUUJ 25 C = B + 3,16 30 D = C / 2 STOP . . . DEBUG UNIT ( 3 ), TRACE C DEBUG PAKIET NUMER 1 O 10 TRACE ON C DEBUG PAKIET NUMER 2 O 20 TRACE OFF DO 35 I = 1 , 3 . . . 35 KONTYNUUJ ŚLEDZENIE NA PAKIECIE DEBUGOWANIA NUMER 3 W 30 KONIEC ŚLEDZENIA
Zobacz też
-
FX Reid , ekspert od semantyki
COMEFROM
- Akcja na odległość
- Interkal
Poważne wynalazki programistyczne obejmujące pomysły przypominające COMEFROM:
- Pointcut w programowaniu aspektowym
- Kontynuacja
- Wyzwalacze bazy danych
- Wzór obserwatora
- Bloki trasowania sygnału Goto/From w MATLAB Simulink
Linki zewnętrzne
- Strona informacyjna COMFROM
- Artykuł dotyczący danych
- Lista instrukcji asemblera żartów, w tym CMFRM
- pochodzą ze wsparcia dla Perla