코루틴

Coroutine

코루틴은 실행을 일시 중단했다가 재개할 수 있도록 하여 비선점 멀티태스킹용 서브루틴을 일반화하는 컴퓨터 프로그램 구성 요소입니다.코루틴은 협업 태스크, 예외, 이벤트 루프, 반복기, 무한 목록 및 파이프와 같은 익숙한 프로그램 구성 요소를 구현하는 데 적합합니다.

도널드 커누스에 따르면 멜빈 콘웨이는 1958년 코루틴이라는 용어를 조립 프로그램 [1]제작에 적용하면서 만들었다.코루틴에 대한 첫 번째 [2]출판된 설명은 1963년에 나왔다.

비교

서브루틴

서브루틴은 코루틴의 [3]특수한 경우입니다.서브루틴이 호출되면 시작 시 실행이 시작되고 서브루틴이 종료되면 종료됩니다.서브루틴 인스턴스는 1회만 반환되며 호출 사이에 상태를 유지하지 않습니다.반대로, 코루틴은 다른 코루틴을 호출함으로써 종료될 수 있으며, 코루틴은 나중에 원래 코루틴에서 호출된 시점으로 되돌아갈 수 있습니다. 코루틴의 관점에서 코루틴은 종료되는 것이 아니라 다른 코루틴을 [3]호출하는 것입니다.따라서 coroutine 인스턴스는 상태를 유지하고 호출에 따라 달라집니다.한 번에 여러 개의 coroutine 인스턴스가 존재할 수 있습니다.다른 코루틴을 호출하는 것과 단순히 다른 루틴을 호출하는 것의 차이는 서로 양보하는 두 코루틴 사이의 관계가 발신자-발신자의 관계가 아니라 대칭이라는 것이다.

서브루틴은 [4]수율을 호출하지 않는 코루틴으로 변환할 수 있습니다.

다음은 코루틴이 어떻게 유용할 수 있는지에 대한 간단한 예입니다.하나의 루틴이 항목을 생성하여 큐에 추가하고 다른 루틴이 항목을 큐에서 제거하여 사용하는 소비자-생산자 관계가 있다고 가정합니다.효율성을 위해 여러 항목을 한 번에 추가 및 제거하려고 합니다.코드는 다음과 같습니다.

var q : = new queue coroutine product loop when q가 꽉 차 있지 않은 동안 새로운 아이템을 몇 개 생성하여 q가 비어 있지 않은 동안 코루틴 소비 루프를 소비합니다.일부 아이템을 q에서 아이템을 사용하여 콜프로덕트를 생성합니다.

큐는 완전히 채워지거나 비워진 후 yield 명령어를 사용하여 다른 코루틴에 제어를 부여합니다.추가 코루틴 콜은 출력 직후 외부 코루틴 루프에서 시작됩니다.

이 예는 멀티스레딩의 도입으로 자주 사용되지만, 여기에는 두 가지 스레드가 필요하지 않습니다. 즉, 항복문은 하나의 루틴에서 다른 루틴으로 직접 점프하여 구현할 수 있습니다.

스레드

코루틴은 실과 매우 유사합니다.단, 코루틴은 협조적으로 멀티태스킹 처리되지만 스레드는 일반적으로 프리엠프티브 멀티태스킹 처리됩니다.코루틴은 동시성을 제공하지만 병렬성은 제공하지 않습니다.스레드 대비 코루틴의 장점은 하드 실시간콘텍스트에서 사용할 수 있다는 것입니다(코루틴 간 전환에는 시스템콜이나 블로킹콜이 전혀 필요 없습니다).중요한 섹션을 보호하기 위해 동기 프리미티브(뮤텍스, 세마포어 등)를 사용할 필요도 없고 지원도 필요 없습니다.운영체제

콜 코드에 대해서 투과적인 방법으로, 사전에 스케줄 된 스레드를 사용해 코루틴을 실장하는 것은 가능하지만, 몇개의 장점(특히, 하드 리얼 타임 동작의 적합성과 그 사이의 스위칭의 상대적 저비용)은 없어집니다.

제너레이터

생성기는 세미코루틴이라고도 [5]하며 코루틴의 하위 집합입니다.구체적으로는, 양쪽 모두 여러 번 양보할 수 있어 실행을 정지하고 복수의 엔트리 포인트에서 재진입을 허가할 수 있지만, 양자는 양보한 직후의 실행이 계속 되는 장소를 제어하는 코루틴의 능력에 차이가 있어, 발전기는 할 수 없고, 대신 제너레이터의 [6]호출자에게 제어권을 다시 이전한다.즉, 생성기는 주로 반복자의 쓰기를 단순화하는 데 사용되므로,yield제너레이터의 문은 점프할 코루틴을 지정하지 않고 부모 루틴으로 값을 반환합니다.

그러나 발전기에서 반환된 토큰으로 식별되는 어린이 발전기에 제어를 명시적으로 전달하는 최상위 디스패처 루틴(기본적으로 트램펄린)의 도움으로 발전기 설비 위에 코루틴을 구현하는 것은 여전히 가능하다.

var q : = 새 대기열 생성기 생성 루프(q가 가득 차 있지 않은 동안 일부 항목을 새로 생성하여 q가 비어 있지 않은 동안 q 항복 생성기 사용 루프에 항목을 추가합니다. 일부 항목을 q 사용에서 제거하여 해당 항목을 생성하면 서브루틴 디스패처 var d : → 새 사전(subroutine dispatcher var =)반복기) d[produce] : = start product d [ scurrent ] : = start consume var current : = start call current : = next d [ current ] 디스패처

생성기를 지원하지만 네이티브 코루틴이 없는 언어(예: Python 2.5 이전[7])에 대한 코루틴의 많은 구현은 이 모델 또는 유사한 모델을 사용합니다.

상호 재귀

상태 머신 또는 동시성에 코루틴을 사용하는 것은 테일콜에서 상호 재귀를 사용하는 것과 비슷합니다.어느 경우든 컨트롤은 일련의 루틴 중 다른 것으로 바뀝니다.그러나 코루틴은 더 유연하고 일반적으로 더 효율적입니다.코루틴은 반환이 아닌 실행이 처음부터 재개되기 때문에 변수(클로저와 같이)와 실행 포인트 양쪽의 상태를 유지할 수 있습니다.또한 산출량은 테일 위치에 한정되지 않습니다.상호 재귀 서브루틴은 공유 변수를 사용하거나 파라미터로 상태를 전달해야 합니다.또, 서브루틴의 상호 재귀 콜 마다 새로운 스택 프레임(테일제거가 실장되지 않는 한)을 필요로 하는 한편, 코루틴간의 패스 제어는 기존의 콘텍스트를 사용해 간단하게 점프에 의해서 실장할 수 있다.

일반적인 용도

코루틴은, 다음의 실장에 도움이 됩니다.

  • 단일 서브루틴 내의 스테이트 머신은 프로시저의 현재 입출구 포인트에 의해 상태가 결정됩니다.이것에 의해, goto 를 사용하는 것에 비해, 보다 읽기 쉬운 코드가 될 수 있습니다.또, 테일 콜과의 상호 재귀에 의해서 실장될 수도 있습니다.
  • 비디오 게임 등의 동시성 액터 모델.각 액터는 독자적인 프로시저를 가지고 있지만(이는 다시 논리적으로 코드를 분리하지만), 컨트롤은 중앙 스케줄러에 자발적으로 양보하고, 중앙 스케줄러는 이를 순차적으로 실행합니다(이것은 공동 멀티태스킹의 한 형태입니다).
  • 제너레이터는 스트림(특히 입력/출력) 및 데이터 구조의 일반적인 통과에 유용합니다.
  • 하위 프로세스가 코루틴인 순차적 프로세스를 전달합니다.채널 입력/출력 및 차단 작업은 코루틴을 생성하며, 스케줄러는 완료 이벤트에서 코루틴의 차단을 해제합니다.또는 각 하위 프로세스는 데이터 파이프라인에서 후속 프로세스(또는 그 이전 프로세스)의 상위 프로세스일 수 있으며, 이 경우 패턴이 중첩된 생성기로 표현될 수 있습니다.
  • 수학 소프트웨어에서 일반적으로 사용되는 역방향 통신으로, 해결사, 적분 평가자 등의 절차는 방정식 또는 적분 계산과 같은 계산을 위해 사용 프로세스를 필요로 합니다.

네이티브 지원

코루틴은 어셈블리 언어 메서드로 시작되었지만 일부 고급 프로그래밍 언어에서 지원됩니다.

연속성을 사용하여 코루틴을 구현할 수 있으므로 이를 지원하는 프로그래밍 언어도 코루틴을 쉽게 지원할 수 있습니다.

실장

2003년 현재 C와 그 파생어를 포함하여 가장 인기 있는 프로그래밍 언어 중 많은 수는 언어 또는 표준 라이브러리 내에서 코루틴을 직접 지원하지 않습니다.이는 대부분 스택 기반 서브루틴 구현의 제한에 기인합니다.예외는 C++ 라이브러리의 부스트입니다.컨텍스트, 부스트 라이브러리의 일부로 POSIX, Mac OS X 및 Windows에서 ARM, MIPS, PowerPC, SPARC 및 x86의 컨텍스트 스왑을 지원합니다.코루틴은 부스트를 기반으로 만들 수 있습니다.맥락.

코루틴이 메커니즘의 자연스러운 구현이지만 사용할 수 없는 상황에서는 일반적인 응답은 클로징(스테이트 변수(스태틱 변수, 종종 부울 플래그)이 있는 서브루틴)을 사용하여 콜 간의 내부 상태를 유지하고 제어를 올바른 포인트로 전송하는 것입니다.코드내의 조건에서는, 상태 변수의 값에 근거해 연속하는 콜에 대해서 다른 코드 패스가 실행됩니다.또 다른 전형적인 응답은 크고 복잡한 스위치 스테이트먼트 또는 goto 스테이트먼트(특히 계산된 goto)를 통해 명시적인 스테이트 머신을 구현하는 것입니다.이러한 구현은 이해하고 유지하기 어렵고 코루틴 지원을 위한 동기로 간주됩니다.

스레드 및 파이버는 오늘날 주류 프로그래밍 환경에서 코루틴의 대체 수단입니다.스레드는 동시에 실행되는 코드 조각의 실시간 협업 상호작용을 관리하기 위한 기능을 제공합니다.스레드는 C를 지원하는 환경(다른 많은 현대 언어에서 네이티브로 지원됨)에서 널리 사용 가능하며, 많은 프로그래머에게 친숙하며, 일반적으로 구현, 문서 및 지원이 잘 되어 있습니다.그러나 크고 어려운 문제를 해결함에 따라 강력하고 복잡한 시설들이 많이 포함되고 그에 따라 학습 곡선이 어려워집니다.따라서 코루틴만 있으면 되는 경우, 실을 사용하는 것은 과잉 살상이 될 수 있습니다.

스레드와 코루틴의 중요한 차이점 중 하나는 일반적으로 코루틴은 예약되지 않지만 스레드는 미리 예약된다는 것입니다.스레드는 언제든지 스케줄을 변경할 수 있고 동시에 실행할 수 있으므로 스레드를 사용하는 프로그램은 잠김에 주의해야 합니다.이와는 대조적으로 코루틴은 프로그램의 특정 지점에서만 재스케줄 할 수 있고 동시에 실행되지 않기 때문에 코루틴을 사용하는 프로그램은 완전히 잠기는 것을 피할 수 있습니다.이 속성은 이벤트 기반 또는 비동기 프로그래밍의 이점으로도 언급됩니다.

파이버는 공동으로 스케줄 되어 있기 때문에 위의 [20]Coroutine을 구현하기 위한 이상적인 기반이 됩니다.다만, 파이버에 대한 시스템 지원은 스레드에 비해 부족한 경우가 많습니다.

C

범용 코루틴을 구현하려면 두 번째 콜스택을 취득해야 합니다.이것은 C언어에 의해 직접 지원되지 않는 기능입니다.이를 실현하기 위한 신뢰성 있는(플랫폼 고유의) 방법은 소량의 인라인어셈블리를 사용하여 coroutine의 초기 작성 중에 스택포인터를 명시적으로 조작하는 것입니다.이것은 Tom Duff가 Protothreads[21][non-primary source needed]사용하는 방법과 비교한 상대적인 장점에 대한 논의에서 추천한 접근법입니다.POSIX 시그널 스택시스템 콜을 제공하는 플랫폼에서는 신호 핸들러[22][23] 내에서 스프링보드 함수를 호출하여 두 번째 콜스택을 얻을 수 있으며, 약간의 추가 복잡함을 감수하고 휴대용 C에서 동일한 목표를 달성할 수 있습니다.POSIX 또는 Single Unix Specification (SUSv3)에 준거한 C 라이브러리는 getcontext, setcontext, makecontextswapcontext와 같은 루틴을 제공했지만 이러한 기능은 POSIX 1.12008에서 [24]폐지되었다.

위의 몇 가지 방법으로 두 번째 콜스택을 얻으면 표준 C 라이브러리의 setjmplongjmp 함수를 사용하여 Coroutine 간의 스위치를 구현할 수 있습니다.이러한 함수는 각각 스택포인터, 프로그램카운터, 콜레인이 저장한 레지스터 및 ABI가 요구하는 기타 내부 상태를 저장 및 복원합니다.따라서 함수 호출에서 복귀했을 때 복원되는 모든 상태를 coroutine으로 되돌립니다.setjmp 및 longjmp 함수를 피기백하지 않는 미니멀리스트 구현에서는 스택포인터와 프로그램카운터만 교환하고 다른 모든 레지스터를 클로빙하인라인어셈블리의 작은 블록을 통해 같은 결과를 얻을 수 있습니다.ABI에 따라 setjmp와 longjmp는 사용 중인 모든 레지스터를 보수적으로 저장해야 하지만 clobber 메서드는 컴파일러가 실제로 사용 중인 것만 저장할 수 있도록 하기 때문에 훨씬 더 빠를 수 있습니다.

직접적인 언어 지원이 부족하기 때문에 많은 작가들이 위의 세부 사항을 숨기는 코루틴용 라이브러리를 직접 작성했습니다.Russ Cox의 libtask[25] 도서관은 이 장르의 좋은 예이다.네이티브 C 라이브러리에서 제공되는 경우 컨텍스트 함수를 사용하고, 그렇지 않은 경우 ARM, PowerPC, Sparc 및 x86에 대한 자체 구현을 제공합니다.기타 주목할 만한 구현으로는 libpcl,[26] coro,[27] lthread,[28] libCoroutine,[29] libconcurrency,[30] libcoro,[31][32][23] libdill,[33] libaco [34]및 libco가 있습니다.

위의 일반적인 접근법 외에 서브루틴과 매크로의 조합을 사용하여 C의 코루틴을 근사하려고 여러 번 시도했습니다.Duff의 기기를 기반으로 한 Simon Tatham의 [35]기여는 이 장르의 주목할 만한 사례이며 Protothreads 및 유사한 [36]구현의 기반이 됩니다.Duff의 [21]반대와 더불어, Tatham의 코멘트는 이 접근법의 한계에 대한 솔직한 평가를 제공합니다. "제가 아는 한, 이것은 심각한 생산 [35]코드에서 볼 수 있는 최악의 C 해킹입니다."이 근사치의 주요 결점은 각 코루틴에 대해 개별 스택프레임을 유지하지 않을 경우 로컬 변수가 함수의 산출량에 걸쳐 유지되지 않으며 함수에 대해 여러 엔트리를 가질 수 없으며 제어가 최상위 [21]루틴에서만 가능하다는 것입니다.

C++

  • C++20은 스택리스 함수로서 표준화된 코루틴을 도입했습니다.이 함수는 실행 중에 일시정지되었다가 나중에 재개할 수 있습니다.Coroutine의 서스펜드 상태는 [37]힙에 저장됩니다.G++ 및 MSVC 컴파일러는 현재 최신 [38]버전에서 표준 코루틴을 완전히 지원하고 있어 이 표준의 실장은 계속 진행 중입니다.
  • Oliver Kowalke가 만든 Boost.Coroutine은 1.53 버전 이후 공식적으로 출시된 휴대용 Coroutine 라이브러리입니다.라이브러리는 Boost에 의존합니다.컨텍스트를 지원하며 POSIX, Mac OS X 및 Windows에서 ARM, MIPS, PowerPC, SPARC 및 X86을 지원합니다.
  • Boost.Coroutine2는 Oliver Kowalke에 의해 작성되었으며 버전 1.59 이후 현대화된 휴대용 Coroutine 라이브러리입니다.C++11 기능을 이용하지만 대칭 코루틴은 지원되지 않습니다.
  • Mordor - 2010년에 Mozy open은 코루틴을 구현하는 C++ 라이브러리를 소싱하여 비동기 I/O를 보다 친숙한 순차 [39]모델로 추상화하는 데 중점을 두고 있습니다.
  • CO2 - C++ 프리프로세서 트릭에 기반한 스택리스 코루틴으로 대기/수율 에뮬레이션을 제공합니다.
  • 스컴 VM - 스컴VM 프로젝트는 Simon Tatham의 기사를 기반으로 스택리스 코루틴의 경량 버전을 구현합니다.
  • tonbit:: coroutine: ucontext/fiber를 통한 C++11 싱글 .h 비대칭 coroutine 구현
  • Coroutines는 2017년 5월에 Clang에 도착했으며 libc++ 구현이 [40]진행 중입니다.
  • Elle by Docker
  • otpp-coroutines - 높은 수준의 I/O 작업을 위해 설계된 스케줄링 기능을 갖춘 스택리스 코루틴.Oat++에 의한 500만 Web Socket 접속 실험에 사용됩니다.Oat++ 웹 프레임워크의 일부입니다.

C#

  • MindTouch Dream - MindTouch Dream REST 프레임워크는 C# 2.0 반복 패턴을 기반으로 코루틴을 구현합니다.
  • Caliburn Archived 2013-01-19 at archive. 오늘 - WPF용 Caliburn 화면 패턴 프레임워크는 특히 비동기 시나리오에서 UI 프로그래밍을 용이하게 하기 위해 C# 2.0 반복기를 사용합니다.
  • Power Threading Library Archived at the Wayback Machine 2010-03-24 - Jeffrey Richter의 Power Threading Library는 반복기 기반의 코루틴을 사용하여 단순화된 비동기 프로그래밍 모델을 제공하는 AsyncEnumerator를 구현합니다.
  • Unity 게임 엔진은 코루틴을 구현합니다.
  • Servelat Pieces - Yeven Bobrov의 Servelat Pieces 프로젝트는 Silverlight WCF 서비스를 위한 투명한 비동기 기능과 동기 메서드를 호출하는 기능을 제공합니다.구현은 Caliburn의 Coroutines 반복기 및 C# 반복기 블록을 기반으로 합니다.
  • [1] - 더.NET 2.0+ Framework는 이제 반복기 패턴 및 yield 키워드를 통해 준코루틴(제너레이터) 기능을 제공합니다.
  • Stream Threads - 스트림스레드는 반복기 확장 메서드에 기반한 오픈소스 경량 C# 코루틴 라이브러리입니다.오류 처리 및 반환 값을 지원합니다.

C# 5.0에는 wait 구문이 지원됩니다.

클로쥬르

CloroutineClojure에서 스택리스 코루틴을 지원하는 서드파티 라이브러리입니다.이것은 매크로로서 실장되어 임의의 var 콜의 임의의 코드 블록을 정적으로 분할해, 스테이트 풀 함수로 코루틴을 송신합니다.

D

D는 표준 라이브러리 클래스파이버A 제너레이터로서 코루틴을 실장하고 있기 때문에 파이버 기능을 입력 범위로서 공개하는 것은 간단하기 때문에 기존의 범위 알고리즘과 호환성이 있습니다.

자바

자바에는 코루틴을 위한 몇 가지 구현이 있습니다.Java의 추상화에 의해 부과된 제약에도 불구하고 JVM은 가능성을 [41]배제하지 않습니다.사용되는 일반적인 방법은 4가지가 있지만 2가지가 표준 준거 JVM 간 바이트 코드 이식성을 손상시킵니다.

  • 수정된 JVM코루틴을 보다 네이티브하게 지원하기 위해 패치가 적용된 JVM을 구축할 수 있습니다.다빈치 JVM은 패치를 만들었습니다.[42]
  • 바이트 코드 변경.Coroutine 기능은 일반 Java 바이트 코드를 즉시 또는 컴파일 시 다시 작성함으로써 가능합니다.툴킷에는 Javaflow, Java CoroutinesCoroutines포함됩니다.
  • 플랫폼 고유의 JNI 메커니즘이들은 OS 또는 C 라이브러리에 구현된 JNI 메서드를 사용하여 JVM에 [citation needed]기능을 제공합니다.
  • 스레드 추상화스레드를 사용하여 구현되는 Coroutine 라이브러리는 무거울 수 있지만 성능은 JVM의 스레드 구현에 따라 달라집니다.

자바스크립트

  • 노드 교환
    • Fibjs - fibjs는 Chrome의 V8 JavaScript 엔진에 구축된 JavaScript 런타임입니다.fibj는 파이버 스위치, 동기 스타일 및 논블로킹 I/O 모델을 사용하여 확장 가능한 시스템을 구축합니다.
  • ECMAScript 2015부터는 "발전기" 및 수율식을 통한 스택리스 코루틴 기능이 제공됩니다.

코틀린

Kotlin퍼스트 파티 라이브러리의 일부로 Coroutines를 구현합니다.

모듈라-2

Worth에 의해 정의된 Modula-2는 표준 SYSTEM 라이브러리의 일부로 Coroutine을 구현합니다.

NEW PROCESS() 프로시저는 주어진 코드 블록과 스택의 공간을 파라미터로 채우고 TRANSFER() 프로시저는 coroutine의 컨텍스트를 파라미터로 하여 제어를 coroutine으로 전송합니다.

모노

Mono Common Language Runtime은 코루틴을 구축할 수 있는 [43]연속성을 지원합니다.

.NET 프레임워크

개발 중.NET Framework 2.0에서는 SQL [44]서버용 파이버 모드에서의 사용을 염두에 두고 파이버 기반 스케줄링을 처리할 수 있도록 공통 언어 런타임(CLR) 호스팅 API 설계를 확장했습니다.릴리스 전에 작업 전환 후크 ICLRTask 지원:시간 [45]제약으로 인해 Switch Out이 제거되었습니다.따라서 fiber API를 사용하여 작업을 전환하는 것은 현재 에서는 실행 가능한 옵션이 아닙니다.NET 프레임워크

코루틴은 모든 Raku [46]백엔드에 기본적으로 구현되어 있습니다.

PHP

파이썬

  • Python 2.5는 확장 제너레이터(PEP 342)를 기반으로 Coroutine과 같은 기능을 더 잘 지원합니다.
  • Python 3.3은 서브제너레이터(PEP 380)에 대한 위임을 지원하여 이 기능을 향상시킵니다.
  • Python 3.4는 하위 생성기 위임을 활용하는 코루틴을 포함하는 PEP 3156에 표준화된 포괄적인 비동기 I/O 프레임워크를 도입했습니다.
  • Python 3.5는 비동기/대기 구문(PEP 0492)을 사용하는 Coroutine을 명시적으로 지원합니다.
  • Python 3.7 이후 async/ait는 예약된 [47]키워드가 되었습니다.
  • 이벤트렛
  • 그린렛
  • gevent(Gevent)
  • 스택리스 비단뱀

루비

Rust는 버전 [49]1.39 이후 Coroutine을 지원합니다.비동기 런타임에는 tokioasync-std라는2개의 일반적인 라이브러리가 있습니다.

스칼라

Scala Coroutines는[50] Scala를 위한 Coroutine 구현입니다.이 구현은 프로그램의 섹션을 Coroutine 객체로 정적으로 변환하기 위해 Scala 매크로 시스템에 의존하는 라이브러리 레벨 확장입니다.따라서 이 구현은 JVM에서 수정할 필요가 없기 때문에 서로 다른 JVM 간에 완전히 이식 가능하며 [51]JavaScript로 컴파일되는 Scala.js와 같은 대체 Scala 백엔드와 함께 작동합니다.

Scala Coroutines는coroutine정상적인 코드 블록을 코루틴 정의로 변환하는 매크로.이러한 코루틴 정의는 다음 명령어를 사용하여 호출할 수 있습니다.callcoroutine 프레임을 인스턴스화합니다.코루틴 프레임은 다음 명령을 사용하여 재개할 수 있습니다.resume코루틴 본체의 실행을 재개하는 방법yieldval키워드: Coroutine 프레임을 일시 정지합니다.Scala Coroutines는 또한snapshotmethod:[52] 코루틴을 효과적으로 복제합니다.ECOP 2018에서는 스냅샷이 포함된 Scala Coroutines에 대한 자세한 설명과 정식 모델이 공개되었습니다.

스킴

스킴은 계속에 대한 완전한 지원을 제공하기 때문에 코루틴을 구현하는 것은 거의 간단하며 연속 큐만 유지하면 됩니다.

스몰토크

대부분의 Smalltalk 환경에서는 실행 스택이 1등급 시민이기 때문에 추가 라이브러리나 VM 지원 없이도 코루틴을 구현할 수 있습니다.

재빠르다

  • Swift Coroutine - iOS, MacOS 및 Linux용 Swift Coroutines 라이브러리.

도구 명령어(Tcl)

버전 8.6 이후 Tool Command Language는 코어 언어로 코루틴을 지원합니다.[53]

바라

Vala는 코루틴에 대한 네이티브 지원을 구현합니다.Gtk 메인루프와 함께 사용하도록 설계되어 있지만 적어도1개의 출력 전에 엔드 콜백을 호출할 필요가 없도록 주의를 기울이면 단독으로 사용할 수 있습니다.

어셈블리 언어

기계에 의존하는 어셈블리 언어는 종종 코루틴 실행을 위한 직접적인 방법을 제공합니다.예를 들어 미니컴퓨터의 PDP-11 패밀리의 어셈블리 언어인 MACRO-11에서 "클래식" 코루틴 스위치는 "JSR PC,@(SP)+" 명령에 의해 영향을 받습니다.이 명령어는 스택에서 팝된 주소로 점프하여 현재의 명령어(다음 명령어)를 스택에 푸시합니다.VAXen(VAX 매크로의 경우)에서는 동등한 명령은 "JSB @(SP)+"입니다.Motorola 6809에서도 "JSR [,S++]", "+"라는 명령이 있습니다. 2바이트(주소의 경우)가 스택에서 팝업됩니다.이 지침은 (표준) '모니터' 어시스트 09에서 많이 사용됩니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Knuth, Donald Ervin (1997). Fundamental Algorithms (PDF). The Art of Computer Programming. Vol. 1 (3rd ed.). Addison-Wesley. Section 1.4.5: History and Bibliography, pp. 229. ISBN 978-0-201-89683-1. Archived (PDF) from the original on 2019-10-21.
  2. ^ Conway, Melvin E. (July 1963). "Design of a Separable Transition-diagram Compiler" (PDF). Communications of the ACM. ACM. 6 (7): 396–408. doi:10.1145/366663.366704. ISSN 0001-0782. S2CID 10559786 – via ACM Digital Library.
  3. ^ a b Knuth, Donald Ervin (1997). Fundamental Algorithms. The Art of Computer Programming. Vol. 1 (3rd ed.). Addison-Wesley. Section 1.4.2: Coroutines, pp. 193–200. ISBN 978-0-201-89683-1.
  4. ^ Perlis, Alan J. (September 1982). "Epigrams on programming". ACM SIGPLAN Notices. 17 (9): 7–13. doi:10.1145/947955.1083808. S2CID 20512767. Archived from the original on January 17, 1999. 6. Symmetry is a complexity reducing concept (co-routines include sub-routines); seek it everywhere
  5. ^ Anthony Ralston (2000). Encyclopedia of computer science. Nature Pub. Group. ISBN 978-1-56159-248-7. Retrieved 11 May 2013.
  6. ^ 를 들어 Python Language Reference "https://docs.python.org/reference/expressions.html#yieldexpr 5.2.10을 참조하십시오.표현식 산출]:
    이 때문에 발전기 기능은 코루틴과 매우 유사합니다.여러 번 생성되고 여러 개의 진입점이 있으며 실행이 중단될 수 있습니다.유일한 차이점은 제너레이터 함수가 실행 후 실행을 계속해야 하는 위치를 제어할 수 없다는 것입니다. 제어는 항상 제너레이터의 호출자에게 전달됩니다."
  7. ^ Mertz, David (July 1, 2002). "Generator-based State Machines". Charming Python. IBM developerWorks. Archived from the original on February 28, 2009. Retrieved Feb 2, 2011.
  8. ^ "Coroutine: Type-safe coroutines using lightweight session types".
  9. ^ "Co-routines in Haskell".
  10. ^ "The Coroutines Module (coroutines.hhf)". HLA Standard Library Manual.
  11. ^ "New in JavaScript 1.7".
  12. ^ "Julia Manual - Control Flow - Tasks (aka Coroutines)".
  13. ^ "What's New in Kotlin 1.1".
  14. ^ "Lua 5.2 Reference Manual". www.lua.org.
  15. ^ "Python async/await Tutorial". Stack Abuse. December 17, 2015.
  16. ^ "8. Compound statements — Python 3.8.0 documentation". docs.python.org.
  17. ^ "Gather and/or Coroutines". 2012-12-19.
  18. ^ Dahl, O.-J. and Hoare, C.A.R. (ed) (1972). "Hierarchical Program Structures". Structured Programming. London, UK: Academic Press. pp. 175–220. ISBN 978-0122005503. {{cite book}}: author=범용명(도움말)이 있습니다.CS1 유지: 여러 이름: 작성자 목록(링크)
  19. ^ McCartney, J. "컴퓨터 음악 프로그래밍 언어: 'SuperCollider'클릭합니다.컴퓨터 음악 저널, 26(4):61-68.MIT 프레스, 2002.
  20. ^ Coroutines for 구현.Magazine, Ajai Shankar, MSDN Magazine의 Wayback Machine 2008-09-07에서 Unmanaged Fiber API랩핑하여 NET 제공
  21. ^ a b c "Coroutines in C – brainwagon".
  22. ^ https://www.gnu.org/software/pth/rse-pmt.ps
  23. ^ a b "libco". code.byuu.org.[영구 데드링크]
  24. ^ "getcontext(3) - Linux manual page". man7.org.
  25. ^ http://swtch.com/libtask/ - Russ Cox의 FreeBSD, Linux, Mac OS X 및 SunOS용 libtask coroutine 라이브러리
  26. ^ POSIX/SUSv3 설비를 사용한 휴대용 Coroutine 라이브러리 - C 라이브러리
  27. ^ http://www.goron.de/~Froise/coro/Wayback Machine에서 2006-01-10년 아카이브 완료 - Edgar Tornig의 x86, Linux 및 FreeB용 coro 라이브러리SD
  28. ^ https://github.com/halayli/lthread - lthread는 C로 작성된 멀티코어/멀티스레드 Coroutine 라이브러리입니다.
  29. ^ "libcoroutine: A portable coroutine implementation". Archived from the original on 2019-11-12. Retrieved 2013-09-06. FreeBSD, Linux, OS X PPC 및 x86, SunOS, Symbian 등
  30. ^ "libconcurrency - A scalable concurrency library for C". 휴대용 스택 스위칭 코루틴을 위한 단순한 C 라이브러리
  31. ^ "libcoro: C-library that implements coroutines (cooperative multitasking) in a portable fashion". Coro perl 모듈의 기반으로 사용됩니다.
  32. ^ "RIBS (Robust Infrastructure for Backend Systems) version 2: aolarchive/ribs2". August 13, 2019 – via GitHub.
  33. ^ "libdill". libdill.org.
  34. ^ "A blazing fast and lightweight C asymmetric coroutine library 💎 ⛅🚀⛅🌞: hnes/libaco". October 21, 2019 – via GitHub.
  35. ^ a b Simon Tatham (2000). "Coroutines in C".
  36. ^ "Stackless coroutine implementation in C and C++: jsseldenthuis/coroutine". March 18, 2019 – via GitHub.
  37. ^ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4680.pdf - 코루틴 기술사양
  38. ^ https://en.cppreference.com/w/cpp/compiler_support#cpp20 - 현재 표준 코루틴 컴파일러 지원
  39. ^ http://mozy.com/blog/announcements/open-source-and-mozy-the-debut-of-mozy-code/ - 오픈 소스 및 Mozy:모지 코드의 데뷔
  40. ^ https://twitter.com/eric01/status/867473461836263424 - 에릭코루틴은 지금 클랑 트렁크에 있습니다!Libc++ 실장 작업 중.
  41. ^ Lukas Stadler (2009). "JVM Continuations" (PDF). JVM Language Summit.
  42. ^ Remi Forax (19 November 2009). "Holy crap: JVM has coroutine/continuation/fiber etc". Archived from the original on 19 March 2015.
  43. ^ http://www.mono-project.com/Continuations 모노 계속
  44. ^ http://blogs.msdn.com/cbrumme/archive/2004/02/21/77595.aspx , Chris Brumme , cbrumme's WebLog
  45. ^ kexugit. "Fiber mode is gone..." docs.microsoft.com. Retrieved 2021-06-08.
  46. ^ "RFC #31".
  47. ^ "What's New in Python 3.7". Retrieved 10 September 2021.
  48. ^ "semi-coroutines". Archived from the original on October 24, 2007.
  49. ^ "Rust 1.39 releases with stable async-await syntax, and more". 8 November 2019.
  50. ^ "Scala Coroutines". Storm Enroute. Retrieved 2019-12-28.
  51. ^ Scala Coroutines FAQ
  52. ^ Scala Coroutine 스냅샷
  53. ^ "coroutine manual page - Tcl Built-In Commands". Tcl.tk. Retrieved 2016-06-27.
  54. ^ Ritchie, Dennis M. (1980). "The Evolution of the Unix Time-sharing System". Language Design and Programming Methodology. Lecture Notes in Computer Science. Vol. 79. pp. 25–35. doi:10.1007/3-540-09745-7_2. ISBN 978-3-540-09745-7. S2CID 571269.

추가 정보

외부 링크