Jump to content

COMEFROM

(Перенаправлено с COME FROM )

В компьютерном программировании COMEFROM ( или COME FROM ) — непонятная структура потока управления, используемая в некоторых языках программирования , первоначально в шутку. COMEFROM является обратным GOTO в том, что он может перенести состояние выполнения из любой произвольной точки кода в COMEFROM заявление.

Точка в коде, где происходит передача состояния, обычно задается параметр как COMEFROM. Происходит ли передача до или после инструкции в указанной точке передачи, зависит от используемого языка. В зависимости от используемого языка, несколько COMEFROMs, ссылающиеся на одну и ту же отправную точку, могут быть недействительными, недетерминированными, выполняться с каким-то определенным приоритетом или даже вызывать параллельное или иным образом одновременное выполнение, как показано в 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

См. также

[ редактировать ]

Серьезные программные изобретения, включающие идеи, напоминающие COMEFROM:

  1. ^ Перейти обратно: а б Хиндл, Ричи (1 апреля 2004 г.), переход к Python , Entrian .
  2. ^ Кларк, Лоуренс : «Мы не знаем, куда идти, если не знаем, откуда мы пришли. Это лингвистическое нововведение оправдывает все ожидания». , Datamation (статья), заархивировано из оригинала 16 июля 2018 г. , получено 24 сентября 2004 г.
  3. ^ Моделл, Ховард; Слейтер, Уильям (апрель 1978 г.). «Структурированное программирование считается вредным» . Уведомления ACM SIGPLAN . 13 (4): 76–79. дои : 10.1145/953411.953418 . Проверено 18 июля 2014 г.
  4. ^ IBM System/360 и System/370 Fortran IV Language, GC28-6515-10, май 1974 г.
  5. ^ FX Reid, О формальной семантике заявления COMEFROM. ФАКТЫ FACS , выпуск 2006-1 , страницы 18–20, март 2006 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: bf4bc11e6178f4e9e550d6f53fc6f915__1699203480
URL1:https://arc.ask3.ru/arc/aa/bf/15/bf4bc11e6178f4e9e550d6f53fc6f915.html
Заголовок, (Title) документа по адресу, URL1:
COMEFROM - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)