기본 콘텐츠로 건너뛰기

C++11이 많은 라이브러리와 프레임워크를 사살하네...

요즘 C++11 표준을 보며, "C++11이 많은 라이브러리와 프레임워크를 사살하네"라는 생각을 하게 된다. 그만큼 많은 부분을 흡수한 표준이란 생각이다.

흡수한 것을 생각하기 앞서 C++ 역사를 살포시 들춰보자면...
(참조: http://www.cplusplus.com/info/history/ )

  • 1979년 Stroustrup 아저씨가 Simula 67 언어를 학위 과정에 다루면서, OOP에 감명 받아 C 서브셋 언어로 Class를 넣는 시도를 했다고 한다. 그래서 클래스, 기본상속, 인라인, 함수기본값 등을 골자로 첫타를 끊어서 만들어진 컴파일러 이름이 Cfront이며, C++의 초기 모델이라나...
  • 1983년 Stroustrup 아저씨가 고려했던 가상함수, 함수오버로딩, 레퍼런스, 한줄코멘트(//) 등을 골자로 C++이라는 언어를 만들었다.
  • 1985년 Stroustrup 아저씨가 "The C++ Programming Language" 책을 발간하면서, 첫 C++ 위원회를 구성한다. 아직 표준은 없던 터라, 아저씨가 만든 책이 유일한 레퍼런스라고...
  • 1989년 protected/static 클래스 멤버와 다중상속을 골자로 작은 업데이트를 한다.
  • 1990년 "The Annotated C++ Reference Manual" 책을 발간한다. 또한 볼랜드에서 Turbo C++ 컴파일러를 세상에 내놓았다. 이 컴파일러 세트에는 후에 C++ 언어에 막대한 영향을 준 라이브러리를 포함하고 있었다.
  • 1998년 드디어 위원회는 C++98이라고 잘 알려진 C++ ISO/IEC 14882:1998 표준을 만든다. 이때 1979년에 생각만 했던 템플릿을 정의하고, 이에 따른 STL을 정의하였다. (덕분에 많은 후루꾸레머들이 자료구조와 알고리즘을 매번 다시 구현하는 일이 획기적으로 줄었지...)
  • 2003년 마지막 표준으로부터 5년...인가... 그동안 리포팅한 다양한 언어적 버그를 수정한 마이너급 표준 C++03이 세상에 나온다.
  • 2005년 TR1으로 부른 테크니컬 리포트 원에는 앞으로 C++에 들어갈 여러 라이브러리를 구현하였다. 뭐랄까... 베타테스트 같은 느낌이랄까. 그래서 표준 별명도 있었는데, 200X년에 발표할 것을 염두하고 C++0X라고 했다. 그러나 그 이후 안타깝게도 긴 암흑기...
  • 2011년 1998 표준이 나온지 13년- C++03 마이너 표준으로부터 5년! -만에 드디어 위원회는 C++11(ISO/IEC 14882:2011)을 세상에 내놓는다. 이때 휘황찬란한 C++ 라이브러리인 Boost 프로젝트에 영향을 많이 받았다고 한다. 그동안 쌓여 있던 똥(?)을 한 번에 쌌는지라 바뀐 것도 많다.
써보니 간단히가 아니네...

암튼 C++11에서 추가한 기능이, 엄청나다.
(참조: http://ko.wikipedia.org/wiki/C++11)

일단 Boost 프로젝트에 있던 기능을 엄청나게 수용하면서, C++03에서 갈증을 해소해준 Boost 라이브러리를 이제는 사용할 이유가 적어졌다. (아주 필요 없진 않으니까)

또한 현대 Java/C#, PHP/Ruby 등 언어가 제공하는 방대한 표준라이브러리가 있어 따로 라이브러리를 구현할 필요 없이 표준만으로도 상업목적에 맞는 개발을 할 수 있지만, C++03에는 이러한 점이 매우 부족했다. (C++11에 DB관련이 아직은 부족하지만) 또한 그동안 암흑기 동안 이런 점이 부족해서인지 각종 라이브러리와 프레임워크가 난립했고, 하는 일도 비슷했다.

예를 몇가지 들어보자.

스레드 지원 라이브러리는 단순히 스레드만 만드는 것이 아니라 각종 잠금(lock)과 조건변수(condition variable), TLS(thread local storage), 스케쥴 등 많은 내용을 포함해야하며, OS에 따라 달리 구현해야한다. 그러나 C++11은 위 내용을 모두 포함하고 있으며, 제법 잘 만들었다. 딱히 다른 스레드 라이브러리를 써야할 이유가 없으며, OS를 크게 고려하지 않아도 좋다.

아예 존재하지 않았던 정규식도 표준 라이브러리로 지원한다. 사용은 UN*X에서 제공하던 regex와 다를 바가 없지만, 그래도 표준으로 지원하므로 따로 라이브러리를 구현하지 않아도 사용할 수 있다.

또한 더 많은 알고리즘을 추가하였고, 템플릿 문법확장으로 bind1st, bind2nd 같은 걸 bind로 통합하고 제약이 많이 풀려 기존 알고리즘 라이브러리를 좀더 쉽게 이용할 수 있다!!

역시나 엄청난 수학함수를 추가하였지만, 내가 잘 쓰지 않으니 가볍게 넘어가고~

의사난수도 기존에 rand()%X로 쓰던 걸, 제대로 감싸서 만들었다.

그외 TR처럼 TS(Technical Specification)가 있으며, 여기에는 POSIX에서 지원하던 다양한 기술을 접할 수 있다. 이들은 TR처럼 별 이슈가 없으면 상당 수 C++14 표준으로 올라갈 예정이다. 파일시스템, 메모리관리, 병행처리, 네트워킹(소켓!) 그리고 말도 많고 탈도 많은 컨셉이 이곳에 옹기종기 몸집을 키우고 있다.

덕분에 CPPTL이나 GNOME/QT 프레임워크 등 무수한 라이브러리들이 힘을 잃어갈 것이 분명하다. 물론 당분간은 API를 유지하면서 독자구현한 라이브러리를 C++11/14의 것을 래핑하는 수준이겠지만, 앞으로는 Java/C#처럼 많은 부분에서 프로그래머가 표준 안에서 추가 라이브러리 없이, 환경을 고려하는 부담을 줄이고 처리할 수 있는 언어로 발전하길 기대한다. 핡!!!!

댓글

이 블로그의 인기 게시물

Bash Array, Map 정리

Bash에서 Array, Map에 대한 정리. (매번 찾기 귀찮) 찾아보진 않았지만, Bash에서 Array든 Map이든 동일하게 Map(C++에서 Unordered Map)으로 동작하는 것 같다. 왜냐하면, Array의 Index가 연속하지 않아도 동작한다. 그저 Key가 0 이상의 정수인 Map이랑 비슷하게 동작한다. 예) 1, 2, 3, 9, 10 Array # 생성 declare -a empty_array declare -a ar=(haha hoho baba "long string haha hoho") # 접근 echo "ar[0]=${ar[0]}" echo "all as array=${ar[@]}" # 큰따옴표 안에서 각 원소를 따로따로 전달한다. echo "all as one=${ar[*]}" # 큰따옴표 안에서 각 원소를 문자열 하나로 합쳐 전달한다. echo "indexes=${!ar[@]}" echo "indexes=${!ar[*]}" echo "length=${#ar[@]}" echo "length=${#ar[*]}" echo "last=${ar[-1]}" echo "last=${ar[@]: -1}" # 콜론 뒤에 빈 칸이 꼭 필요하다. 옛 방식 # 현재 상황 declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho") ar[100]=hello # 인덱스를 건너 뛰어도 동작한다. declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]=&

설치한 패키지에서 RPM 추출하기

오래된 패키지를 관리할 저장소가 없어졌고, 기존 패키지로 다른 서버를 세팅해야할 일이 생겼다면 RPM의 리패키지 기능을 이용해보자. $ rpm -e --repackage [PACKAGE_NAME] 위와 같이 리패키지하면, /var/spool/repackage/ 에 생성한 RPM파일이 있다. :-)