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ż

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

Linki zewnętrzne