В компьютерном программировании 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, как в юмористическом модуле goto Python; [1] см. ниже. Это также можно реализовать с помощью функции gcc «asm goto», используемой параметром конфигурации ядра Linux CONFIG_JUMP_LABEL. Местоположение неактивной операции сохраняется и заменяется переходом к исполняемому фрагменту, который в конце возвращается к инструкции после неактивной операции.
COMEFROM
изначально был замечен в списках шутливых инструкций ассемблера (как «CMFRM»). Это было подробно описано в статье Р. Лоуренса Кларка в Datamation в 1973 году [2] , написанной в ответ на письмо Эдсгера Дейкстры « Перейти к заявлению, считающемуся вредным» . COMEFROM в конечном итоге был реализован в варианте C-INTERCAL эзотерического языка программирования INTERCAL вместе с еще более непонятным «вычисленным COMEFROM
». Были также предложения Фортрана [3] для 'assigned COME FROM
' и DONT
ключевого слова ' ' (в дополнение к существующему DO
циклу ' ').
1 апреля 2004 года Ричи Хиндл опубликовал реализацию обоих GOTO
и COMEFROM
для языка программирования Python . [1] Несмотря на то, что он был выпущен в День дурака и не предназначен для серьезного использования, синтаксис действителен, а реализация полностью работает.
Ниже приведен пример программы на гипотетическом диалекте BASIC с " COMEFROM
" вместо " GOTO
".
10 COMEFROM 40 20 ВВОД «КАК ВАШЕ ИМЯ?» ; 30 австралийских долларов. НАПЕЧАТАЙТЕ «ПРИВЕТ» ; 40 австралийских долларов
Эта программа (гипотетически) работает, запрашивая у пользователя его имя, приветствуя его тем же именем и продолжая все сначала. Инструкция " REM
" в строке 40 представляет собой просто NOP (в данном случае REMark или комментарий ) — COMEFROM
оператор " " в строке 10 вызывает переход обратно к этой строке, когда выполнение достигает строки 40, независимо от ее содержимого.
Полностью работоспособный пример на Python с goto
установленным модулем шутки (который использует перехватчики отладчика для управления выполнением программы) выглядит следующим образом:
from goto import comfrom , меткародом из . повторите имя = raw_input ( «Как вас зовут?» ) , если имя : напечатайте ( «Привет» , имя ) метку . повторная печать ( «До свидания!» )
Это реализация в Ruby оператора Intercal COME FROM.
$come_from_labels = {} def label ( l ) , если $come_from_labels [ l ] $come_from_labels [ l ]. завершение вызова , завершение защита Come_from ( л ) callcc делать | блокировать | $come_from_labels [ l ] = конец блока , конец
Компилятор Fortran G OS/360 имеет функцию пакетов отладки. Его оператор «AT» аналогичен оператору COMEFROM тем, что он передает поток управления блоку отладки. Точки останова в целом аналогичны. [4]
ЦЕЛЫЙ СОЛОН , ГФАР , ЮЭЛЛ . . . 10 СОЛОН = GFAR * SQRT ( FLOAT ( EWELL )) 11 ЕСЛИ ( СОЛОН ) 40 , 50 , 60 . . . БЛОК ОТЛАДКИ ( 3 ) НА 11 ДИСПЛЕЕ GFAR , SOLON , EWELL END
РАЗМЕРНЫЙ ЗАПАС ( 1000 ), ВЫХОД ( 1000 ) . . . DO 30 I = 1 , 1000 25 АКЦИЯ ( I ) = АКЦИЯ ( I ) - ВЫХОД ( I ) 30 ПРОДОЛЖИТЬ 35 A = B + C . . . БЛОК ОТЛАДКИ ( 3 ) НА 35 ОТОБРАЖЕНИЕ КОНЕЦ МАТЕРИАЛА
10 А = 1,5 12 L = 1 15 B = А + 1,5 20 ДО 22 I = 1 , 5 . . . 22 ПРОДОЛЖИТЬ 25 C = B + 3,16 30 D = C / 2 СТОП . . . DEBUG UNIT ( 3 ), TRACE C DEBUG PACKET НОМЕР 1 В 10 TRACE ON C DEBUG PACKET НОМЕР 2 В 20 TRACE OFF DO 35 I = 1 , 3 . . . 35 ПРОДОЛЖИТЬ СЛЕДОВАНИЕ НА C ОТЛАДКА ПАКЕТА НОМЕР 3 НА 30 СЛЕДОВАНИЕ ВЫКЛ КОНЕЦ
COMEFROM
[5]Серьезные программные изобретения, включающие идеи, напоминающие COMEFROM: