2009년 4월 13일 월요일

BCCL(boost concept check library) 첫인상

http://groups.google.com/group/comp.lang.c++/browse_thread/thread/ec94a39f632a6c05

할짓없으니 쓰지도 않을 다른 잡다한 언어들을 공부를 했었는데 밥벌이 도구 C++ 도 조금씩 따라가야겠군. 뭐 어차피 다음 표준은 멀었고 나온다고 해도 몇년간은 건드리지 못하겠지만.. 뭐 어쨌건 컨셉(이라기보단 BCCL)에 대해서 약간.

먼저 결론부터 말하면 병신같다.


용어부터 몇개 적어두자. 참고로 현재 컨셉에 대해 적는것은 BCCL (부스트 컨셉 체크 라이브러리) 쪽 문서를 대강 읽어버고 적는것으로 C++ 다음 표준에 대한 문서를 읽어본것은 아니다. 그건 나중에 구현이 나오면 다시 읽어보든가 하게 되겠고 일단 BCCL 쪽에서 말하는 용어부터.
  • concept - 타입이 지켜야 할 것들
  • model - concept 을 지킨 타입
  • refinement - 컨셉의 확장이라는데 잘 모르겠다. 다른 컨셉을 포함하는 컨셉이란걸까?
그리고 컨셉은 네가지 종류가 있는데
  • valid expression - 컴파일 되야 한다는거. 뭐 정의안된 함수를 부르거나 하면 안된다는 뻔한소리겠지.
  • associcate types - 글쎄 뭔지 모르겠네. 어떤 타입 T 가 어떤 컨셉의 모델이면 부수적으로 다른 타입들고 유효해야 하는데 그 성질을 말하는거 같다.
  • invariants - 이건 전혀 상상이 안간다. 불변의 런타임 특성이라.. 정적 특성도 아니고..
  • complexity guarantees - 이건 정말 이해불가능이었다.. 어떻게 언어차원에서 이걸 정의할수가 있는거지. 결국 이 단어때문에 낚여서 BCCL 문서를 보다가 때려치게 됐다. BCCL 은 이 네가지중 위 두가지.. 즉 신택스 쪽만 체크해준다. 뭐 당연한거면 당연한건데 낚였다는 느낌을 지울수가 없네.
이제 대강 컨셉이 뭔지 알게됐다. 어떤 타입 T 가 가질수있는 성질들을 적절히 분류해둔게 컨셉이라고 생각하면 되겠다. 아주 복잡하게 설명되어있는데 간단히 haskell 식으로 말하면 컨셉은 타입클래스와 유사한놈이라고 보면 된다. 모델은 물론 이 타입클래스의 인스턴스가 되겠고.. 리파인먼트는 클래스 상속쯤이되려나(내가 리파인먼트를 제대로 이해했다면)

문제는 haskell 같은경우 애초에 이런식(메타프로래밍)으로 만들어진 언어라서 언어적인 지원이 좋다는거. 어떤 타입이 어떤 타입클래스의 인스턴스여야 하는데 그게 누락되었다면 친절하게 이해갈수있는 에러메시지를 띄워준다.

그런데 C++ 은 그렇지 못하다.. 템플릿이 가장 짱나는 점이 에러가 나면 대책없다는거.( 사실 빌드 느린게 더 짜증난다... )
당장 stl 만 보더라도 쓰다가 에러가 나면 에러메시지를 읽느니 내가 뭘 잘못했는지 코드를 한번더 읽어보는게 디버깅이 더 빠르다. 이게 stl 같이 익숙한 표준 라이브러리니까 가능한거지 생소한 템플릿 라이브러리를 쓰다가 에러가 나면 욕밖에 안나온다.

그래서 나온게 컨셉 체크 라이브러리 인데.. 글쎄.. 이게 공부의 의욕을 부르는 좋은 라이브러리는 아니다. 드러운 템플릿/매크로 매직...


템플릿 관련 공부를 하다보면 항상 결론은 같다..
정말 믿을수있는 라이브러리라면 잘 공부한후에 쓰고(안쓰기가 힘들다. 템플릿만으로 가능한게 많으니)
내가 만드는 라이브러리는 절대로 템플릿 쓰지 말것.
타이핑 더 하더라도 유지보수 어려운 쓰레기를 만드는것보단 나을게다.


진짜 결론은 템플릿 공부하기 싫다는거 ㅎㅎㅎ

그래도 틈틈히 공부는 해둬야겠지..
다음엔 실제로 조금 코딩을 해봐야겠다.


http://www.boost.org/doc/libs/1_38_0/libs/concept_check/concept_check.htm
http://www.boost.org/community/generic_programming.html#concept

추가.
C++ 다음 확장에서 컨셉을 언어레벨에서 지원하는구만.
그럼 굳이 이런 매크로질을 공부할 의미는 없지.
이거 완존 뻘짓했네.
http://www.generic-programming.org/languages/conceptcpp/specification/
참고






댓글 없음: