POCHODZIĆ Z - COMEFROM
W programowaniu komputerowym , COMEFROM (lub COME FROM ) jest niejasny przepływ sterowania struktura wykorzystywane w niektórych językach programowania , początkowo jako żart. COMEFROM
jest odwrotnością GOTO
w tym, że może zmienić stan wykonania z dowolnego dowolnego punktu w kodzie na COMEFROM
instrukcję.
Punkt, w którym w postaci kodu przeniesienie stanu stanie się przeważnie jako parametru do COMEFROM
. To, czy przekaz nastąpi przed, czy po wykonaniu instrukcji w określonym punkcie przekazu, zależy od używanego języka. W zależności od używanego języka, wiele COMEFROM
s odwołujących się do tego samego punktu wyjścia może być nieważne, niedeterministyczne, być wykonywane z jakimś zdefiniowanym priorytetem, a nawet wywoływać równoległe lub w inny sposób współbieżne wykonywanie, jak widać w Threaded Intercal .
Prostym przykładem stwierdzenia „ COMEFROM x
” jest etykieta x
(która nie musi być fizycznie umieszczana w pobliżu jej odpowiednika COMEFROM
), która działa jak „zapadnia”. Gdy wykonanie kodu osiągnie etykietę, kontrola zostanie przekazana do instrukcji następującej po COMEFROM
. Może to być również warunkowe, przekazanie kontroli 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 wiersz z instrukcją GOTO, podczas gdy COMEFROM wymaga skanowania całego programu lub zakresu do sprawdzić, czy w zakresie wiersza znajdują się jakiekolwiek instrukcje COMEFROM, a następnie sprawdzić, czy został spełniony warunek. Efektem tego jest przede wszystkim bardzo trudne debugowanie (i zrozumienie przepływu sterowania programu), ponieważ w pobliżu danej linii lub etykiety nie ma wskazania, że sterowanie w tajemniczy sposób przeskoczy do innego punktu programu - należy przestudiować cały program, aby sprawdzić, czy jakiekolwiek instrukcje COMEFROM odnoszą się do tej linii lub etykiety.
Zaczepy debuggera mogą służyć do implementacji instrukcji COMEFROM, tak jak w humorystycznym module goto w Pythonie ; patrz poniżej . Można to również zaimplementować za pomocą funkcji gcc „asm goto” używanej przez opcję konfiguracyjną jądra Linux CONFIG_JUMP_LABEL. Lokalizacja no-op jest przechowywana w pamięci, która ma zostać zastąpiona przez skok do wykonywalnego fragmentu, który na końcu wraca do instrukcji po no-op.
Historia
COMEFROM
początkowo był widoczny na listach instrukcji języka asemblera żartów (jako „CMFRM”). Został on rozwinięty w artykule Datamation autorstwa R. Lawrence'a Clarka w 1973 roku, napisanym w odpowiedzi na list Edsgera Dijkstry Go To Statement uznany za szkodliwy . COMEFROM został ostatecznie zaimplementowany w wariancie C-INTERCAL ezoterycznego języka programowania INTERCAL wraz z jeszcze bardziej niejasnym „obliczonym COMEFROM
”. Pojawiły się również propozycje w języku Fortran dotyczące słowa kluczowego „przypisany COME FROM
” i „ DONT
” (jako uzupełnienie istniejącej DO
pętli).
W dniu 1 kwietnia 2004 r. Richie Hindle opublikował implementację obu 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 COMEFROM 40
20 INPUT "WHAT IS YOUR NAME? "; A$
30 PRINT "HELLO, "; A$
40 REM
Ten program (hipotetycznie) działa, prosząc użytkownika o podanie nazwy, witając go tą samą nazwą i kontynuując od nowa. Instrukcja " REM
" w linii 40 jest po prostu NOP (w tym przypadku komentarzem ) - instrukcja " COMEFROM
" w linii 10 powoduje rozgałęzienie z powrotem 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 goto
zainstalowanym modułem żart (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('What is your name? ')
if name:
print("Hello", name)
label .repeat
print("Goodbye!")
To jest implementacja w Ruby instrukcji Intercal COME FROM.
$come_from_labels = {}
def label(l)
if $come_from_labels[l]
$come_from_labels[l].call
end
end
def come_from(l)
callcc do |block|
$come_from_labels[l] = block
end
end
OS / 360 Fortran G.
Kompilator OS / 360 Fortran G ma funkcję pakietów debugowania. Jego instrukcja „AT” jest podobna do 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ą badane tak, jak były po zakończeniu zdania 10. Instrukcja AT wskazuje twierdzenie 11.
INTEGER SOLON, GFAR, EWELL
.
.
.
10 SOLON = GFAR * SQRT(FLOAT(EWELL))
11 IF (SOLON) 40, 50, 60
.
.
.
DEBUG UNIT(3)
AT 11
DISPLAY GFAR, SOLON, EWELL
END
- Przykład 2: wszystkie wartości STOCK są wyświetlane po napotkaniu instrukcji 35.
DIMENSION STOCK(1000),OUT(1000)
.
.
.
DO 30 I=1, 1000
25 STOCK(I)=STOCK(I) - OUT(I)
30 CONTINUE
35 A = B + C
.
.
.
DEBUG UNIT(3)
AT 35
DISPLAY STOCK
END
- Przykład 3: śledzenie rozpoczyna się od instrukcji 10, w instrukcji 20 śledzenie zatrzymuje się podczas wykonywania pętli i wznawia po jej wykonaniu. Śledzenie zatrzymuje się tuż przed wykonaniem instrukcji 30.
10 A = 1.5
12 L = 1
15 B = A + 1.5
20 DO 22 I = 1,5
.
.
.
22 CONTINUE
25 C = B + 3.16
30 D = C/2
STOP
.
.
.
DEBUG UNIT(3), TRACE
C DEBUG PACKET NUMBER 1
AT 10
TRACE ON
C DEBUG PACKET NUMBER 2
AT 20
TRACE OFF
DO 35 I = 1,3
.
.
.
35 CONTINUE
TRACE ON
C DEBUG PACKET NUMBER 3
AT 30
TRACE OFF
END
Zobacz też
-
FX Reid , ekspert w dziedzinie semantyki
COMEFROM
- Akcja na odległość
- Intercal
Poważne wynalazki programistyczne obejmujące pomysły przypominające COMEFROM:
- Pointcut w programowaniu aspektowym
- Kontynuacja
- Wyzwalacze bazy danych
- Wzorzec obserwatora
- Idź do / z bloków trasowania sygnału w MATLAB Simulink