perpet

YIELD 키워드(lua coroutine)

이글은 c# 을 스크립트나 병렬처리를 하기위한 기초지식을 위한 글이다..

 c# 을쓰면서 yield 키워드를 쓰는일이 거의 없을수도 있다. 그것은 필요가 없는것이 아니라 그용도와 사용방식을 잘 모르기때문인것 같다.

특히나 이 yield  키워드는 c++ 에 없는 키워드이기에 c++ 프로그래머 들에게는 너무 생소하다.

(c++ 에서  Fiber 라는 것이 있다고 한다.나는 써보지를 않아서....)

 

나또한 이 개념을 알게 된 계기도 서버에서 스크립트로 lua 에서 coroutine 개념을 처음 써보고 후에 c# 에서 이 개념을 써보고 싶어서 자료를 찾던중 yield  라는 키워드로 제공되는것을 알았다.

우선

 

http://asyncsample.googlecode.com/files/AsyncSample.zip

 

에서 소스를 다운받는다.

다음 Enumerable 솔루션 파일을 열고

(ms visual c# 2008 express  http://www.microsoft.com/express/download/ )

 
Demo0 프로젝트를 본다.


우선 이 yield 키워드가 어떠한 일을 하는지 보고 이것을 가지고 어떠한 곳에서 사용할수있는지 보자.

우선 핵심적인 내용은 TestCode1() 함수안에 있는 코드의 진행을 IEnumerator.MoveNext() 라는 함수로 제어를 할수있다는것이다.


루아를 써보신분은 쉽게 접근을 할수있겠지만 코루틴을 처음 보시는분은 아직도 감이 오지않을것이다.

c++ 프로그래머 이라면 과연 저것이 내부적으로 어떻게 움직이는지 궁금할것이다.

 

http://www.lutzroeder.com/dotnet/

 

여기 사이트에 들어가서 reflector/ 프로그램을 다운받고 위에 샘풀코드 실행파일을 역어셈해보자

역어셈코드를 보면 코드가 어떻게 움직이는지 바로 느낄수있을거다.

 

원래 코드이다

 

  1.  
            public static IEnumerable TestCode1()
            {
  2.             int x = 3;
  3.             yield return x;
                x++;
                yield return x;
                x++;
                yield return x;
                x++;
                yield return x;
                x++;
  4.             yield break;
  5.         }

 

 .net Reflector 를 사용하여 위코드가 어떻게 변환되였는지 보자

 

  1.  

    private bool MoveNext() 
    {
  2. switch (this.<>1__state)
    {
    case 0:
    this.<>1__state = -1;
    this.<x>5__1 = 3;
    this.<>2__current = this.<x>5__1;
    this.<>1__state = 1;
    return true;
    case 1:
    this.<>1__state = -1;
    this.<x>5__1++;
    this.<>2__current = this.<x>5__1;
    this.<>1__state = 2;
    return true;
    case 2:
    this.<>1__state = -1;
    this.<x>5__1++;
    this.<>2__current = this.<x>5__1;
    this.<>1__state = 3;
    return true;
    case 3:
    this.<>1__state = -1;
    this.<x>5__1++;
    this.<>2__current = this.<x>5__1;
    this.<>1__state = 4;
    return true;
    case 4:
    this.<>1__state = -1;
    this.<x>5__1++;
    break;
    }
    return false;
    }

위코드가 변화되는것이 흥미롭다면  Demo01 도 한번 컴파일 하고 Reflector 로 보기 바란다.

 

그런데 과연 이것이 어떠한 코드표현에 유용한지 이해가 안간다면

우선  gpg 5권을 10.4 단락을 읽어보기 바란다 거기서 표현하고자 하는 의도와 여기서 말하는것은 다른것이 없다.

 

핵심적인 내용은 순차적인 어떠한 서술내용을 프로그램밍으로 직관적으로 표현할수있다라는것이다.

이것이 앞으로 이해할 핵심적내용이다 이 서술적 프로그래밍은 앞으로 이해할 프로그래밍을 설명하는 핵심적 문구라 볼수있다.

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.