VINE DIN

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

În limbaje de programare , COMEFROM (sau COME FROM ) este o structură de control obscură utilizată în unele limbaje de programare , destinată inițial ca o glumă.

COMEFROM este, în linii mari, opusul GOTO prin faptul că poate dobândi starea de execuție dintr-un punct arbitrar din cod până la o COMEFROM . Punctul din codul din care este transferată focalizarea este de obicei trecut ca parametru COMEFROM . Dacă transferul are loc înainte sau după instrucțiunea indicată la punctul de origine depinde de limba utilizată. COMEFROM întotdeauna de limbă, posibilitatea referințării mai COMEFROM instrucțiuni COMEFROM la aceeași sursă din cod poate fi nevalidă, nedeterministă, să apeleze diferitele puncte ale codului în ordine sau să înceapă procese paralele sau concurente .

Un exemplu simplu de COMEFROM x " COMEFROM x " prevede utilizarea unei etichete , poziționată într-un punct diferit al codului decât COMEFROM relativ, care acționează ca un fel de "capcană". Când executarea codului ajunge la etichetă, execuția se mută la COMEFROM urmează COMEFROM . Efectul principal este de a face depanarea (și comprimarea fluxului de software) extrem de dificilă, deoarece nu există nicio indicație lângă etichetă că execuția ar putea sări misterios către o altă parte a programului.

Istorie

COMEFROM fost văzut inițial într-o listă de glume în diferite instrucțiuni de asamblare (cum ar fi „CMFRM”). A fost analizat într-un articol publicat în Datamation de R. Lawrence Clark în 1973, [1] scris ca răspuns la scrisoarea lui Edsger Dijkstra Go To Statement Considered Harmful . COMEFROM a fost implementat în varianta C-INTERCAL a limbajului de programare ezoteric INTERCAL împreună cu mai misteriosul „ COMEFROM ”.

La 1 aprilie 2004, Richie Hindle a publicat o implementare a declarațiilor GOTO și COMEFROM pentru Python . [2] În ciuda faptului că a fost lansat în Ziua Prostului și nu este destinat utilizării reale, sintaxa este valabilă și implementarea este complet funcțională.

Utilizări practice

În timp ce COMEFROM este o comandă validă din punct de vedere sintactic și semantic și este potențial capabilă să înlocuiască GOTO în unele programe, este mult mai dificil de manevrat la etapa de proiectare și dezvoltare într-un limbaj de programare. Cea mai populară utilizare a constructelor de tip COMEFROM este setarea punctelor de întrerupere la depanare . O implementare a FORTRAN a furnizat COMEFROM , cu numele de " AT ", ca un ajutor pentru depanare, cu avertismente evidente care au sfătuit utilizarea acesteia în codul de producție. În plus, multe procesoare moderne au suport hardware pentru punctele de întrerupere.

Unele elemente ale programării orientate pe aspect au fost comparate cu instrucțiunile COMEFROM . [3]

În compilatoarele care utilizează SSA , un nod phi este practic similar cu o comandă COMEFROM . Listele din care blocuri de bază ar fi putut fi atins blocul de bază curent și valoarea asociată de utilizat pentru a face acest lucru.

Exemple

Codul de mai jos este un exemplu de program într-un ipotetic dialect BASIC care folosește „ COMEFROM ” în loc de „ GOTO ”.

 10 VINE DIN 40
20 INTRARE „Care este numele tău?” ; A $
30 IMPRIMARE "BUNA" ; A $
40 REM

Programul solicită ipotetic numele utilizatorului, apoi îl întâmpină și repetă operația la nesfârșit. Accesând „ REM “ declarație pe linia 40 este pur și simplu un NOP- ca comanda - pentru „ COMEFROMCOMEFROM pe linia 10 executare apeluri de acea linie , atunci când se ajunge la linia de 40, indiferent de conținutul său.

Un exemplu distractiv executabil în Python cu modulul / glumă goto instalat (care folosește depanatorul pentru a controla execuția programului) ar arăta astfel:

 de la Goto import comefrom , etichetă

de la . repeta
name = raw_input ( „care este numele tău?” )
dacă nume :
    tipărește „Bună ziua” , nume
    eticheta . repeta
tipărește "La revedere!"

Aceasta este o implementare Ruby a declarației COME FROM în Interical.

 $ come_from_labels = {}

eticheta def ( l )
    dacă $ come_from_labels [ l ]
        $ come_from_labels [ l ]. apel
    Sfârșit
Sfârșit

def come_de ( l )
    callcc do | bloc |
        $ come_from_labels [ l ] = bloc
    Sfârșit
Sfârșit

Câteva exemple de caracteristici de depanare ale compilatorului Fortran OS / 360: [4]

 Exemplul 1 :

      INTEGER SOLON , GFAR , EWELL
         .
         .
         .
10 SOLON = GFAR * SQRT ( FLOAT ( EWELL ))
11 IF ( SOLON ) 40 , 50 , 60
         .
         .
         .
      UNITATE DE DEBUG ( 3 )
      AT 11
      DISPLAY GFAR, SOLON, EWELL
      SFÂRȘIT

Exemplul 2 :

      STOC DE DIMENSIUNE ( 1000 ), OUT ( 1000 )
         .
         .
         .
      DO 30 I = 1 , 1000
25 STOCK ( I ) = STOCK ( I ) - OUT ( I )
30 CONTINUAȚI
35 A = B + C
         .
         .
         .
      UNITATE DE DEBUG ( 3 )
      AT 35
      AFIȘARE STOC
      SFÂRȘIT

Exemplul 3 :

10 A = 1,5
12 L = 1
15 B = A + 1,5
20 DO 22 I = 1 , 5
         .
         .
         .
22 CONTINUAȚI
25 C = B + 3,16
30 D = C / 2
      STOP
         .
         .
         .
      DEBUG UNIT ( 3 ), TRACE
C DEBUG PACHET NUMĂR 1
      AT 10
      TRACE ON
C DEBUG PACHET NUMĂRUL 2
      AT 20
      TRACE OFF
      DO 35 I = 1 , 3
         .
         .
         .
35 CONTINUAȚI
      TRACE ON
C DEBUG PACHET NUMĂRUL 3
      LA 30
      TRACE OFF
      SFÂRȘIT

În exemplul 1, valorile SOLON, GFAR și EWELL sunt examinate după finalizarea instrucțiunii 10. Instrucțiunea AT revine la linia 11.

În Exemplul 2, toate valorile STOCK sunt afișate când se execută linia 35.

În exemplul 3, TRACE se efectuează de la linia 10 la linia 20. Urmărirea este oprită în timp ce bucla rulează și se reactivează ulterior. Urmărirea este oprită permanent în timpul executării declarației de pe linia 30.

Implementări hardware

DSP Calculatorul SHARC sprijină educația DO..UNTIL , concepute pentru desfășurarea de cicluri de tip Do În COMEFROM timp , dar care sunt , în esență , instrucțiuni COMEFROM . Un exemplu:

 LCNTR = 42;
    DO x PÂNĂ LA LCE; / * COMEFROM x, cu excepția cazului în care contorul buclei este zero * /
    F12 = F0 * F4, F8 = F8 + F12, F0 = dm (I0, M3), F4 = pm (I8, M9);
    IF NZ dm (I2, M2) = F12;
    IF ZF dm (I2, M2) = F1;
x: R2 = R3 + 76; / * eticheta „x” nu există în codul mașinii * /

Rețineți că condiția de terminare a buclei, denumită aici ca LCE (contor de buclă expirat), poate fi setată la alte valori, inclusiv întotdeauna adevărat sau întotdeauna fals. Cu o condiție care este întotdeauna adevărată, o instrucțiune de tip COMEFROM este implementată în practică. Hardware-ul acceptă până la șase COMEFROM active simultan.

Notă

  1. ^ Lawrence Clarke , Datamation (articol), Fortran. Adus la 10 iulie 2012 (arhivat din original la 16 iulie 2018) . .
  2. ^ Richie Hindle, goto pentru Python , Entrian , 1 aprilie 2004 .
  3. ^ C2: ComeFrom
  4. ^ IBM System / 360 și System / 370 Fortran IV Language, GC28-6515-10, mai 1974

Bibliografie

Elemente conexe

linkuri externe