{{위키데이터 속성 추적}}
'''코루틴'''(coroutine)은 [[루틴]]의 일종으로서, 협동 루틴이라 할 수 있다(코루틴의 "Co"는 with 또는 together를 뜻한다). 상호 연계 프로그램을 일컫는다고도 표현가능하다. 루틴과 서브 루틴은 서로 비대칭적인 관계이지만, 코루틴들은 완전히 대칭적인, 즉 서로가 서로를 호출하는 관계이다. 코루틴들에서는 무엇이 무엇의 서브루틴인지를 구분하는 것이 불가능하다. 코루틴 A와 B가 있다고 할 때, A를 프로그래밍 할 때는 B를 A의 서브루틴으로 생각한다. 그러나 B를 프로그래밍할 때는 A가 B의 서브루틴이라고 생각한다. 어떠한 코루틴이 발동될 때마다 해당 코루틴은 이전에 자신의 실행이 마지막으로 중단되었던 지점 다음의 장소에서 실행을 재개한다.<ref>The Art of Computer programming, 도널드 커누스 저</ref>

[[도널드 커누스]]에 따르면 [[멜빈 콘웨이]]는 1958년 코루틴(coroutine)이라는 용어를 만들어냈으며 당시 그는 이를 [[어셈블리어|어셈블리 프로그램]]에 적용했다.<ref name="KnuthVol1_1_4_5">{{서적 인용| first = Donald Ervin | last = Knuth | series = The Art of Computer Programming | volume = 1 | title = Fundamental Algorithms | edition = 3rd | publisher = Addison-Wesley | year = 1997| isbn = 978-0-201-89683-1 | at = Section 1.4.5: History and Bibliography, pp.&nbsp;229}}</ref> 코루틴에 관해 설명된 최초의 출판물은 1963년에 등장하였다.<ref name="Conway1963">{{저널 인용| last1 = Conway | first1 = M. E. | doi = 10.1145/366663.366704 | title = Design of a Separable Transition-Diagram Compiler| journal = Communications of the ACM | volume = 6 | issue = 7| pages = 396&ndash;408 | date =July 1963 }}</ref>

== 네이티브 지원 프로그래밍 언어 ==

코루틴은 [[어셈블리어]] 메소드로 기원하였으나 일부 [[고급 프로그래밍 언어]]에 지원된다. 초기 예시로는 [[시뮬라]]<ref name="Dahl1972">{{서적 인용|title=Structured Programming|author=Dahl, O.-J. and Hoare, C.A.R. (ed)|publisher=Academic Press|year=1972|isbn=978-0122005503|location=London, UK|pages=175–220|chapter=Hierarchical Program Structures}}</ref>, [[스몰토크]], [[모듈라-2]]가 포함된다. 더 최근의 예로는 [[루비 (프로그래밍 언어)|루비]], [[루아 (프로그래밍 언어)|루아]],  [[줄리아 (프로그래밍 언어)|줄리아]], [[Go (프로그래밍 언어)|Go]]가 포함된다.

{{Div col|colwidth=18em}}
* [[Aikido]]
* [[AngelScript]]
* [[Ballerina]]
* [[BCPL]]
* [[파스칼 (프로그래밍 언어)|파스칼]] (uThreads 모듈이 포함된 볼랜드 [[터보 파스칼]] 7.0)
* [[BETA]]
* [[BLISS]]
* [[C++]] (C++20 이후)
* [[C 샤프|C#]] (2.0 이후)
* [[ChucK]]
* [[CLU]]
* [[D (프로그래밍 언어)|D]]
* [[다이내믹 C]]
* [[얼랭]]
* [[F 샤프|F#]]
* [[팩터 (프로그래밍 언어)|팩터]]
* [[게임몽키 스크립트]]
* [[Godot|GDScript]] (Godot의 스크립트 언어)
* [[Go (프로그래밍 언어)|Go]]
* [[하스켈]]<ref>{{웹 인용
| title = Coroutine: Type-safe coroutines using lightweight session types
| url = http://hackage.haskell.org/cgi-bin/hackage-scripts/package/Coroutine
}}</ref><ref>{{웹 인용
| title = Co-routines in Haskell
| url = https://axman6.com/posts/2016-07-10-Linear-resources-in-haskell.html
}}</ref>
* [[High Level Assembly]]<ref>{{웹 인용
| title = The Coroutines Module (coroutines.hhf)
| url = http://www.plantation-productions.com/Webster/HighLevelAsm/HLADoc/HLAStdlib/1_HTML/HLAStdlib.htm#50618574_pgfId-998318
| work = HLA Standard Library Manual
}}</ref>
* [[아이콘 (프로그래밍 언어)|아이콘]]
* [[아이오 (프로그래밍 언어)|아이오]]
* [[자바스크립트]] (ECMAScript 6에서 표준화된 1.7 이후)<ref>{{웹 인용
| title = New in JavaScript 1.7
| url = https://developer.mozilla.org/en/docs/New_in_JavaScript_1.7
| 확인날짜 = 2020-06-18
| archive-date = 2009-03-08
| archive-url = https://web.archive.org/web/20090308111529/https://developer.mozilla.org/en//docs//New_in_JavaScript_1.7
}}</ref><!-- Does JavaScript belong here? See the link. --> ECMAScript 2017 또한 [[await]] 지원을 포함한다.
* [[줄리아 (프로그래밍 언어)|줄리아]]<ref>{{웹 인용| title=Julia Manual - Control Flow - Tasks (aka Coroutines)| url=http://docs.julialang.org/en/latest/manual/control-flow#man-tasks-1| 확인날짜=2020-06-18| archive-date=2020-06-13| archive-url=https://web.archive.org/web/20200613175413/https://docs.julialang.org/en/latest/manual/control-flow/#man-tasks-1}}</ref>
* [[코틀린 (프로그래밍 언어)|코틀린]] (1.1 이후)<ref>{{웹 인용| title=What's New in Kotlin 1.1|url=https://kotlinlang.org/docs/reference/whatsnew11.html#coroutines-experimental}}</ref>
* [[림보]]
* [[루아 (프로그래밍 언어)|루아]]<ref>{{웹 인용|url=http://www.lua.org/manual/5.2/manual.html#2.6|title=Lua 5.2 Reference Manual|website=www.lua.org}}</ref>
* [[루시드 (프로그래밍 언어)|루시드]]
* [[µC++]]
* [[MiniD]]
* [[Modula-2]]
* [[Nemerle]]
* [[펄]] ([https://metacpan.org/pod/Coro Coro 모듈] 사용 시)
* [[PHP]] ([https://github.com/facebook/hiphop-php HipHop] 사용 시. 네이티브 지원은 PHP 5.5 이후.)
* [[Picolisp]]
* [[프롤로그 (프로그래밍 언어)|프롤로그]]
* [[파이썬]] (2.5 이후,<ref>{{웹 인용|url=https://stackabuse.com/python-async-await-tutorial/|title=Python async/await Tutorial|date=December 17, 2015|website=Stack Abuse}}</ref> 3.3 이후부터 개선 지원됨, 3.5 이후부터 명시적 문법 지원<ref>{{웹 인용|url=https://docs.python.org/3/reference/compound_stmts.html#async-def|title=8. Compound statements — Python 3.8.0 documentation|website=docs.python.org}}</ref>)
* [[펄 6|Raku]]<ref>{{웹 인용| title=Gather and/or Coroutines|url=https://perl6advent.wordpress.com/2012/12/19/gather-andor-coroutines/|date=2012-12-19}}</ref>
* [[루비 (프로그래밍 언어)|루비]]
* [[Sather]]
* [[스킴 (프로그래밍 언어)|스킴]]
* [[셀프 (프로그래밍 언어)|셀프]]
* [[시뮬라]] 67
* [[스몰토크]]
* [[스퀴럴 (프로그래밍 언어)|스퀴럴]]
* [[스택리스 파이썬]]
* [[Supercollider]]<ref>McCartney, J. [http://portal.acm.org/citation.cfm?id=1245228 "Rethinking the Computer Music Programming Language: SuperCollider"]. Computer Music Journal, 26(4):61-68. MIT Press, 2002.</ref>
* [[Tcl]] (8.6 이후)
* [[urbiscript]]
<!-- Coroutines can be implemented in any language, so please limit this list to languages with native support.
Specifically, don't re-add the following entries without consideration:
* [[C 샤프|C#]]
* [[펄]]
* [[스몰토크]]
-->
{{div col end}}

== 같이 보기 ==
* [[파이프 (유닉스)]]: 코루틴의 일종

== 각주 ==
<references />

{{전거 통제}}
{{토막글|컴퓨터 과학}}

[[분류:병행 컴퓨팅]]
[[분류:함수 (프로그래밍)]]