COMEFROM
В компьютерном программировании 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] для 'назначенного COME FROM
' и ' DONT
ключевое слово ' (дополняющее существующее ' DO
' петля).
1 апреля 2004 года Ричи Хиндл опубликовал реализацию обоих GOTO
и COMEFROM
для языка программирования Python . [1] Несмотря на то, что он был выпущен в День дурака и не предназначен для серьезного использования, синтаксис действителен, а реализация полностью работает.
Практическое использование
[ редактировать ]Примеры
[ редактировать ]Ниже приведен пример программы на гипотетическом диалекте BASIC с « COMEFROM
" вместо " GOTO
".
10 COMEFROM 40
20 INPUT "WHAT IS YOUR NAME? "; A$
30 PRINT "HELLO, "; A$
40 REM
Эта программа (гипотетически) работает, запрашивая у пользователя его имя, приветствуя его тем же именем и продолжая все сначала. Инструкция " REM
" в строке 40 — это просто NOP (в данном случае REMark или комментарий ) — " COMEFROM
" Оператор в строке 10 вызывает возврат к этой строке, когда выполнение достигает строки 40, независимо от ее содержимого.
Полностью работоспособный пример на Python с шуткой goto
Установленный модуль (который использует перехватчики отладчика для управления выполнением программы) выглядит следующим образом:
from goto import comefrom, label
comefrom .repeat
name = raw_input('What is your name? ')
if name:
print("Hello", name)
label .repeat
print("Goodbye!")
Это реализация в Ruby оператора Intercal COME FROM.
$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
ОС/360 Фортран G
[ редактировать ]Компилятор Fortran G OS/360 имеет функцию пакетов отладки. Его оператор «AT» аналогичен оператору COMEFROM тем, что он передает поток управления блоку отладки. Точки останова в целом аналогичны. [4]
- Пример 1: значения SOLON, GFAR и EWELL проверяются такими, какими они были на момент завершения оператора 10. Оператор AT указывает на оператор 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
- Пример 2: все значения STOCK отображаются при обнаружении оператора 35.
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
- Пример 3: трассировка начинается с оператора 10, на операторе 20 трассировка останавливается на время выполнения цикла и возобновляется после завершения цикла. Трассировка прекращается непосредственно перед выполнением оператора 30.
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
См. также
[ редактировать ]- FX Reid , эксперт по семантике
COMEFROM
[5] - Действие на расстоянии
- ИНТЕРКАЛ
Серьезные программные изобретения, включающие идеи, напоминающие COMEFROM:
- Pointcut в аспектно-ориентированном программировании
- Продолжение
- Триггеры базы данных
- Шаблон наблюдателя
- Программирование, управляемое событиями
- Вебхук
- Блоки маршрутизации сигналов Goto/From в MATLAB Simulink
Ссылки
[ редактировать ]- ^ Перейти обратно: а б Хиндл, Ричи (1 апреля 2004 г.), переход к Python , Entrian .
- ^ Кларк, Лоуренс : «Мы не знаем, куда идти, если не знаем, откуда мы пришли. Это лингвистическое нововведение оправдывает все ожидания». , Datamation (статья), заархивировано из оригинала 16 июля 2018 г. , получено 24 сентября 2004 г.
- ^ Моделл, Ховард; Слейтер, Уильям (апрель 1978 г.). «Структурированное программирование считается вредным» . Уведомления ACM SIGPLAN . 13 (4): 76–79. дои : 10.1145/953411.953418 . Проверено 18 июля 2014 г.
- ^ IBM System/360 и System/370 Fortran IV Language, GC28-6515-10, май 1974 г.
- ^ FX Reid, О формальной семантике заявления COMEFROM. ФАКТЫ FACS , выпуск 2006-1 , страницы 18–20, март 2006 г.