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 단락을 읽어보기 바란다 거기서 표현하고자 하는 의도와 여기서 말하는것은 다른것이 없다.

 

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

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

 

 

 

 

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

이기적 유전자 한글판 146 쪽 매와 비둘기 샘풀
예전에 이기적 유전자를 읽으면서 꼭한번 프로그램으로 만들고 싶다고 생각한것을 이번기회에 해봤다 여러 테스트를 거쳐 도킨스이론의 코드를 만들었다



동영상을 보면 처음에 비둘기만 사는곳에 돌연변이로 매의성격을 가진놈을 만들어냈다 점점 매가 강세를 펼치지만 어느지점에 가서 매가 많아지면 매의 전술은 손해를 보는 전술이 되서 다시 비둘기가 강세를 이룬다 그러다 보면 ess 에 도달한다. 내가 궁극적으로 단순한 현상을 보고 싶었던것이 아니다 나는 여기서 매끼리 싸울때 손해보는 점수를 적게 주었다 다음동영상을 보면 둘다 어느지점에 머무르긴하지만 매의 평균 수가 높아진것을 볼수있다.

결록적으로 매끼리 서로 알아볼수있는 능력이나 표시를 가져서 서로 인식하고 손해를 보는것을 줄일수있따면 위와같은 동영상이 될것이다. 우리사회는 분명 첫번째 동영상의 위치던 두번째 동영상의 위치던 어느곳에 머물러있을것이다 내가 말하고싶은건 어릴때 서로 사랑하고 도와가는 비둘기 처럼 살아야한다고 강요한다. 우리들은 항상 어릴때 부터 악한자는 언젠가는 벌을 받는다고 교육받는다 하지만 이기적 유전자 이론을 기초로한다면 절대로 악한자는 벌을 받지않는다 오히려 더 교활할수록 더 잘살아갈 확률이 높아진다. 그렇다고 해서 그들만 살아서는 생존할수없다는것도 안다. 그들에게는 적당한 비둘기들이 필요하다. 그래서 새로태어난 어린이들에게 항상 비둘기처럼 살라고 한다.


만들어봐야겠다..

이기적 유전자 2 라고 해야할까
처음에 이기적 유전자를 읽고

도킨스가 다음에 쓴책이 "확장된 표현형" http://www.yes24.com/24/goods/1402331 이란걸알고
들뜬마음으로 도서관에 가서 읽어보았다 하지만 예상과다르게 너무어렵고 깊이 들어가버려서 나를 지치게 만들었다
그후 그가 쓴다른책 눈먼 시계공을 알게 되였다 몇가지 더 있지만 다른건 그닥 흥미가 안끌려서
안읽어봤는데

"쉽게 배우는 유전 알고리즘" 을 읽다가 문장 중간에 이기적 유전자와 눈먼시계공책을 언급한다.
그때 느낌이 눈먼시계공이란책이 흥미로울것 같았다.
찾아보니 역시나 이기적유전자 2부 라고 해야할까 확장된 표현형 책에서 기대했던 그런내용이
여기에 있었다.

http://www.yes24.com/24/goods/1405744

전에 블로그에 내가 이기적 유전자에서 설명한 예시를 프로그램하고싶다고 쓴기억이 난다.
이제 슬슬 만들어봐야할듯하다.



인식률이 좋지않지만 기본적인 hmm 을 이해하는 도움이 되였다..
다음은 제스쳐를 인식할까해본다..
제스쳐중에 어떤 팩터를 특징데이타로 뽑아야할지 고민이다.

그가 무엇을 보고 웃는지 무엇을 보고 비웃는지가 그 사람의 인격과 기질을 보여준다. - 요한 볼프강 폰 괴테 (1749~1832)

http://www.lameproof.com/zboard/zboard.php?id=bbs2&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=621

공부한게 아까워서 정리하는차원에 wpf 버전으로 만든다.
http://www.codeproject.com/KB/recipes/Shortest_Path_Problem.aspx 문서보고 만듬.

실버라이트 어풀을 만들고 여기다 올려보자..
wpf 도 테스트

kgc 2008 후기

문득2008. 11. 22. 00:41
출장으로 14일 kgc 강연을 들으러갔다.

첫시간 멀티코어 성능모니터링 기술소개
- 그냥 공짜로 라이러리로 만들어준다면 쓸생각정도의 라이브러리..

두번째 신경망을 이용한 학습형게임 인공지능
-발표자료가 마음에 들었다. 딱 내수준에서 듣고싶던 전체적인 내용.
그리고 핵심은 풀레이어의 행동을 그대로 학습하게 만드는것인데.
거기에 사용된 알고리즘을 얘기해주었다.. 나도 인공지능을 전문으로 공부하지 않아
이렇다 저렇다 말은 못하지만.그분이 학습에 사용한 알고리즘 얘기해주었는데..
느낌이 그걸가지고 학습시키기는 부족하다라는 느낌이였다..
당장의 입력값만을 가지고 현재의 행동을 인식하는 알고리즘같아보였다.
그것이 아니라 과거의 정보가 누적되면서 앞으로의 행동을 예측할수있는
알고리즘이 필요한것같다.
결론은 다른 알고리즘으로 구현해야하는것이 아닌가한다..
시간의 흐름에 따른 입력정보를 인식하는...가령.. 내가 관심있는 HMM 뭐 이런걸로?
하여간 쉽지가 않을듯..
그리고 따로 FPS 게임에 AI 를 만들려는 시도를 따로 하고있다고 한다..
우리회사에서 최근 메탈FPS 게임을 만들고 있는게 거기에다 시도하면 좋을것 같다라는 생각을해본다.

세번째 C#을 이용한 빠른 툴개발..
이분은 온라인에서 열심히 활동하는사람인것 같다.
거의 모든내용에 공감한다.

네번째 멀티쓰레드 프로그래밍 패턴과 병행 프로그램밍
처음 목차에서의 말이 기억에 남는다.
언어의 한계가 사고의 한계다..
정말 명언이다.
이말을 이해못한다면 컴퓨터언어를 하나만 알고있거나 아니면 자기가 배운것이 항상 최고로만 착각하는사람일듯하다.
최근 c# 을 공부하면서 점점 함수형언어를 따로 공부해보고 싶다라는생각이들었다.
c++ 로 표현하려면 엄청 복잡한 방식으로 해야하는것을 c#으로 간단히 할수있는 강력함들을 느끼며
점점 다른언어들의 장점들을 배워보고싶었다.
그러면서 내가 너무 프로그램언어에 종속된 사고방식을 가졌구나라는 생각을 하게되였다.
하여간 이분의 강연은 함수형언어 얼랑을쓰면 좀더 다른접근방식으로 병령프로그래밍을 쉽게 할수있다라고
애기하는것 같다.
내가 얼랑을 써보지 않았지만.. 그냥 c#으로도 충분히 더빠르고 효율적(ccr,dss)으로 만들수 있다라는 생각이든다.
이분이 병렬프로그래밍에 설명했던 여러가지 패턴이 바로 ccr,dss 구조와같으음 느낀다.
하여간 함수형언어도 함 배워복고싶다.

다음은 국제대회.. 하지만 국제대회는 정말 할게 많은데...쩝.

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지