퓨처와 프로미스

컴퓨터 과학에서 **퓨처**(future), **프로미스**(promise), **딜레이**(delay), **디퍼드**(deferred)는 일부 병행 프로그래밍 언어에서 프로그램 실행을 동기화하려고 쓰는 구조체다. 프록시 역할을 하는 객체로 설명되며 값의 연산이 아직 이루어지지 않은 상태이므로 결과는 미리 알 수 없다. 프로미스(promise)라는 용어는 1976년 대니얼 P. 프리드먼과 데이비드 와이즈가 제안하였으며,pages=263–272 피터 히버드는 eventual로 명명하였다.conference= New Directions in Algorithmic Languages, (ed.) Stephen A. Schuman, IRIA, 1976. 일부 비슷한 개념인 퓨처(future)는 1977년 헨리 베이커와 칼 히위트의 논문에 등장하였다.archive-url=https://web.archive.org/web/20080704132429/http://home.pipeline.com/~hbaker1/Futures.html 퓨처, 프로미스, 딜레이, 디퍼드라는 용어는 종종 번갈아 사용되지만 퓨처와 프로미스 사이에는 이용 면에서 일부 차이가 있다. 퓨처는 변수의 읽기 전용 플레이스홀더인 반면 프로미스는 미래의 값을 저장하는, 쓰기가 가능한 단일 할당 컨테이너이다."SIP-14 – Futures and Promises url=https://web.archive.org/web/20190705213941/http://docs.scala-lang.org/sips/completed/futures-promises.html" 퓨처는 어느 특정 프로미스가 값을 설정할지를 지정하지 않고 정의할 수 있으며 각기 다른 잠재적인 프로미스들이 주어진 퓨처의 값을 설정할 수 있지만 주어진 퓨처에 대해 오직 한 번만 수행이 가능하다. 그 밖의 경우 퓨처와 프로미스는 함께 만들어지며 서로 연결된다. 즉, 퓨처는 값이고 프로미스는 값을 설정하는 함수, 특히 비동기 함수(프로미스)의 반환값(퓨처)을 의미한다. 퓨처의 값을 설정하는 것은 바인딩(binding), 풀필링(fulfilling), 리졸빙(resolving)으로 부른다.
# 구현체 목록
일부 프로그래밍 언어들은 퓨처, 프로미스, 병행 논리 변수, 데이터플로 변수, l-var을 지원하며 이는 직접 언어 지원을 통해서나 표준 라이브러리를 통해 제공된다.
## 프로그래밍 언어에 따른 퓨처와 프로미스 관련 개념 목록
* ABCL/fpublisher= American Mathematical Society * Alice ML * AmbientTalk (including first-class resolvers and read-only promises) * C++, starting with C++11: std::future and std::promise ** μC++ ** Compositional C++ * Crystal (programming language) * Dart (with *Future*/*Completer* classesurl-status= and the keywords *await* and *async*date=October 2014) * Elm (programming language) via the *Task* moduleurl=http://package.elm-lang.org/packages/elm-lang/core/latest/Task * Glasgow 하스켈 (I-vars and M-vars only) * Id (I-vars and M-vars only) * Iourl= http://iolanguage.org/guide/guide.html#Concurrency-Futures * 자바 via Future or CompletableFuture ** 자바 (프로그래밍 언어) * 자바스크립트 (limited, as of ECMA스크립트 6) * Lucid (dataflow only) * Some Lisps ** 클로저 (프로그래밍 언어)url= https://github.com/richhickey/clojure/blob/1.1.x/changes.txt#L130 ** MultiLisp * .NET via *Task*s ** C#, since .NET Framework 4.5,url-status=dead via the keywords `async` and `await`accessdate=2014-05-13 * Nim * Oxygene * Oz version 3archive-url=https://web.archive.org/web/20110514010946/http://www.mozart-oz.org/documentation/tutorial/node1.html * 파이썬 concurrent.futures, since 3.2,Python 3.2 Release as proposed by the PEP 3148, and Python 3.5 added async and awaitPython 3.5 Release * R (promises for lazy evaluation, still single threaded) * Racketaccessdate=2 March 2012 * RakuPromise class in Perl 6 * Scala via scala.concurrent package * Scheme * 스퀵 스몰토크 * Strand * Swift (only via third-party libraries) * Visual Basic 11 (via the keywords *Async* and *Await*) 프로미스 파이프라이닝을 지원하는 언어: * E * 줄
## 비표준 라이브러리 기반 퓨처 구현체 목록
* For 커먼 리스프: ** BlackbirdCommon Lisp Blackbird ** Eager Future2Common Lisp Eager Future2 ** lparallelLisp in parallel – A parallel programming library for Common Lisp ** PCallCommon Lisp PCall * For C++: ** Boost libraryaccessdate=26 June 2013 ** Dlibaccessdate=26 June 2013 ** Qturl-status=dead ** Seastaraccessdate=22 August 2016 ** Follydate=2019-01-08 ** POCO C++ Libraries (Active Results)title=Threads Slides of POCO ** HPXdate=2019-02-10 * For C# and other .NET languages: The Parallel Extensions library * For Groovy: GParsGroovy GPars date=12 January 2013 * For 자바스크립트: ** Cujo.js'archive-url=https://web.archive.org/web/20120317193626/http://cujojs.com/ when.jsJavaScript when.js provides promises conforming to the Promises/A+Promises/A+ specification 1.1 specification ** The Dojo Toolkit supplies promisespromises and Twisted style deferreds ** MochiKitJavaScript MochKit.Async inspired by Twisted's Deferreds ** jQuery's [//api.jquery.com/category/deferred-object/ Deferred Object] is based on the CommonJS Promises/A design. ** AngularJSJavaScript Angularjs ** node-promiseJavaScript node-promise ** Q, by Kris Kowal, conforms to Promises/A+ 1.1url-status= ** RSVP.js, conforms to Promises/A+ 1.1JavaScript RSVP.js ** YUI'sYUI JavaScript class library promise classYUI JavaScript promise class conforms to the Promises/A+ 1.0 specification. ** Bluebird, by Petka AntonovJavaScript Bluebird ** The Closure Library's promise package conforms to the Promises/A+ specification. ** See Promise/A+'s list for more implementations based on the Promise/A+ design. * For 자바: ** JDeferred, provides deferred-promise API and behavior similar to JQuery.Deferred objectJava JDeferred ** ParSeqJava ParSeq provides task-promise API ideal for asynchronous pipelining and branching, maintained by 링크드인 * For Lua: ** The cqueues module contains a Promise API. * For 오브젝티브-C: MAFuture,[https://github.com/mikeash/MAFuture Objective-C MAFuture GitHubObjective-C MAFuture mikeash.com RXPromise,Objective-C RXPromise ObjC-CollapsingFutures,ObjC-CollapsingFutures PromiseKit,Objective-C PromiseKit objc-promise,Objective-C objc-promise OAPromise,Objective-C OAPromise * For OCaml: Lazy module implements lazy explicit futuresOCaml Lazy * For 펄: Future,Perl Future Promises,Perl Promises Reflex,Perl Reflex and Promise::ES6Perl Promise::ES6 * For PHP: React/PromisePHP React/Promise * For 파이썬: ** Built-in implementationPython built-in implementation ** pythonfuturespythonfutures ** Twisted's Deferredsurl-status= * For R: ** future, implements an extendable future API with lazy and eager synchronous and (multicore or distributed) asynchronous futuresR package futurefuture * For Ruby: ** Promise gemRuby Promise gem ** libuv gem, implements promisesRuby libuv ** Celluloid gem, implements futuresarchive-url=https://web.archive.org/web/20130508122056/http://celluloid.io/ ** future-resourceRuby future-resource * For Rust: ** futures-rsfutures-rs crate * For Scala: ** Twitter's util libraryTwitter's util library * For Swift: ** Async framework, implements C#-style `async`/non-blocking `await`url-status=dead ** FutureKit,Swift FutureKit implements a version for Apple GCDSwift Apple GCD ** FutureLib, pure Swift 2 library implementing Scala-style futures and promises with TPL-style cancellationSwift FutureLib ** Deferred, pure Swift library inspired by OCaml's Deferredbignerdranch/Deferred ** BrightFuturesThomvis/BrightFutures * For Tcl: tcl-promisetcl-promise