코루틴(Coroutines) in C
-
코루틴의 도입: 대규모 프로그램을 구조화하는 것은 언제나 어려운 일임. 데이터를 생산하는 코드와 소비하는 코드가 있을 때, 어느 것이 호출자(caller)이고 어느 것이 피호출자(callee)인지 결정하는 문제가 종종 발생함.
-
재구성(Rewriting): 통신 채널의 한 쪽을 호출 가능한 함수로 재작성하는 것이 일반적인 해결책임. 이는 원래의 코드보다 덜 명확하고 유지보수 부담을 늘림.
-
크누스의 코루틴(Knuth's coroutines): 도널드 크누스는 스택 개념을 버리고, 프로세스를 동등한 협력자로 생각하는 해결책을 제시함. 하지만 이는 어셈블리 언어에서만 가능하며, C와 같은 고급 언어에서는 지원하지 않음.
-
스택 기반 코루틴(Stack-based coroutines): C에서 크누스의 코루틴 호출 원리를 모방하고자 함. 이를 위해
goto
문과 상태 변수를 사용하여 함수 내부에서 제어를 임의의 지점으로 이동시키는 방법을 사용함.
-
더프의 장치(Duff's device):
switch
문 내부의 case
문을 사용하여 레이블 대신 switch
문 자체로 점프를 수행함. 이를 통해 코루틴 트릭을 구현함.
-
평가(Evaluation): 코루틴 매크로를 사용하여 생산자와 소비자 간의 데이터 전달을 가능하게 함. 이는 ANSI C에서 휴대성 있게 구현됨.
-
코딩 표준(Coding Standards): 이 기술은 코딩 표준을 위반하지만, 알고리즘의 구조를 명확히 드러내는 데 도움이 됨. 코딩 표준은 구문적 명확성보다 알고리즘적 명확성을 추구해야 함.
-
개선 및 코드(Refinements and Code): 실제 응용 프로그램에서는 정적 변수에 의존하지 않고 재진입 가능하고 멀티스레드 환경에서도 작동하는 코루틴 구현이 필요함. 이를 위해 컨텍스트 구조체를 매개변수로 사용함.
GN⁺의 의견
-
중요성: 이 기사는 C 언어에서 코루틴을 구현하는 창의적인 방법을 제시함으로써, 프로그래머들이 더 효율적으로 데이터 생산자와 소비자 간의 상호작용을 코딩할 수 있게 하는 방법을 설명함.
-
흥미로움: 크누스의 코루틴 개념을 C 언어에 적용하려는 시도는 프로그래밍 언어의 한계를 극복하고자 하는 개발자의 창의성을 보여줌.
-
도움됨: 코루틴을 사용하면 복잡한 상태 머신을 명시적으로 작성하지 않고도 비동기 처리를 구현할 수 있어, 코드의 가독성과 유지보수성이 향상됨.