В компьютерном программировании COMEFROM ( или COME FROM ) — малоизвестная структура потока управления , используемая в некоторых языках программирования изначально в качестве шутки. COMEFROM
Является обратным , GOTO
поскольку может перенести состояние выполнения из любой произвольной точки кода в COMEFROM
оператор.
Точка в коде, где происходит передача состояния, обычно задается как параметр для COMEFROM
. Происходит ли передача до или после инструкции в указанной точке передачи, зависит от используемого языка. В зависимости от используемого языка, несколько COMEFROM
s, ссылающихся на одну и ту же точку отправления, могут быть недействительными, быть недетерминированными, выполняться с каким-то определенным приоритетом или даже вызывать параллельное или иное одновременное выполнение, как показано в Threaded Intercal . [ необходима цитата ]
Простым примером оператора " COMEFROM x
" является метка x
(которая не обязательно должна быть физически расположена где-либо рядом с соответствующим ей COMEFROM
), которая действует как "лазейка". Когда выполнение кода достигает метки, управление передается оператору, следующему за COMEFROM
. Это также может быть условным, передавая управление только при выполнении условия, аналогично GOTO внутри оператора IF. Основное отличие от GOTO заключается в том, что GOTO зависит только от локальной структуры кода, в то время как COMEFROM зависит от глобальной структуры — GOTO передает управление, когда достигает строки с оператором GOTO, в то время как COMEFROM требует сканирования всей программы или области действия, чтобы увидеть, находятся ли какие-либо операторы COMEFROM в области действия для этой строки, а затем проверки, достигнуто ли условие. Эффект этого в первую очередь заключается в том, что отладка (и понимание потока управления программы) чрезвычайно затруднены, поскольку рядом с рассматриваемой строкой или меткой нет никаких указаний на то, что управление таинственным образом перейдет в другую точку программы — необходимо изучить всю программу, чтобы увидеть, ссылаются ли какие-либо операторы COMEFROM на эту строку или метку.
Отладочные хуки могут использоваться для реализации оператора COMEFROM, как в юмористическом модуле Python goto ; [1] см. ниже. Это также может быть реализовано с помощью функции gcc "asm goto", используемой опцией конфигурации ядра Linux CONFIG_JUMP_LABEL. У no-op сохраняется его местоположение, которое заменяется переходом к исполняемому фрагменту, который в конце возвращается к инструкции после no-op.
COMEFROM
Первоначально он встречался в списках шуточных инструкций языка ассемблера (как «CMFRM»). Он был подробно описан в статье Р. Лоуренса Кларка в Datamation в 1973 году [2], написанной в ответ на письмо Эдсгера Дейкстры Go To Statement Considered Harmful . В конечном итоге COMEFROM был реализован в варианте C-INTERCAL эзотерического языка программирования INTERCAL вместе с еще более неясным «computed COMEFROM
». Также были предложения Fortran [3] для «assigned COME FROM
» и DONT
ключевого слова « '» (в дополнение к существующему DO
циклу « ').
1 апреля 2004 года Ричи Хиндл опубликовал реализацию GOTO
и COMEFROM
для языка программирования Python . [1] Несмотря на то, что она была выпущена в День смеха и не предназначалась для серьезного использования, синтаксис является допустимым, а реализация полностью работоспособна.
Ниже приведен пример программы на гипотетическом диалекте BASIC с « COMEFROM
» вместо « GOTO
».
10 COMEFROM 40 20 ВВОД "КАК ТЕБЯ ИМЯ?" ; 30 A$ ПЕЧАТАТЬ "ПРИВЕТ, " ; 40 A$ REM
Эта программа (гипотетически) работает, спрашивая у пользователя его имя, приветствуя его тем же именем и продолжая все снова и снова. Инструкция " REM
" в строке 40 — это просто NOP (в данном случае REMark или комментарий ) — COMEFROM
оператор " " в строке 10 вызывает ответвление обратно на эту строку, когда выполнение достигает строки 40, независимо от ее содержимого.
Полностью работоспособный пример на Python с goto
установленным модулем Joke (который использует отладочные хуки для управления выполнением программы) выглядит следующим образом:
из goto импорт comefrom , меткаcomefrom.repeat name = raw_input ( ' Как вас зовут?' ) if name : print ( " Привет " , name ) label.repeat print ( " До свидания!" )
Это реализация оператора Intercal COME FROM на языке Ruby .
$come_from_labels = {} def label ( l ) if $come_from_labels [ l ] $come_from_labels [ l ]. вызов конец конец def come_from ( l ) callcc do | block | $come_from_labels [ l ] = block end end
Компилятор OS/360 Fortran G имеет функцию отладочного пакета. Его оператор "AT" похож на COMEFROM в том, что он передает поток управления блоку отладки. Точки останова в целом похожи. [4]
ЦЕЛОЕ ЧИСЛО SOLON , GFAR , EWELL . . . . 10 SOLON = GFAR * SQRT ( FLOAT ( EWELL ) ) 11 ЕСЛИ ( SOLON ) 40 , 50 , 60. . . ОТЛАДОЧНЫЙ МОДУЛЬ ( 3 ) AT 11 ОТОБРАЖЕНИЕ GFAR , SOLON , EWELL КОНЕЦ
РАЗМЕР STOCK ( 1000 ), OUT ( 1000 ) . . . DO 30 I = 1 , 1000 25 STOCK ( I ) = STOCK ( I ) - OUT ( I ) 30 ПРОДОЛЖИТЬ 35 A = B + C . . . ОТЛАДОЧНЫЙ БЛОК ( 3 ) В 35 ОТОБРАЖЕНИЕ STOCK END
10 A = 1,5 12 L = 1 15 B = A + 1,5 20 DO 22 I = 1 , 5. . . 22 ПРОДОЛЖИТЬ 25 C = B + 3,16 30 D = C / 2 ОСТАНОВИТЬ . . . ОТЛАДОЧНЫЙ БЛОК ( 3 ), ТРАССА C ОТЛАДОЧНЫЙ ПАКЕТ НОМЕР 1 НА 10 ТРАССА НА C ОТЛАДОЧНЫЙ ПАКЕТ НОМЕР 2 НА 20 ТРАССА ВЫКЛ. DO 35 I = 1 , 3. . . 35 ПРОДОЛЖИТЬ ТРАССА НА C ОТЛАДОЧНЫЙ ПАКЕТ НОМЕР 3 НА 30 ТРАССА ВЫКЛ . КОНЕЦ
COMEFROM
[5]Серьёзные программные изобретения, включающие идеи, похожие на COMEFROM: