Jump to content

COMEFROM

В компьютерном программировании 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

OS/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. ^ Jump up to: Перейти обратно: а б Хиндл, Ричи (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
Номер скриншота №: cf0f5ba6a538aefefa6079bfd3bd5fc3__1699203480
URL1:https://arc.ask3.ru/arc/aa/cf/c3/cf0f5ba6a538aefefa6079bfd3bd5fc3.html
Заголовок, (Title) документа по адресу, URL1:
COMEFROM - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)