object님 블로그에서 VC++6을 쓰지 말아야하는 이유 라는 글을 올려주셨는데, VC2008에서도 비슷하게 적용되는 부분이 있고 마침 관련된 세미나도 한번 진행 해서 한번 작성해 봤다.
1. 보다 안전한 프로그래밍
SCL, CRL등 라이브러리의 거의 모든 함수와 API에 SAL이 적용이 되었다.
이번에 컴파일 옵션중에 /DYNAMICBASE와 /NXCOMPACT 라는 보안을 위한 컴파일 옵션이다. /DYNAMICBASE는 ASLR(Address Space Layout Randomization) 기능을 추가해 주는 컴파일 옵션인데, 재부팅시 마다 실행파일 인스턴스가 생성될 때 DLL같은 라이브러리의 적재위치, 실행코드 위치 라든지, 스택과 힙의 시작 위치를 랜덤화 시켜주는 기능을 한다. 오피스 2007을 컴파일 할때,이 ASLR을 지원하는 컴파일 옵션이 부여된 채 컴파일이 되었다.
/NXCOMPACT는 DEP(Data Execution Prevention) 기능을 추가해 주는 컴파일 옵션인데, XP sp2와 Windows2003컴파일 할 때 적용이 되었다.
코드의 수행은 메모리에 바이트 뭉치를 가져와서 op code를 본 다음 indirect인지 direct인지 보고 실행하는 단순한 구조를 가지고 있다. 컴파일을 하게 되면 코드영역, 데이터 영역등으로 나누어 지는데, 여기서 문제는 잘못된 주소로 접근했을 때 그 바이트 뭉치가 데이터인지, 코드인지 PC가 가리키고 있는 주소 범위 말고는 판단할 수 없다는 것이다. 데이터 영역에 문제가 있는 코드를 넣어 놓고, PC를 그곳 주소로 변경만 시키면 해커들이 문제 있는 코드를 실행시킬 수 있다. DEP는 메모리 페이지가 스택이건 힙이건 간에 쓰기 상태가 가능하면 그 페이지의 코드 실행을 막아주는 기술이다.
UAC 지원을 위해서 Manifest를 UI상에서 제어할 수 있고 자동으로 만들어 주기 대문에 더 이상 UAC관련 Manifest를 손으로 작성하지 않아도 된다. Manifest를 손으로 작성할 때 assembly 부분을 잘못 작성하면 XP sp2에서는 잘 돌아가지만 XP에서는Manifest를 파싱할 때 exception이 나서 프로그램이 실행되지 않는 문제가 발생하기도 하고, trustInfo부분이 잘못되면 XP sp2라도 실행에 문제를 겪게 되는데, 인터넷상에는 의외로 문제 있는 Manifest가 떠돌아 다니는 경우가 많고, 프로그래머들이 이러한Manifest를 카피해서 프로젝트에 적용하는 케이스가 많게 된다.
2. 유니코드 프로그래밍
이번에 파라미터로 멀티바이트를 넘겨주던 일부 MFC 메소드 들이 모조리 Unicode로 변경이 되었다. ( 참고 :http://blog.naver.com/drvoss/20044451698 ) 뿐만아이라 이번에 추가가된 MFC9.0의 Office, VS, IE UI의 드로잉코드가 들어 있는Visual Manager의 경우 유니코드만 지원하게 된다. Visual Manager 자체는 멀티바이트를 써도 상관없지만, 래핑하고 있는Control들의 코드가 모두 Unicode만 지원하기 때문에 새로운 MFC의 경우 Unicode만 지원한다고 해도 되겠다.
Unicode만 지원하는게 불편할 수도 있겠지만, 장점도 많이 있다. 멀티바이트를 혼용해서 쓰는 부분에는 항상 실수를 할 수 있는 여지가 있기 때문이다.
3. 보다 뛰어난 인텔리센스
인텔리 센스 부분이 많이 변경이 되었는데, VC는 NCB파일에 코드 파싱정보를 기술해 놓는다. 작은 DB파일이라고 봐도 무방한데, VS IDE는 아주 많은 스레드를 가지고 있는 멀티 스레드 애플리케이션이다. 인텔리센스 관련해서도 항상 많은 스레드가 돌고 있게 되는데, 인텔리센스용 멀티스레드에서 이 NCB파일을 접근하므로 NCB파일에 접근할 때는 간단한 locking 방법이 적용이 되어 있다. 그런데 이 locking 방법이 매우 비효율적으로 되어 있는 부분을 수정했고, NCB 파일을 제너레이트 하는 부분을 따로 스레드로 떼어 내고, 그밖에 병목현상이 있을 만한 부분을 모두 스레드로 떼어 냈다. 많은 기능들이 한 스레드에 있었던 2005에서는 인텔리센스 때문에 코드 에디팅이 멈칫 하는 현상이 발생되기도 했는데, 2008에서는 이제 멈칫 하는 현상은 절대 없을꺼라 하고, 소스 코드가 크더라도 파싱하는데 전혀 방해를 받지 않으면서, 인텔리센스가 100% cpu를 먹는 일은 절대 없도록 변경되었다.
4. TR1의 지원
이번에 BOOST의 일부 기능들이 들어있는 TR1이 SCL에 추가 되면서 Dinkumware에서 개발한 라이브러리를 VC에 가져 왔다. 다른 회사 라이브러리 가져온 건데, 기존 타회사에서 구현된 라이브러리와 차이점이 뭐냐 라고 할 수 있는데, 2005에서 STL에 적용되었던 것과 비슷하다고 보면 된다. 기존에 VC에 포함되어 있는 라이브러리들과 혼용해서 사용했을 때 최대 효과가 날 수 있도록 수정하고 /clr, /clr:pure, /W4, /Za, /Gz, /analyze 옵션에서 워닝등의 동작이 나지 않도록 수정했으며 무엇보다도 IDE의 Debugger Visualizer에 착 달라 붙는다. 2005 STL Debugging에서 컨테이너의 항목들이 원하던 대로 나오는 것에 감동했다면 2008 TR1에서 다시 한번 그 감동을 느낄 수 있을 것이다.
5. IDE 확장
Class Designer가 지원이 되는데, 인수인계 문서를 만들거나 레포트 장수 늘릴 때 아주 좋다. 간단하게 지원이 되지만, 클래스 관계라 맴버함수/변수들이 잘 나오고, 오피스나 파워포인트에 자유 자재로 복사/붙여 넣기 할 수 있다.
인텔리센스가 나오고 있을 때 컨트롤을 누르게 되면 인텔리센스창이 흐릿해 지는 효과가 들어갔다. 인텔리 센스 창이 나오면esc키로 얼른 닫아 버리는 나에게 좋은 기능이 될 수 있을지는 모르겠다.
6. 더 훌륭해진 컴파일러
/MP라는 컴파일옵션이 추가 되었는데, 병렬 빌드를 할 수 있는 옵션이다. 2005에서도 병렬 프로젝트 빌드 하는 옵션이 있었는데, Tools > Options > Project and Solutions > Build and Run > Parallel project builds에 숫자가 병렬 빌드 되는 프로젝트의 개수를 설정할 수 있는 옵션이였다. 하나의 솔루션에 두개 이상의 프로제트를 만들고 빌드를 하게 되면 빌드 output 창에 아래와 같이1과 2가 교대로 나오면서 빌드되는 모습을 볼 수 있다.
1>------ Rebuild All started: Project: p1, Configuration: Debug Win32 ------
2>------ Rebuild All started: Project: p2, Configuration: Debug Win32 ------
2>Deleting intermediate and output files for project 'p1', configuration 'Debug|Win32'
1>Deleting intermediate and output files for project 'p2', configuration 'Debug|Win32'
1>Compiling...
2>Compiling...
1>stdafx.cpp
2>stdafx.cpp
이 숫자가 의미 하는게 빌드 되는 프로젝트의 순서를 의미 하는데 1과 2가 번갈아 나오면서 같이 병렬 빌드 되는 것을 확인할 수 있다. 그런데 이 병렬프로젝트 빌드는 별로 유용하지 않는 케이스가 많은데, 서로 디펜던시가 걸려 있는 경우 병렬 빌드가 되지 않을 뿐더러, 하나의 솔루션에 일부 프로젝트에만 병렬 빌드가 되고 나머지는 순차 빌드가 되어 버리면 병렬빌드의 부하 때문에 별로 이득을 보지 못하는 경우가 많다.
/MP 옵션은 프로젝트 별로 병렬 빌드를 할 수 있게 하고, 병렬빌드시 사용할 프로세서(프로세스)의 개수를 선택할 수 있다. 예를 들어 빌드 머신에 4개의 CPU가 달려 있고, /MP3 를 했다면 3개의 CPU를 빌드에 사용하고, 빌드를 시작 하면 3개의 빌드용 프로세스가 떠서 하나의 Unit(cpp 같이..)을 가져가면서 나누어 각각 빌드가 되게 된다.
병렬 빌드 옵션과 병렬 프로젝트 빌드 옵션을 자신의 빌드 머신의 프로세스 개수에 맞추어 놓고 인크리디빌드를 사용하면 화룡점정일 것이다.
참고로 VC10에서는 MSBuild를 이용해서 분산 빌드 시스템을 만들어 주는 기능이 추가될 계획이라고 한다.
7. 더 괜찮아진 IDE
비스타가 발표 되면서 MS에서는 Vista Programming Guideline을 발표 했는데, UAC를 고려한 어플리케이션 정책을 설계 하고, UAC는 한번만 뜨게 하며, 대부분의 경우 User Mode에서 수행하게 하고 필요할 때만 관리자권한으로 실행 되게끔 해라라고 했는데 정작 비스타 위의 2005는 전혀 가이드라인과 맞지 않았다.
2005에서는 이런 Vista Programming guideline 이 잘 적용이 되었는데, User 권한에서도 잘 실행이 되고, 관리자권한의 build후 디버깅을 할 때 별도의 관리자 권한 VS 인스턴스를 띄울 것인가란 다이얼로그를 내어 준다.
8. 코드 퍼포먼스 향상
새로운 CPU Architecture들의 Instruction들을 지원을 해준다. 특히 Intel Core Architecture에 대한 지원이 강화되어서, 재컴파일 하는 것 만으로도 요즘 일반화 되어 있는 Core Architecture 환경에서 2005에서 컴파일 한것보다 퍼포먼스가 좋게 나오게 할 수 있다. __cpuid 함수가 업그레이드 되었는데, 최신 프로세서를 지원할 분 아니라 로직적인 부분도 개선이 되었다고 한다.
그밖에 멀티 스레드 환경의 디버깅을 할 수 있는 다양한 기능들이 추가 되었다.
9. MFC/ATL의 변화
Office, VS, IE를 지원하는 새로운 UI들과 라인별로 색깔 들어가는 리스트컨트롤, 일반 버튼에 속성 하나 더 주고 만들 수 있는 스플릿 버튼, 링크 컨트롤, Shell Tree, 그밖에 비스타에서 추가된 컨트롤들을 모두 지원하고 MFC에 추가 되었으며, 150개가 넘는 메소드와 수십개의 새로운 클래스가 추가 되었다. 그리고 ATL Server가 CodePlex로 이관 릴리즈 되어서 atl용 유틸리티나 인코딩,디코딩하는 여러 함수들을 사용할 수 없게 되었고, 정식 지원해 주지 않고 설치도 되지 않는다.
아, 자고 일어나서 바로 장문의 글은 힘들구나.. 다시 위로 올라가서 읽어 보기 싫다.ㅠ_ㅠ
[출처] VC2008에서 변경된 기능|작성자 샤방샤방
'개발지식창고 > Tip&IT용어' 카테고리의 다른 글
CString 개행문자 인식하기위한 팁 (0) | 2011.03.14 |
---|---|
윈도우7 최적의 성능을 위해 설치후 해야할 3가지 (0) | 2010.11.28 |
주변 분들이 잘 사용하지 않는 몇 가지 단축키 (0) | 2010.11.07 |
C/C++/MFC FAQ 모음 (0) | 2010.09.05 |
Visual Studio 2008 단축키 (포스터 파일) (0) | 2010.08.26 |