РОДОМ ИЗ - COMEFROM

В компьютерное программирование, РОДОМ ИЗ (или же РОДОМ ИЗ) является неясным поток управления структура, используемая в некоторых языки программирования, изначально в шутку. РОДОМ ИЗ является инверсией ИДТИ К в том, что он может принимать состояние выполнения из любой произвольной точки кода в РОДОМ ИЗ утверждение.

Точка в коде, где происходит передача состояния, обычно задается как параметр к РОДОМ ИЗ. Произойдет ли передача до или после инструкции в указанной точке передачи, зависит от используемого языка. В зависимости от используемого языка несколько РОДОМ ИЗs ссылка на одну и ту же точку отправления может быть недействительной, недетерминированной, выполняться с каким-то определенным приоритетом или даже вызывать параллельно или иным образом одновременный казнь, как видно в Резьбовой Intercal.[нужна цитата ]

Простой пример "COMEFROM x"заявление - это метка Икс (который не должен физически располагаться где-либо рядом с соответствующим РОДОМ ИЗ), который действует как «люк». Когда выполнение кода достигает метки, управление передается инструкции, следующей за РОДОМ ИЗ. Это также может быть условным, передача управления только в том случае, если условие выполнено, аналогично GOTO в операторе IF. Основное отличие от GOTO состоит в том, что GOTO зависит только от локальной структуры кода, в то время как COMEFROM зависит от глобальной структуры - GOTO передает управление, когда достигает строки с оператором GOTO, в то время как COMEFROM требует сканирования всей программы или области действия для посмотреть, попадают ли какие-либо операторы COMEFROM в область действия строки, а затем проверить, выполнено ли условие. Эффект от этого в первую очередь состоит в том, чтобы сделать отладку (и понимание потока управления программой) чрезвычайно трудной, поскольку рядом с рассматриваемой строкой или меткой нет никаких указаний на то, что управление таинственным образом переместится в другую точку программы - нужно изучить всю программу, чтобы увидеть, ссылаются ли какие-либо операторы COMEFROM на эту строку или метку.

Перехватчики отладчика могут использоваться для реализации оператора COMEFROM, как в юмористическом Python идти к модуль;[1] видеть ниже. Это также можно реализовать с помощью функции gcc "asm goto", которая используется Ядро Linux опция конфигурации CONFIG_JUMP_LABEL. Положение без операции сохраняется, и оно заменяется переходом к исполняемому фрагменту, который в конце возвращается к инструкции после отсутствия операции.

История

РОДОМ ИЗ изначально был замечен в списках шуток язык ассемблера инструкции (как «CMFRM»). Он был разработан в Датамация статья автора Р. Лоуренс Кларк в 1973 г.,[2] написано в ответ на Эдсгер Дейкстра письмо Перейти к заявлению, которое считается вредным. COMEFROM был в конечном итоге реализован в варианте C-INTERCAL. эзотерический язык программирования ИНТЕРКАЛ наряду с еще более непонятным "вычисленным" РОДОМ ИЗ'. Были также Фортран предложения[3] для 'назначено РОДОМ ИЗ'и'НЕключевое слово (в дополнение к существующему)ДЕЛАТЬ' петля).

1 апреля 2004 г. Ричи Хиндл опубликовал реализацию обоих ИДТИ К и РОДОМ ИЗ для Язык программирования Python.[1] Несмотря на то, что был выпущен День дурака и не предназначенный для серьезного использования, синтаксис действителен и реализация полностью работает.

Практическое использование

Примеры

Ниже приводится пример программы в гипотетическом БАЗОВЫЙ диалект с "РОДОМ ИЗ" вместо "ИДТИ К".

10РОДОМ ИЗ4020ВХОД"КАК ВАС ЗОВУТ? ";Австралийский доллар30РАСПЕЧАТАТЬ"ПРИВЕТ, ";Австралийский доллар40REM

Эта программа (гипотетически) работает, спрашивая пользователя его имя, приветствуя его тем же именем и повторяя все заново. Инструкция "REM"в строке 40 - это просто NOP (в этом случае комментарий ) - "РОДОМ ИЗОператор "в строке 10 вызывает возврат к этой строке, когда выполнение достигает строки 40, независимо от ее содержимого.

Полностью запускаемый пример на Python с шуткой идти к установленный модуль (который использует хуки отладчика для управления выполнением программы) выглядит так:

из идти к импорт родом из, меткародом из .повторениеимя = сырой ввод('Как вас зовут? ')если имя:    Распечатать("Привет", имя)    метка .повторениеРаспечатать("До свидания!")

Это реализация в Рубин инструкции Intercal COME FROM.

$ come_from_labels = {}def метка(л)  если $ come_from_labels[л]    $ come_from_labels[л].вызов  конецконецdef родом из(л)  callcc делать |блокировать|    $ come_from_labels[л] = блокировать  конецконец

OS / 360 Фортран G

Компилятор OS / 360 Fortran G имеет функцию отладочного пакета. Его оператор «AT» похож на COMEFROM в том, что он передает поток управления блоку отладки. Контрольные точки в общем похожи.[4]

  • Пример 1: значения SOLON, GFAR и EWELL проверяются такими, какими они были при завершении оператора 10. Оператор AT указывает оператор 11.
 ЦЕЛОЕ СОЛОН, GFAR, EWELL    .    .    .10    СОЛОН = GFAR * SQRT(ПЛАВАТЬ(EWELL))11    ЕСЛИ (СОЛОН) 40, 50, 60    .    .    . ОТЛАЖИВАТЬ ЕДИНИЦА ИЗМЕРЕНИЯ(3) В 11 ОТОБРАЖАТЬ GFAR, СОЛОН, EWELL КОНЕЦ
  • Пример 2: все значения STOCK отображаются, когда встречается оператор 35.
 ИЗМЕРЕНИЕ АКЦИИ(1000),ИЗ(1000)    .    .    . ДЕЛАТЬ 30 я=1, 100025    АКЦИИ(я)=АКЦИИ(я) - ИЗ(я)30    ПРОДОЛЖИТЬ35    А = B + C    .    .    . ОТЛАЖИВАТЬ ЕДИНИЦА ИЗМЕРЕНИЯ(3) В 35 ОТОБРАЖАТЬ АКЦИИ КОНЕЦ
  • Пример 3: трассировка начинается с оператора 10, с оператора 20, трассировка останавливается на время выполнения цикла и возобновляется после цикла. Трассировка прекращается непосредственно перед выполнением оператора 30.
10    А = 1.512    L = 115    B = А + 1.520    ДЕЛАТЬ 22 я = 1,5    .    .    .22    ПРОДОЛЖИТЬ25    C = B + 3.1630    D = C/2 ОСТАНОВКА    .    .    . ОТЛАЖИВАТЬ ЕДИНИЦА ИЗМЕРЕНИЯ(3), СЛЕДC ОТЛАДНОЙ ПАКЕТ НОМЕР 1 В 10 СЛЕД НАC ОТЛАДНОЙ ПАКЕТ № 2 В 20 СЛЕД ВЫКЛЮЧЕННЫЙ ДЕЛАТЬ 35 я = 1,3    .    .    .35    ПРОДОЛЖИТЬ СЛЕД НАC ОТЛАДНОЙ ПАКЕТ № 3 В 30 СЛЕД ВЫКЛЮЧЕННЫЙ КОНЕЦ

Смотрите также

Серьезные программные ухищрения с идеями, напоминающими COMEFROM:

Рекомендации

  1. ^ а б Хиндл, Ричи (1 апреля 2004 г.), goto для Python, Entrian.
  2. ^ Кларк, Лоуренс, «Мы не знаем, куда ПЕРЕЙТИ, если мы не знаем, откуда мы ПРИШЛИ. Это языковое нововведение оправдывает все ожидания»., Датамация (статья), заархивировано оригинал на 2018-07-16, получено 2004-09-24.
  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. ^ Ф. X. Рид, О формальной семантике утверждения COMEFROM. FACS ФАКТЫ, Выпуск 2006-1, страницы 18–20, март 2006 г.

внешняя ссылка