stringtranslate.com

РОДОМ ИЗ

В компьютерном программировании 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] для '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 ] = конец блока , конец        

ОС/360 Фортран G

Компилятор 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:

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

  1. ^ Аб Хиндл, Ричи (1 апреля 2004 г.), переход к Python, Entrian.
  2. ^ Кларк, Лоуренс, «Мы не знаем, куда идти, если не знаем, откуда мы пришли. Это лингвистическое нововведение оправдывает все ожидания», Datamation (статья), заархивировано из оригинала в 2018 году. 16 июля , получено 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 г.

Внешние ссылки