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, как в юмористическом модуле Python goto ; [1] см. ниже. Это также может быть реализовано с помощью функции gcc "asm goto", используемой опцией конфигурации ядра Linux CONFIG_JUMP_LABEL. У no-op сохраняется его местоположение, которое заменяется переходом к исполняемому фрагменту, который в конце возвращается к инструкции после no-op.

История

COMEFROMПервоначально он встречался в списках шуточных инструкций языка ассемблера (как «CMFRM»). Он был подробно описан в статье Р. Лоуренса Кларка в Datamation в 1973 году [2], написанной в ответ на письмо Эдсгера Дейкстры Go To Statement Considered Harmful . В конечном итоге COMEFROM был реализован в варианте C-INTERCAL эзотерического языка программирования INTERCAL вместе с еще более неясным «computed COMEFROM». Также были предложения Fortran [3] для «assigned COME FROM» и DONTключевого слова « '» (в дополнение к существующему DOциклу « ').

1 апреля 2004 года Ричи Хиндл опубликовал реализацию GOTOи COMEFROMдля языка программирования Python . [1] Несмотря на то, что она была выпущена в День смеха и не предназначалась для серьезного использования, синтаксис является допустимым, а реализация полностью работоспособна.

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

Примеры

Ниже приведен пример программы на гипотетическом диалекте BASIC с « COMEFROM» вместо « GOTO».

10 COMEFROM 40 20 ВВОД "КАК ТЕБЯ ИМЯ?" ; 30 A$ ПЕЧАТАТЬ "ПРИВЕТ, " ; 40 A$ REM         

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

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

из  goto  импорт  comefrom ,  меткаcomefrom.repeat  name = raw_input ( ' Как вас зовут?' ) if name : print ( " Привет " , name ) label.repeat print ( " До свидания!" )       

Это реализация оператора Intercal COME FROM на языке Ruby .

$come_from_labels = {}  def label ( l ) if $come_from_labels [ l ] $come_from_labels [ l ]. вызов конец конец     def come_from ( l ) callcc do | block | $come_from_labels [ l ] = block end end        

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

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

  ЦЕЛОЕ ЧИСЛО SOLON , GFAR , EWELL . . . . 10 SOLON = GFAR * SQRT ( FLOAT ( EWELL ) ) 11 ЕСЛИ ( SOLON ) 40 , 50 , 60. . . ОТЛАДОЧНЫЙ МОДУЛЬ ( 3 ) AT 11 ОТОБРАЖЕНИЕ GFAR , SOLON , EWELL КОНЕЦ                                           
  РАЗМЕР STOCK ( 1000 ), OUT ( 1000 ) . . . DO 30 I = 1 , 1000 25 STOCK ( I ) = STOCK ( I ) - OUT ( I ) 30 ПРОДОЛЖИТЬ 35 A = B + C . . . ОТЛАДОЧНЫЙ БЛОК ( 3 ) В 35 ОТОБРАЖЕНИЕ STOCK END                                          
10  A = 1,5 12 L = 1 15 B = A + 1,5 20 DO 22 I = 1 , 5. . . 22 ПРОДОЛЖИТЬ 25 C = B + 3,16 30 D = C / 2 ОСТАНОВИТЬ . . . ОТЛАДОЧНЫЙ БЛОК ( 3 ), ТРАССА C ОТЛАДОЧНЫЙ ПАКЕТ НОМЕР 1 НА 10 ТРАССА НА C ОТЛАДОЧНЫЙ ПАКЕТ НОМЕР 2 НА 20 ТРАССА ВЫКЛ. DO 35 I = 1 , 3. . . 35 ПРОДОЛЖИТЬ ТРАССА НА C ОТЛАДОЧНЫЙ ПАКЕТ НОМЕР 3 НА 30 ТРАССА ВЫКЛ . КОНЕЦ                                                                                     

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

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

Ссылки

  1. ^ ab Hindle, Richie (1 апреля 2004 г.), перейти к Python, Entrian.
  2. ^ Кларк, Лоуренс, «Мы не знаем, куда ИДТИ, если не знаем, ОТКУДА МЫ ПРИШЛИ. Это лингвистическое новшество оправдывает все ожидания», Datamation (статья), заархивировано из оригинала 2018-07-16 , извлечено 2004-09-24.
  3. ^ Modell, Howard; Slater, William (апрель 1978). «Структурное программирование считается вредным». ACM SIGPLAN Notices . 13 (4): 76–79. doi : 10.1145/953411.953418 . Получено 18 июля 2014 г.
  4. ^ IBM System/360 и System/370 Язык Fortran IV, GC28-6515-10, май 1974 г.
  5. ^ FX Reid, О формальной семантике утверждения COMEFROM. FACS FACTS, выпуск 2006-1, страницы 18–20, март 2006 г.

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