Продолжение (информатика)

Парадигмы программирования

Продолжение (англ. continuation) — абстрактное представление состояния программы в определённый момент, которое может быть сохранено и использовано для перехода в это состояние. Продолжения содержат всю информацию, чтобы продолжить выполнения программы с определённой точки; состояние глобальных переменных обычно не сохраняется, однако для функциональных языков это несущественно (например, выборочное сохранение и восстановление значений глобальных объектов в Scheme достигается отдельным механизмом dynamic-wind). Продолжения похожи на goto Бейсика или макросы setjmp и longjmp в Си, так как так же позволяют перейти в любое место программы. Но продолжения, в отличие от goto, позволяют перейти в участок программы только с определённым состоянием, которое должно быть сохранено заранее, в то время, как goto позволяет перейти в участок программы с неинициализированными переменными.

Первый язык, реализовавший концепцию продолжений — Scheme, позднее встроенная поддержка продолжений появилась в ряде других языков.

Определения

Формально, callcc — это функция высшего порядка, позволяющая абстрагировать динамический контекст имеющейся функции в виде другой функции, которая и называется «продолжением».

Более наглядно, продолжение — это «вся оставшаяся часть программы от данной точки», или «функция, которая никогда не возвращает управление в точку своего вызова»[1]. В курсах функционального программирования объяснение понятия продолжения часто сводится к «расширению (усложнению) понятия сопрограммы», но в дидактическом смысле такое объяснение считается бесполезным[1]. Причина трудности объяснения концепции заключается в том, что продолжения фактически являются альтернативным обоснованием понятия «поведения» («вызова» в самом широком понимании), то есть несут иную семантическую модель, и в этом смысле начальный переход от «обычного» функционального программирования к программированию с интенсивным использованием продолжений можно сравнить с начальным переходом от императивного программирования к функциональному.

Продолжения обеспечивают математическое обоснование всего порядка выполнения программы, от goto и циклов до рекурсии, исключений, генераторов, сопрограмм и механизма возврата[1]. Как следствие, они позволяют реализовать все эти элементы в языке посредством единой конструкции.

Программирование в стиле передачи продолжений

Программирование в стиле передачи продолжений (англ. continuation-passing style, CPS) — это стиль программирования, при котором передача управления осуществляется через механизм продолжений. Стиль CPS впервые представили Джеральд Джей Сассман[англ.] и Гай Стил-младший[англ.], одновременно с языком Scheme.

Программу в «классическом стиле» зачастую можно переписать в стиле передачи продолжений. Например, для задачи вычисления гипотенузы прямоугольного треугольника с «классическим» кодом на Haskell:

pow2 :: Float -> Float
pow2 a = a ** 2

add :: Float -> Float -> Float
add a b = a + b

pyth :: Float -> Float -> Float
pyth a b = sqrt (add (pow2 a) (pow2 b))

можно добавить один аргумент типа F, где F означает функцию из возвращаемого значения исходной функции в произвольный тип x, а возвращающим значением сделать этот произвольный тип x:

pow2' :: Float -> (Float -> a) -> a
pow2' a cont = cont (a ** 2)

add' :: Float -> Float -> (Float -> a) -> a
add' a b cont = cont (a + b)

-- типы a -> (b -> c) и a -> b -> c эквивалентны, поэтому CPS-функцию можно
-- рассмотреть как функцию высшего порядка от одного аргумента
sqrt' :: Float -> ((Float -> a) -> a)
sqrt' a = \cont -> cont (sqrt a)

pyth' :: Float -> Float -> (Float -> a) -> a
pyth' a b cont = pow2' a (\a2 -> pow2' b (\b2 -> add' a2 b2 (\anb -> sqrt' anb cont)))

В функции pyth' вычисляется квадрат от a, и в качестве продолжения передаётся функция (лямбда-выражение), принимающая единственным аргументом a в квадрате. Далее таким же образом вычисляются все последующие промежуточные значения. Для того, чтобы произвести вычисления, в качестве продолжения необходимо передать функцию от одного аргумента, например, функцию id, которая возвращает любое переданное ей значение. Таким образом, выражение pyth' 3 4 id эквивалентно 5.0.

Стандартная haskell-библиотека в модуле Control.Monad.Cont содержит тип Cont, позволяющий использовать CPS функции в монаде. Функция pyth' будет выглядеть следующим образом:

pow2_m :: Float -> Cont a Float
pow2_m a = return (a ** 2)

-- функция cont поднимает обычные CPS функции в монаду
pyth_m :: Float -> Float -> Cont a Float
pyth_m a b = do
  a2 <- pow2_m a
  b2 <- pow2_m b
  anb <- cont (add' a2 b2)
  r <- cont (sqrt' anb)
  return r

Также данный модуль содержит функцию callCC, имеющую тип MonadCont m => ((a -> m b) -> m a) -> m a. Из типа видно, что она принимает единственным аргументом функцию, которая, в свою очередь, также имеет единственным аргументом функцию, прерывающую дальнейшие вычисления. Например, мы можем прервать дальнейшие вычисления, если хотя бы один из аргументов отрицательный:

pyth_m :: Float -> Float -> Cont a Float
pyth_m a b = callCC $ \exitF -> do
  when (b < 0 || a < 0) (exitF 0.0) -- when :: Applicative f => Bool -> f () -> f ()
  a2 <- pow2_m a
  b2 <- pow2_m b
  anb <- cont (add' a2 b2)
  r <- cont (sqrt' anb)
  return r

Примеры CPS в Scheme:

Direct style
Continuation passing style
(define (pyth x y)
 (sqrt (+ (* x x) (* y y))))
(define (pyth& x y k)
 (*& x x (lambda (x2)
          (*& y y (lambda (y2)
                   (+& x2 y2 (lambda (x2py2)
                              (sqrt& x2py2 k))))))))
(define (factorial n)
 (if (= n 0)
     1     ; NOT tail-recursive
     (* n (factorial (- n 1)))))
(define (factorial& n k)
 (=& n 0 (lambda (b)
          (if b                    ; продолжение растёт
              (k 1)                ; в рекурсивном вызове
              (-& n 1 (lambda (nm1)
                       (factorial& nm1 (lambda (f)
                                        (*& n f k)))))))))
(define (factorial n)
 (f-aux n 1))
(define (f-aux n a)
 (if (= n 0)
     a        ; tail-recursive
     (f-aux (- n 1) (* n a))))
(define (factorial& n k) (f-aux& n 1 k))
(define (f-aux& n a k)
 (=& n 0 (lambda (b)
          (if b                    ; продолжение сохраняется
              (k a)                ; в рекурсивном вызове
              (-& n 1 (lambda (nm1) 
                       (*& n a (lambda (nta)
                                (f-aux& nm1 nta k)))))))))

В «чистом» CPS фактически не существует самих продолжений — всякий вызов оказывается хвостовым. Если язык не гарантирует оптимизации хвостовых вызовов (англ. Tail call optimization, TCO), то при каждом вложенном вызове callcc растёт и само продолжение, и стек вызовов. Обычно это нежелательно, но временами используется интересным способом (например, в компиляторе Chicken Scheme[англ.]). Совместное использование стратегий оптимизации TCO и CPS позволяет полностью устранить динамический стек из исполнимой программы. Ряд компиляторов функциональных языков работает именно таким образом, к примеру, компилятор SML/NJ для языка Standard ML.

Ограниченные и неограниченные продолжения

Существует несколько разновидностей продолжений. Наиболее распространённая из них — неограниченные продолжения (undelimited continuations), реализуемые с помощью функции call/cc или её аналогов. Такие продолжения действительно представляют собой состояние всей программы (или одной её нити) в определённый момент. Вызов такого продолжения не похож на вызов функции, поскольку он соответствует «прыжку» в сохраненное состояние программы и не возвращает никакого значения; такое продолжение обычно нельзя вызвать несколько раз. Ограниченные продолжения (delimited continuations) абстрагируют зависимость результата некоторого блока программы от результата некоторого подвыражения этого блока. В определённом смысле они соответствуют некоторому сегменту стека вызовов, а не всему стеку. Такие продолжения могут использоваться как функции, вызываться несколько раз и так далее. Они абстрагируются с помощью механизма shift/reset: reset оборачивает внешний блок, shift действует как call/cc, но получает в качестве аргумента не глобальное продолжение, а ограниченное — зависимость значения блока reset от значения на месте блока shift. Существуют и другие разновидности, к примеру prompt/control.

Поддержка языками программирования

Многие языки программирования предоставляют эту возможность под различными именами, например:

  • Scheme: call/cc (краткая запись для call-with-current-continuation);
  • Standard ML: SMLofNJ.Cont.callcc, также реализовано в Concurrent ML;
  • Си: setcontext и аналоги (UNIX System V и GNU libc);
  • Ruby: callcc;
  • Smalltalk: Continuation currentDo:, в большинстве современных реализаций продолжения могут быть реализованы на чистом Smalltalk, не требуя специальной поддержки в виртуальной машине;
  • JavaScript: await и yield;
  • JavaScript Rhino: Continuation;
  • Haskell: callCC (в модуле Control.Monad.Cont);
  • Factor: callcc0 и callcc1;
  • Python: yield;
  • Python PyPy: _continuation.continulet;
  • Kotlin: suspend, на основе которого реализованы async, await, yield и некоторые другие сопрограммные конструкции.
  • Scala: существует плагин для поддержки ограниченных продолжений;
  • PHP: yield;
  • C#: yield return и await.

В любом языке, поддерживающем замыкания, можно писать программы в стиле передачи продолжений и вручную реализовать call/cc. В частности, это принятая практика в Haskell, где легко строятся «монады, передающие продолжения» (для примера, монада Cont и трансформер монад ContT библиотеки mtl).

Примечания

Ссылки

Read other articles:

Artikel ini memberikan informasi dasar tentang topik kesehatan. Informasi dalam artikel ini hanya boleh digunakan untuk penjelasan ilmiah; bukan untuk diagnosis diri dan tidak dapat menggantikan diagnosis medis. Wikipedia tidak memberikan konsultasi medis. Jika Anda perlu bantuan atau hendak berobat, berkonsultasilah dengan tenaga kesehatan profesional. impetigo pada siku, tembakan sendiri Impetigo adalah satu penyakit menular. Impetigo adalah infeksi kulit yang menyebabkan terbentuknya lepuh...

 

 

Lebah tukang kayu Xylocopa X. micans betina yang sedang mencari makan dan suara yang dihasilkan dari sarang X. pubescensTaksonomiKerajaanAnimaliaFilumArthropodaKelasInsectaOrdoHymenopteraFamiliApidaeGenusXylocopa Latreille, 1802 Tata namaNama zoologis ini berkoordinasi denganXylocopa SpesiesLihat tekslbs Lebah tukang kayu adalah nama yang diberi untuk anggota dari genus Xylocopa (tukang kayu[1]) yang merupakan anggota dari subfamili Xylocopinae. Genus ini mencakup sekitar 500 lebah da...

 

 

Australian news website news.com.auFormatOnline newspaperOwner(s)News Corp AustraliaWebsitewww.news.com.au News.com.au (stylised in all lowercase) is an Australian website owned by News Corp Australia. It had 9.6 million unique readers in April 2019[1] and covers national and international news, lifestyle, travel, entertainment, technology, finance and sport. Staff The organisation employs about 80 journalists, among them Samantha Maiden as national political editor[2] and Joe...

California Straight AheadPoster rilis teatrikalSutradaraHarry A. PollardDitulis olehDwinelle BenthallByron MorganHarry A. PollardBeatrice VanPemeranReginald DennyGertrude OlmsteadTom WilsonSinematograferVirgil MillerGilbert WarrentonPenyuntingDaniel MandellEdward SchroederPerusahaanproduksiUniversal PicturesDistributorUniversal PicturesTanggal rilis 13 September 1925 (1925-09-13) Durasi80 menitNegaraAmerika SerikatBahasaBisu (intertitel Inggris) California Straight Ahead adalah sebuah fi...

 

 

1920 film by Frank Lloyd For the 1930 early talkie remake, see The Silver Horde (1930 film). The Silver HordeStill with l to r: Sidney Ainsworth, Myrtle Stedman, and Curtis Cooksey. (*Ainsworth is not credited with the main cast though he obviously has a substantial role. He possibly was a last minute cast change.)[citation needed]Directed byFrank LloydWritten byJ. E. NashLaurence TrimbleBased onThe Silver Horde1909 novelby Rex BeachProduced byRex BeachSamuel GoldwynStarringMyrtle Ste...

 

 

German Paralympic athlete Markus RehmRehm at the 2016 ParalympicsPersonal informationNicknameBlade JumperBorn (1988-08-22) 22 August 1988 (age 35)Göppingen, West GermanyHeight1.85 m (6 ft 1 in)Websitewww.markus-rehm-88.deSportCountryGermanySportAthleticsDisability classF44/T44Event(s)Long jump, sprintClubBayer LeverkusenAchievements and titlesParalympic finalsLondon 2012, Rio de Janeiro 2016Personal best8.62 m Medal record Representing  Germany Paralympic Games ...

Pakistan Hockey Federationپاکستان ہاکی فیڈریشنSportField hockeyJurisdictionPakistanMembership8AbbreviationPHFFounded2 August 1948AffiliationInternational Hockey Federation (FIH)Regional affiliationAsian Hockey Federation (AHF)HeadquartersLahore, PakistanLocationNational Hockey Stadium, Ferozepur Road, Lahore 54600PresidentShehla RazaVice president(s)Muhammad Saeed KhanMaj.Gen.(R) Tariq Haleem Suri, HI (M)SecretarySyed Haider HussainOfficial websitepakistanhockeyfederation.c...

 

 

Questa voce o sezione sull'argomento società calcistiche italiane non cita le fonti necessarie o quelle presenti sono insufficienti. Puoi migliorare questa voce aggiungendo citazioni da fonti attendibili secondo le linee guida sull'uso delle fonti. Abano CalcioCalcio Neroverdi, Aponensi Segni distintiviUniformi di gara Casa Trasferta Colori sociali Nero, verde Dati societariCittàAbano Terme Nazione Italia ConfederazioneUEFA Federazione FIGC CampionatoPrima categoria Fondazione195...

 

 

Public park in Tsing Yi, Hong Kong Tsing Yi ParkTsing Yi Park Ornamental LakeTypePublic ParkLocation60 Tsing King Road, Tsing Yi, New Territories, Hong KongArea7.09 hectares (17.5 acres)Operated byLeisure and Cultural Service DepartmentOpenSeptember 1996; 27 years ago (1996-09)Websitewww.lcsd.gov.hk/en/parks/typ/index.htmlChinese nameTraditional Chinese青衣公園Simplified Chinese青衣公园TranscriptionsStandard MandarinHanyu PinyinQīngyī GōngyuánYue: ...

List of events in the year 1456 ← 1455 1454 1453 1452 1451 1456 in Ireland → 1457 1458 1459 1460 1461 Centuries: 13th 14th 15th 16th 17th Decades: 1430s 1440s 1450s 1460s 1470s See also:Other events of 1456 List of years in Ireland Events from the year 1456 in Ireland. Incumbent Lord: Henry VI[1] Events This section is empty. You can help by adding to it. (September 2016) Births References ^ Henry VI. Oxford Reference. Retrieved 1 February 2024. vteYears in Ireland (1101�...

 

 

莎拉·阿什頓-西里洛2023年8月,阿什頓-西里洛穿著軍服出生 (1977-07-09) 1977年7月9日(46歲) 美國佛羅里達州国籍 美國别名莎拉·阿什頓(Sarah Ashton)莎拉·西里洛(Sarah Cirillo)金髮女郎(Blonde)职业記者、活動家、政治活動家和候選人、軍醫活跃时期2020年—雇主內華達州共和黨候選人(2020年)《Political.tips》(2020年—)《LGBTQ國度》(2022年3月—2022年10月)烏克蘭媒�...

 

 

Частина серії проФілософіяLeft to right: Plato, Kant, Nietzsche, Buddha, Confucius, AverroesПлатонКантНіцшеБуддаКонфуційАверроес Філософи Епістемологи Естетики Етики Логіки Метафізики Соціально-політичні філософи Традиції Аналітична Арістотелівська Африканська Близькосхідна іранська Буддій�...

American baseball player, coach, and analyst (born 1957) Baseball player Bob OjedaOjeda in 2010PitcherBorn: (1957-12-17) December 17, 1957 (age 66)Los Angeles, California, U.S.Batted: LeftThrew: LeftMLB debutJuly 13, 1980, for the Boston Red SoxLast MLB appearanceApril 22, 1994, for the New York YankeesMLB statisticsWin–loss record115–98Earned run average3.65Strikeouts1,128 Teams Boston Red Sox (1980–1985) New York Mets (1986–1990) Los Angeles Dodger...

 

 

Numbered Highway in the United States Old Highway 80 redirects here. For other highways with the same number, see List of highways numbered 80. U.S. Route 80US 80 highlighted in redRoute informationLength1,035 mi[1] (1,666 km)ExistedNovember 11, 1926[2]–presentHistoryOriginal terminus at US 101 in San Diego, CA. Truncated to Dallas, TX by 1991.Major junctionsWest end I-30 / US 67 on the Dallas–Mesquite, TX city lineMajor intersection...

 

 

Politics of Sweden Basic Laws Instrument of Government Act of Succession Freedom of the Press Act Fundamental Law on Freedom of Expression Monarchy King (list): Carl XVI Gustaf Crown Princess: Victoria Royal family Royal Court Marshal of the Realm: Fredrik Wersäll Executive Government: Kristersson cabinet Prime Minister (list): Ulf Kristersson Deputy Prime Minister: Ebba Busch Government offices Ministries Government agencies Legislature Riksdag Speaker: Andreas Norlén Deputy Speakers 1st �...

جواز سفر كرواتيمعلومات عامةنوع المستند جواز سفرالبلد كرواتياالغرض التعريف (هوية شخصية)تاريخ الإصدار 26 يونيو 1991 (الإصدار الأول) 29 يونيو 2009[1] (جواز السفر الإلكتروني) 3 أغسطس 2015[2] (الإصدار الحالي؛ الإصدار الأول للاتحاد الأوروبي)صادر عن  كرواتيامتطلبات الاستحقاق ال�...

 

 

اضغط هنا للاطلاع على كيفية قراءة التصنيف بيوي أخضر   صوت الطائر noicon حالة الحفظ أنواع غير مهددة أو خطر انقراض ضعيف جدا [1] المرتبة التصنيفية نوع[2][3]  التصنيف العلمي النطاق: حقيقيات النوى المملكة: حيوانات الشعبة: الحبليات الشعيبة: الفقاريات غير مصنف: الفكيات �...

 

 

徐少萍 中華民國第3-8屆立法委員任期1996年2月1日—2016年1月31日 选区基隆市立法委員選舉區(第3-6屆)全國不分區及僑居國外國民立法委員選舉區(第7-8屆) 个人资料性别女出生 (1941-05-16) 1941年5月16日(83歲) 中華民國福建省国籍 中華民國政党 中國國民黨配偶林水木儿女林毅、林沛祥 学历 臺灣省立基隆女子中學初中部 崇右影藝科技大學五專 東吳大學�...

1931 novel by William Faulkner Sanctuary First edition cover. An alternate cover features shades of brown instead of blue.[1]AuthorWilliam FaulknerCover artistArthur Hawkins Jr.LanguageEnglishPublisherJonathan Cape and Harrison SmithPublication date1931Publication placeUnited StatesMedia typePrint (hardback & paperback)Preceded byAs I Lay Dying Followed byLight in August  Sanctuary is a 1931 novel by American author William Faulkner about the rape and...

 

 

ShigarakiNom officiel (ja) 信楽町 (1930-2004)GéographiePays  JaponPréfecture préfecture de ShigaAncien quartier Kōka district (en)Coordonnées 34° 52′ 41″ N, 136° 03′ 31″ EFonctionnementStatut Ancienne municipalité japonaise (d)HistoireFondation 15 août 1921Remplace Kumoi (d), Kohara (d), Asamiya (d), Tarao (d)Remplacé par KōkaDissolution 1er octobre 2004modifier - modifier le code - modifier Wikidata Shigaraki (信楽町, Shigaraki...