2

COMEFROM

 4 years ago
source link: https://www.tuicool.com/articles/QrQvMfz
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Incomputer programming, COMEFROM (or COME FROM ) is an obscurecontrol flow structure used in some programming languages , originally as a joke. COMEFROM is roughly the opposite of GOTO in that it can take the execution state from any arbitrary point in code to a COMEFROM statement.

The point in code where the state transfer happens is usually given as aparameter to COMEFROM . Whether the transfer happens before or after the instruction at the specified transfer point depends on the language used. Depending on the language used, multiple COMEFROM s referencing the same departure point may be invalid, be non-deterministic, be executed in some sort of defined priority, or even induceparallel or otherwiseconcurrent execution as seen inThreaded Intercal.

[ citation needed ]

A simple example of a " COMEFROM x " statement is alabel x (which does not need to be physically located anywhere near its corresponding COMEFROM ) that acts as a "trap door". When code execution reaches the label, control gets passed to the statement following the COMEFROM . This may also be conditional, passing control only if a condition is satisfied, analogous to a GOTO within an IF statement. The primary difference from GOTO is that GOTO only depends on the local structure of the code, while COMEFROM depends on the global structure – a GOTO transfers control when it reaches a line with a GOTO statement, while COMEFROM requires scanning the entire program or scope to see if any COMEFROM statements are in scope for the line, and then verifying if a condition is hit. The effect of this is primarily to make debugging (and understanding the control flow of the program) extremely difficult, since there is no indication near the line or label in question that control will mysteriously jump to another point of the program – one must study the entire program to see if any COMEFROM statements reference that line or label.

Debugger hooks can be used to implement a COMEFROM statement, as in the humorous Python goto module;seebelow. This also can be implemented with the gcc feature "asm goto" as used by theLinux kernel configuration option CONFIG_JUMP_LABEL. A no-op has its location stored, to be replaced by a jump to an executable fragment that at its end returns to the instruction after the no-op.

Contents

History [ edit ]

COMEFROM was initially seen in lists of jokeassembly language instructions (as 'CMFRM'). It was elaborated upon in aDatamation article byR. Lawrence Clark in 1973,written in response toEdsger Dijkstra's letter Go To Statement Considered Harmful . COMEFROM was eventually implemented in the C-INTERCAL variant of the esoteric programming language INTERCAL along with the even more obscure 'computed COMEFROM '. There were alsoFortran proposalsfor 'assigned COME FROM ' and a ' DONT ' keyword (to complement the existing ' DO ' loop).

On 1 April 2004,Richie Hindle published an implementation of both GOTO and COMEFROM for the Python programming language .Despite being released onApril Fools' Day and not being intended for serious use, the syntax is valid and the implementation fully works.

Practical uses [ edit ]

Examples [ edit ]

The following is an example of a program in a hypotheticalBASIC dialect with " COMEFROM " instead of " GOTO ".

10 COMEFROM 40
20 INPUT "WHAT IS YOUR NAME? "; A$
30 PRINT "HELLO, "; A$
40 REM

This program (hypothetically) works by asking the user for their name, greeting them with the same name, and continuing all over again. The instruction " REM " on line 40 is simply aNOP (in this case, acomment) — the " COMEFROM " statement on line 10 causes a branch back to that line when execution reaches line 40, regardless of its contents.

A fully runnable example in Python with the joke goto module installed (which uses debugger hooks to control program execution) looks like this:

from goto import comefrom, label

comefrom .repeat
name = raw_input('what is your name? ')
if name:
    print "Hello",name
    label .repeat
print "Goodbye!"

This is an implementation inRuby of the Intercal COME FROM statement.

$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

Some examples of the debug packet feature of the OS/360 Fortran G compiler:

  • Example 1: the values of SOLON, GFAR, and EWELL are examined as they were at the completion of statement 10. The AT statement indicates statement 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
  • Example 2: all the values of STOCK are displayed when statement 35 is encountered.
      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
  • Example 3: tracing begins at statement 10, at statement 20, tracing stops while the loop is executed, and resumes after the loop. Tracing stops just before statement 30 is executed.
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

See also [ edit ]

Serious programming contrivances involving ideas resembling COMEFROM:

References [ edit ]

  1. Hindle, Richie (1 April 2004), goto for Python , Entrian .
  2. Clarke, Lawrence , "We don't know where to GOTO if we don't know where we've COME FROM. This linguistic innovation lives up to all expectations." , Datamation (article), archived from the original on 2018-07-16 , retrieved 2004-09-24 .
  3. Modell, Howard; Slater, William (April 1978). "Structured programming considered harmful" . ACM SIGPLAN Notices . 13 (4): 76–79.doi: 10.1145/953411.953418 . Retrieved 18 July 2014 .
  4. IBM System/360 and System/370 Fortran IV Language, GC28-6515-10, May 1974
  5. F. X. Reid, On the Formal Semantics of the COMEFROM Statement. FACS FACTS , Issue 2006-1 , pages 18–20, March 2006.

External links [ edit ]


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK