- 차세대 게임개발 언어로 D에 주목하는 이유 - 마지막
Tweet
- Game Development
- 2009/12/18 08:26
- composition, D programming language, data race, Design By Contract, double-checked locking, functional programming, memory barrier, Nested Class, RAII, subtyping, thread local
-
2009/09/19 - [Game Development] - 차세대 게임개발 언어로 D에 주목하는 이유 - 1
2009/10/20 - [Game Development] - 차세대 게임개발 언어로 D에 주목하는 이유 - 2
드디어 마지막입니다. 마지막인 만큼 강력한 놈들이 많이 나옵니다. 그 사이 시스템 프로그래밍 언어라는 같은 분야를 노리는 Go라는 강력한 경쟁자가 나타났습니다만... 여전히 D 언어만의 장점이 있습니다.
제가 이전 글 2009/06/03 - [Game Development] - Double-checked locking 이디엄의 함정 에서 설명한 것처럼 아래와 같은 double checked locking은 data race라는 문제가 있습니다. 메모리 배리어가 필요하지만 사용도 까다롭고 포터블하게 제공하기도 어렵죠. 그래서 C++0x에서 이를 위한 별도의 라이브리러 함수 std::call_once()를 제공하는 것이죠. 이렇듯 병렬 프로그래밍에서의 race 문제는 저수준에서 접근하기에는 문제가 너무 많습니다. 그래서 언어 차원에서의 지원이 중요한 것이죠.
D에서는 모든 변수가 기본으로 thread local 입니다. 여러 스레드 간 공유를 위해서는 변수 선언 시 따로 shared로 명시해주어야 합니다. 공유 가능하나 불변하는 값을 가지는 변수를 위한 immutable이라는 형 수식 키워드도 제공합니다. 이런 접근을 통해서 컴파일러는 shared로 지정된 변수들에 대해서는 읽기/쓰기 재정렬을 방지하고 해당 변수 접근에 대해 자동으로 메모리 배리어을 삽입할 수 있습니다. 위 DCL 문제는 다음과 같이 하면 해결되는 것이죠. (아래 코드에서는 scope(exit) 라는 D 언어의 RAII 지원도 확인하실 수 있습니다.)
또한 함수형 언어의 기반인 순수 함수도 지원합니다. 순수 함수란 수학 함수에서와 같이 결과값이 입력인 함수 인자에만 의존하고 부수 효과(side effect, 전역 변수나 멤버 변수를 수정하는 것과 같은 상태의 변화)가 없는 함수를 말합니다. 따라서 같은 인자를 주면 언제나 같은 값을 리턴합니다. 이러한 순수 함수의 장점은 그 본성으로 인해 동기화가 필요 없다는 것입니다. 병렬화가 아주 쉽다는 것이지요. D에서는 다음과 같이 순수 함수를 선언하면 컴파일러 순수 함수로 동작하도록 보장해줍니다. 보장이 안될 경우 컴파일 에러가 난다는 뜻이지요.
이를 이용하면 최근 manycore의 대두와 함께 각광을 받고 있는 함수형 프로그래밍 방식으로 개발하는 것도 가능합니다. 물론 메모리 배리어는 성능 손실을 가져오므로, shared 변수를 남용하면 느려질 수 있습니다. 따라서 shared 변수는 최소화하고, immutable 변수와 순수 함수의 사용을 극대화하는 것이 좋습니다.
어쨌든 결론은 D는 언어 차원에서 병렬성에 대한 해법을 어느 정도 제시해준다는 것입니다. D에서의 병렬 프로그래밍에 관해 더 알고 싶으시면 http://su.pr/1h5Anx의 문서를 참고하세요.
D 언어는 계약에 의한 설계(DbC, Design by Contract) 개념을 지원합니다. 단순한 assertion에 차원을 넘어 precondition, postcondition, invariant의 개념에서 스펙을 명시할 수 있습니다. 아래의 제곱근 함수에서 precondition, postcondition, 함수 바디가 각각 in, out, body 키워드를 통해 어떻게 사용되는지 확인하실 수 있습니다.
불변식invariant도 다음과 같이 invariant 키워드를 통해 지정할 수 있습니다. 다음의 Date 클래스에서는 제대로 된 날짜라면 갖춰야 할 조건이 항상 만족되도록 불변식을 지정하고 있습니다.
이러한 계약에 의한 프로그래밍은 상속 개념과도 어울려 동작하도록 되어 있습니다. 더 자세한 사항은 곧 출간 될 The D Programming Language를 참고해주세요.
마지막은 개체 지향 프로그래밍 관련 기능입니다. 많은 개체 지향 언어들어 서브타이핑의 방편으로 상속을 제공합니다. 하지만 상속은 워낙 결합도가 강해 의외로 단점이 많습니다. 또한 다중 상속은 구현상의 어려움도 많고 사용상의 주의점도 많아 C++ 이후의 대부분의 언어들이 지원하지 않고 있습니다. 보통 인터페이스 다중 상속만을 지원하지요. D도 마찬가지입니다. 인터페이스의 다중 상속만 가능합니다. 한편, 상속이 가지는 이러안 너무 강한 결합도라는 단점 때문에, 상속 보다는 composition을 통합 기능 결합을 추천하기도 합니다.
상속 이외에도, D 언어는 composition 기반 하에 상속과 같은 편의성을 제공하는 매우 유용한 서브타이핑 기능을 제공합니다. 예를 들어 Shape에서 상속 받아야 하는 구체 클래스가 있는데, DB와의 연동 기능(DBObject 클래스가 제공)도 필요하다고 가정해봅시다. D에서는 다중 상속 없이도 다음과 같이 할 수 있습니다.
alias this가 핵심인데요. 그렇게 해주면 unittest 섹션에서 볼 수 있는 것처럼 DBObject의 기능을 마치 상속 받은 것처럼 활용할 수 있습니다! (this()는 짐작대로 생성자입니다.) 더욱 놀라운 것은 다음과 같이 DBObject를 오버라이드하여 사용할 수도 있다는 것입니다. 이때는 D 언어의 또다른 강력한 기능인 nested class가 활용됩니다. (C++에서의 inner class 처럼 단순히 scope만 제한되는 기능이 아닙니다. 실제 outer 클래스 인스턴스에 멤버에 접근이 가능한 형태로 기능합니다. 더 자세한 설명은 역시 서적을 참고해주세요...;)
개인적으로 정말 깔끔하고 참신한 해법이라 생각합니다.
참고자료
D (programming language) - Wikipedia
이상으로 3회에 걸쳐 D 언어의 장점에 대해 살펴보았습니다. 역시나 본인의 이해력, 필력 부족으로 제가 느꼈든 참신함과 강력함이 제대로 전달되었을지 걱정입니다. 조금이나마 D 언어에 관심이 생기도록 일조했다면 다행이고요, 그런 분들은 필히 서적을 구입하여 일독하시기를 권합니다. ^^
* 이 포스트는 blogkorea [블코채널 : 웹, 컴퓨터, it에 관련된 유용한 정보 및 소식] 에 링크 되어있습니다.
2009/10/20 - [Game Development] - 차세대 게임개발 언어로 D에 주목하는 이유 - 2
![]() ~ The Sunny Side ~ by ViaMoi |
드디어 마지막입니다. 마지막인 만큼 강력한 놈들이 많이 나옵니다. 그 사이 시스템 프로그래밍 언어라는 같은 분야를 노리는 Go라는 강력한 경쟁자가 나타났습니다만... 여전히 D 언어만의 장점이 있습니다.
병렬 프로그래밍concurrent programming
제가 이전 글 2009/06/03 - [Game Development] - Double-checked locking 이디엄의 함정 에서 설명한 것처럼 아래와 같은 double checked locking은 data race라는 문제가 있습니다. 메모리 배리어가 필요하지만 사용도 까다롭고 포터블하게 제공하기도 어렵죠. 그래서 C++0x에서 이를 위한 별도의 라이브리러 함수 std::call_once()를 제공하는 것이죠. 이렇듯 병렬 프로그래밍에서의 race 문제는 저수준에서 접근하기에는 문제가 너무 많습니다. 그래서 언어 차원에서의 지원이 중요한 것이죠.
D에서는 모든 변수가 기본으로 thread local 입니다. 여러 스레드 간 공유를 위해서는 변수 선언 시 따로 shared로 명시해주어야 합니다. 공유 가능하나 불변하는 값을 가지는 변수를 위한 immutable이라는 형 수식 키워드도 제공합니다. 이런 접근을 통해서 컴파일러는 shared로 지정된 변수들에 대해서는 읽기/쓰기 재정렬을 방지하고 해당 변수 접근에 대해 자동으로 메모리 배리어을 삽입할 수 있습니다. 위 DCL 문제는 다음과 같이 하면 해결되는 것이죠. (아래 코드에서는 scope(exit) 라는 D 언어의 RAII 지원도 확인하실 수 있습니다.)
또한 함수형 언어의 기반인 순수 함수도 지원합니다. 순수 함수란 수학 함수에서와 같이 결과값이 입력인 함수 인자에만 의존하고 부수 효과(side effect, 전역 변수나 멤버 변수를 수정하는 것과 같은 상태의 변화)가 없는 함수를 말합니다. 따라서 같은 인자를 주면 언제나 같은 값을 리턴합니다. 이러한 순수 함수의 장점은 그 본성으로 인해 동기화가 필요 없다는 것입니다. 병렬화가 아주 쉽다는 것이지요. D에서는 다음과 같이 순수 함수를 선언하면 컴파일러 순수 함수로 동작하도록 보장해줍니다. 보장이 안될 경우 컴파일 에러가 난다는 뜻이지요.
이를 이용하면 최근 manycore의 대두와 함께 각광을 받고 있는 함수형 프로그래밍 방식으로 개발하는 것도 가능합니다. 물론 메모리 배리어는 성능 손실을 가져오므로, shared 변수를 남용하면 느려질 수 있습니다. 따라서 shared 변수는 최소화하고, immutable 변수와 순수 함수의 사용을 극대화하는 것이 좋습니다.
어쨌든 결론은 D는 언어 차원에서 병렬성에 대한 해법을 어느 정도 제시해준다는 것입니다. D에서의 병렬 프로그래밍에 관해 더 알고 싶으시면 http://su.pr/1h5Anx의 문서를 참고하세요.
계약 프로그래밍contract programming
D 언어는 계약에 의한 설계(DbC, Design by Contract) 개념을 지원합니다. 단순한 assertion에 차원을 넘어 precondition, postcondition, invariant의 개념에서 스펙을 명시할 수 있습니다. 아래의 제곱근 함수에서 precondition, postcondition, 함수 바디가 각각 in, out, body 키워드를 통해 어떻게 사용되는지 확인하실 수 있습니다.
불변식invariant도 다음과 같이 invariant 키워드를 통해 지정할 수 있습니다. 다음의 Date 클래스에서는 제대로 된 날짜라면 갖춰야 할 조건이 항상 만족되도록 불변식을 지정하고 있습니다.
이러한 계약에 의한 프로그래밍은 상속 개념과도 어울려 동작하도록 되어 있습니다. 더 자세한 사항은 곧 출간 될 The D Programming Language를 참고해주세요.
다중 서브타이핑multiple subtyping
마지막은 개체 지향 프로그래밍 관련 기능입니다. 많은 개체 지향 언어들어 서브타이핑의 방편으로 상속을 제공합니다. 하지만 상속은 워낙 결합도가 강해 의외로 단점이 많습니다. 또한 다중 상속은 구현상의 어려움도 많고 사용상의 주의점도 많아 C++ 이후의 대부분의 언어들이 지원하지 않고 있습니다. 보통 인터페이스 다중 상속만을 지원하지요. D도 마찬가지입니다. 인터페이스의 다중 상속만 가능합니다. 한편, 상속이 가지는 이러안 너무 강한 결합도라는 단점 때문에, 상속 보다는 composition을 통합 기능 결합을 추천하기도 합니다.
상속 이외에도, D 언어는 composition 기반 하에 상속과 같은 편의성을 제공하는 매우 유용한 서브타이핑 기능을 제공합니다. 예를 들어 Shape에서 상속 받아야 하는 구체 클래스가 있는데, DB와의 연동 기능(DBObject 클래스가 제공)도 필요하다고 가정해봅시다. D에서는 다중 상속 없이도 다음과 같이 할 수 있습니다.
alias this가 핵심인데요. 그렇게 해주면 unittest 섹션에서 볼 수 있는 것처럼 DBObject의 기능을 마치 상속 받은 것처럼 활용할 수 있습니다! (this()는 짐작대로 생성자입니다.) 더욱 놀라운 것은 다음과 같이 DBObject를 오버라이드하여 사용할 수도 있다는 것입니다. 이때는 D 언어의 또다른 강력한 기능인 nested class가 활용됩니다. (C++에서의 inner class 처럼 단순히 scope만 제한되는 기능이 아닙니다. 실제 outer 클래스 인스턴스에 멤버에 접근이 가능한 형태로 기능합니다. 더 자세한 설명은 역시 서적을 참고해주세요...;)
개인적으로 정말 깔끔하고 참신한 해법이라 생각합니다.
참고자료
D (programming language) - Wikipedia
이상으로 3회에 걸쳐 D 언어의 장점에 대해 살펴보았습니다. 역시나 본인의 이해력, 필력 부족으로 제가 느꼈든 참신함과 강력함이 제대로 전달되었을지 걱정입니다. 조금이나마 D 언어에 관심이 생기도록 일조했다면 다행이고요, 그런 분들은 필히 서적을 구입하여 일독하시기를 권합니다. ^^
* 이 포스트는 blogkorea [블코채널 : 웹, 컴퓨터, it에 관련된 유용한 정보 및 소식] 에 링크 되어있습니다.
'Game Development' 카테고리의 다른 글
| [해외 개발자 인터뷰] Tiago Sousa (4) | 2010/02/17 |
|---|---|
| Game Developer Blog Network 인증용 vefe3cc49 (냉무) (0) | 2010/01/04 |
| 차세대 게임개발 언어로 D에 주목하는 이유 - 마지막 (0) | 2009/12/18 |
| 크라이텍 아카데미 (0) | 2009/12/02 |
| 차세대 게임개발 언어로 D에 주목하는 이유 - 2 (6) | 2009/10/20 |
| 크라이엔진 3 발표와 크라이텍코리아 구인 (0) | 2009/10/18 |












Recent comment