У функціойному програмуванні стиль передачі продовження (, CPS) — це стиль програмування, у якому керування передається явно у формі продовження. Йому протиставляється прямий стиль (direct style), який є звичайним стилем програмування. Термін був запропонований Джеральдом Джеєм Сассманом і Ґаєм Л. Стілом-молодшим у документі AI Memo 349 (1975), у якому викладено першу версію мови програмування Scheme. Джон К. Рейнольдс наводить докладний огляд численних відкриттів, пов'язаних із продовженнями.
Функція, написана у стилі передачі продовження, приймає додатковий аргумент — явне продовження (continuation), тобто функцію від одного аргументу. Коли функція CPS обчислює результат, вона «повертає» його, викликаючи функцію-продовження з цим значенням як аргументом. Це означає, що під час виклику функції CPS функція, яка її викликає, повинна передати процедуру, яку буде викликано зі значенням, що «повертається» підпрограмою. Подання коду в такій формі робить явними низку речей, які в прямому стилі є неявними. До них належать: повернення з процедури, яке стає явним як виклик продовження; проміжні значення, кожне з яких отримує власне ім'я; порядок обчислення аргументів, який стає явно визначеним; а також хвостові виклики, які просто викликають процедуру з тим самим, незмінним продовженням, що було передане функції, яка викликає.
Програми можна автоматично перетворювати з прямого стилю на CPS. Компілятори для мов функційного та логічного програмування часто використовують CPS як проміжне подання, тоді як компілятор для імперативної або процедурної мови програмування використовував би статичну форму єдиного присвоювання (SSA). SSA формально еквівалентна підмножині CPS (без урахування нелокального передавання керування, яке не виникає, коли CPS використовується як проміжне подання). Компілятори функційних мов також можуть використовувати A-нормальну форму (ANF) (але лише для мов, що потребують жадібного обчислення), а не thunk у CPS. CPS частіше використовується компіляторами, ніж програмістами, як локальний або глобальний стиль програмування.
Примітки