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ż

Poważne wynalazki programistyczne obejmujące pomysły przypominające COMEFROM:

Bibliografia

Linki zewnętrzne