비주얼 C++(Visual C++)은 마이크로소프트사에서 만든 C/C++ 컴파일러이다. 1992년 4월에 첫 버전인 1.0이 발표되었으며 꾸준한 버전업을 거쳐 2005년 현재 7.1버전(비주얼 스튜디오 .Net 2003이라고 부른다)까지 발표되어 있다. 98년도에 발표된 6.0 버전이 가장 성공적인 버전으로 평가되고 있으며 아직까지도 6.0으로 개발하는 개발사가 많이 있다. 상위 버전이 발표되기는 했지만 목표 타겟이 달라 윈도우즈용 개발툴로 비주얼 C++ 6.0은 실질적인 마지막 컴파일러(엔딩 버전)가 되었으며 과거 터보 C 2.0이 누렸던 지위를 승계할 것으로 예상된다.

비주얼 C++은 단순한 C/C++ 컴파일러가 아니라 여러 가지 다양한 프로젝트를 만들 수 있는 종합 개발툴이다. Win32 응용 프로그램은 물론이고 데이터 베이스 프로그램, ActiveX 컨트롤 제작, 인터넷 개발, ATL, 모바일 개발 등 최신 기술들을 전부 구현해 볼 수 있는 다재 다능한 개발툴이다. 특히 그 중에도 비주얼 C++의 핵심이라고 할 수 있는 MFC(Microsoft Foundation Class)라는 라이브러리는 윈도우즈용 응용 프로그램을 만드는 표준 기술로 각광받고 있다.

비주얼 C++의 위저드를 사용하면 코드를 빠르고 쉽게 작성할 수 있다. AppWizard는 몇 가지 질문에 답만 하면 프레임워크라는 골격 코드를 생성해 주며 이 골격에 원하는 코드를 추가하기만 하면 프로그램이 완성된다. C++ 클래스를 관리하는 클래스 위저드는 새로운 멤버를 추가하기도 하고 가상 함수를 재정의하는 코드를 대신 작성해 주기도 한다.

하지만 지금 C 문법을 배우기 시작한 초보자에게 이런 막강한 기능들은 실습에 오히려 방해만 될 것이다. MFC가 아무리 좋아도 C/C++ 문법을 제대로 모르는 상황에서는 무용지물이나 마찬가지이며 AppWizard가 만들어 주는 프레임워크도 암호문처럼 보일 것이다. 문법을 배우는동안 우리는 비주얼 C++의 기능 중 극히 일부만을 사용하게 된다. 당분간은 MFC나 ATL같은 고급 개발 방법은 무시하고 문법에만 치중하도록 하자.

비주얼 C++도 발표 시기에 따라 여러 가지 버전이 있는데 버전이 높을수록 기능이 더 많아지는 것은 당연한 일이다. 2006년 초에 비주얼 C++ 8.0이 발표될 예정이기는 하나 아직 베타이므로 여기서는 참조하지 않기로 한다. 이 책은 최신 버전인 비주얼 C++ 7.1을 기준으로 하되 이전 버전도 거의 비슷하므로 실습에 크게 불편하지는 않다. 오히려 7.1은 속도가 느려 더 불편한 면이 있다. 많이 사용되는 6.0버전으로 실습을 진행해도 큰 무리는 없되 최신 C++ 문법 부분에서는 조금 달라지는 부분이 있을 수도 있다. 이런 부분에 대해서는 본문에서 별도로 설명하기로 한다.

학습을 위한 기본 툴로 비주얼 C++을 선정했으므로 실습을 해 보려면 일단 이 프로그램을 자신의 시스템에 설치해야 한다. 비주얼 C++은 용량이 굉장히 크기 때문에 CD-ROM이나 DVD롬의 형태로 배포된다. 다른 일반적인 응용 프로그램과 마찬가지로 루트 디렉토리에 있는 Setup.exe를 실행하면 설치가 시작된다.

비주얼 C++의 설치에 대한 설명을 별도로 하지 않으므로 설치는 알아서 하기 바란다. 왜냐하면 사용하는 운영체제나 선택한 컴파일러 버전에 따라 설치 절차가 다양해서 일일이 설치 과정을 설명한다는 것이 번거롭고 또한 설치 방법 자체가 워낙 쉬워서 별다른 설명이 필요치 않다고 생각되기 때문이다.

만약 스스로 설치할 능력이 안된다면 주변 사람에게 부탁을 해서라도 꼭 설치하도록 하자. 비주얼 C++ 6.0의 경우는 초기 버전에 여러 가지 버그가 있으므로 서비스 팩 6를 같이 설치하는 것이 좋다. 서비스 팩을 설치하지 않으면 일부 예제가 컴파일되지 않으므로 학습에 큰 장애가 된다. 컴파일러없이 책만 읽어서 C/C++ 문법을 배운다는 것은 너무 너무 어려운 일이다. 문법을 제대로 배우려면 반드시 실습을 통해 배운 문법을 확인해 보고 또 스스로 예제를 만들어 봐야 한다.

Posted by 테티스
,

C/C++ 컴파일러에는 많은 종류가 있다. 라면에 신라면, 진라면, 너구리 등등이 있는 것처럼 기업들은 수요가 있으면 만들게 되어 있다. 지금까지 발표된 컴파일러만 해도 수백종이 훨씬 더 되며 이 중 몇 가지는 고도로 발전되어 있어 성능도 좋고 사용하기도 편리하다. 사실 C/C++만큼 컴파일러가 잘 만들어져 있는 언어도 드문데 이것도 C/C++의 장점 중 하나이다. 컴파일러의 성능도 언어의 스팩만큼이나 중요하기 때문이다. Ada나 SmallTalk도 좋은 언어임은 분명하지만 컴파일러의 지원이 미약하다.

컴파일러가 생성해 내는 기계어는 특정 CPU와 운영체제에서만 동작하기 때문에 컴파일러는 본질적으로 플랫폼에 종속적이다. 매킨토시용 컴파일러로 인텔 계열 CPU에서 동작하는 프로그램을 작성할 수 없으며 도스용 컴파일러로 윈도우즈용 프로그램을 작성할 수 없다. 운영체제별로 C/C++ 컴파일러를 분류해 보면 다음과 같다. 

운영체제

컴파일러

도스용

터보 C, 볼랜드 C++, MS C

윈도우즈용

비주얼 C++, 볼랜드 C++, LCC, 왓콤 C, Dev-C++

유닉스용

gcc

같은 컴파일러라도 버전에 따라 기능과 사용 방법, 지원하는 문법 수준이 다르므로 사용할 컴파일러를 선택하는 것은 아주 어려운 일이다. 이중 일부는 무료로 사용할 수 있는 공개용인 것도 있지만 대부분의 컴파일러는 돈을 주고 구입해야 하는 상용 프로그램이다. 물론 이것 저것 다 설치해 놓고 상황에 따라 컴파일러를 바꿔 가며 쓸 수도 있겠지만 지금 막 문법을 배우기 시작한 사람들은 여러 가지 컴파일러를 동시에 사용하기 어려울 것이다.

전통적으로 C 입문용으로 가장 많이 사용된 컴파일러는 볼랜드사의 터보 C 2.0인데 발표된지 20년 가까이 되어 가지만 교육용으로 사용하기에는 아직까지도 큰 무리가 없다. 통합 개발 환경을 지원하며 도스 환경에서 그래픽까지 가능하기 때문이다. 아직도 터보 C2.0을 기준으로 하고 있는 문법서들이 많으며 일선 학원에서도 많이 사용하고 있다. 아마 앞으로도 최소한 10년간은 더 사용될 것이다. 그러나 C++ 이전의 컴파일러이기 때문에 C 문법만 지원하며 C++은 지원하지 않는다.

그래서 C++ 문법까지 고려했을 때 볼랜드 C++ 3.1이 가장 가볍고 교육용으로 적합한 컴파일러이다. 이 버전은 도스와 윈도우즈를 동시에 지원하므로 프로그래밍 실습은 물론이고 실무에 사용할 수도 있다. 그러나 아쉽게도 16비트용 컴파일러이기 때문에 현재 상황과는 많은 부분이 일치하지 않는 문제가 있다. 볼랜드 C++ 4.0이상은 32비트 컴파일러이기는 하지만 현재는 사용하는 사람이 거의 없는 실정이다.

실무에서 가장 많이 사용되는 컴파일러는 마이크로소프트사의 비주얼 C++이다. 윈도우즈 전용 컴파일러이므로 윈도우즈용 프로그램을 가장 잘 생성하며 작업 환경이 쾌적하다. 코드를 자동으로 생성해 주는 위저드 기능과 MSDN이라는 방대한 도움말, 프로젝트 관리 기능 등 개발자를 위한 많은 지원들이 포함되어 있다.

사용자 삽입 이미지
그러나 비주얼 C++은 실무용 컴파일러이기 때문에 교육용으로는 다소 적합하지 못한 면들이 많다. 우선 생성할 수 있는 프로젝트의 종류가 너무 다양하고 복잡하기 때문에 초보자에게 혼란을 줄 수 있는 소지가 많으며 반드시 프로젝트를 구성해야 하기 때문에 많은 예제를 만들어 테스트 해 보기에 번거롭다. 또한 상용이기 때문에 반드시 돈을 주고 구입해야 하며 덩치도 지나치게 커서 실습용으로 부담없이 설치해 볼만한 정도가 아니다.

비주얼 C++은 윈도우즈 전용의 컴파일러이기 때문에 도스에 대한 지원이 없다. 대신 도스와 비슷한(비슷한 것이지 같은 것은 아니다) 콘솔 환경을 지원하는데 콘솔에서는 기본적인 입출력만 해 볼 수 있으며 도스에 비해 화면 제어 능력이 취약하다. 예를 들어 화면을 지우는 clrscr, 커서를 옮기는 gotoxy 함수 등이 없으며 출력할 텍스트의 색상이나 속성을 바꿀 수가 없다. 또한 콘솔 환경은 그래픽도 지원하지 않기 때문에 실습의 재미도 없고 예제도 빈약할 수 밖에 없다.

비주얼 C++은 실제 프로젝트를 할 때는 최상의 선택이 될 수 있지만 C/C++ 문법을 처음 배울 때는 기능이 너무 많아 다소 부담스러운 컴파일러이다. 그래서 비주얼 C++을 입문용 컴파일러 채택한 문법서는 거의 없는 편이며 아직까지도 터보 C 2.0이 교육용 컴파일러로 사랑받고 있는 것이다. 문법을 배울 때는 성능이나 효율보다는 설치의 간편성과 실습의 편의성이 더 중요하기 때문이다.

C/C++을 공부해 보기로 마음먹었다면 어떤 컴파일러를 사용할 것인지는 자신의 상황에 따라 스스로 결정해야 한다. 리눅스 환경을 사용하고 있다면 gcc를 사용해야 할 것이고 간단하게 실습해 보고 싶다면 터보 C 2.0을 사용할 수도 있다. 본문에서 모든 컴파일러에 대해 다 설명할 수는 없기 때문에 한가지 컴파일러를 선택할 수밖에 없다. 이 책은 비주얼 C++을 기준으로 하는데 실습 컴파일러를 선정하기 위해 엄청난 고민을 했고 여러 사람들로부터 자문을 받아야 할만큼 어려운 결정이었다.

개발툴 자체가 조금 복잡하지만 32비트가 일반화된 상황이니만큼 아무래도 32비트 컴파일러로 시작하는 것이 좋을 것 같다. 어차피 실무를 할 때는 비주얼 C++을 사용해야 하므로 개발툴에 대한 사용법도 같이 공부할 수밖에 없다. 터보 C 2.0도 교육용으로 나쁘지 않지만 너무 오래되어서 현재 상황과 맞지 않는 점이 많다. 정수형의 크기나 세그먼트/오프셋 구조, 메모리 모델 따위는 이제 몰라도 된다. 그래서 이 책은 과감하게 32비트 컴파일러인 비주얼 C++을 기준으로 작성했다.

그러나 C/C++ 문법이 특별한 컴파일러를 요구하는 것은 아니므로 다른 컴파일러를 사용하는 것도 가능은 하다. 다만 고급 문법 부분에서는 컴파일되지 않는 경우도 가끔 있을 수 있고 컴파일러 구현상의 문제로 인해 결과가 달라지는 경우도 있다. 이미 익숙한 컴파일러가 있다면 계속 사용하되 완전히 처음 입문하는 사람이라면 가급적 이 책이 선정한 기준 컴파일러를 사용하기 바란다.

Posted by 테티스
,

프로그램을 짠다는 것은 사용하는 언어의 문법에 맞게 명령들을 작성하는 것이다. 가령 1+2를 계산하여 결과를 출력하는 프로그램을 작성한다면 "1+2를 계산하라", "출력하라"라는 명령을 작성해서 파일로 저장해야 한다. 이렇게 언어의 문법에 맞게 명령들을 기술한 파일을 원시 파일(Source File)이라고 하며 원문 그대로 소스라고 부른다.

소스는 고급 언어로 작성되어 있기 때문에 컴퓨터가 바로 이해할 수 없으며 따라서 실행할 수도 없다. 컴퓨터는 오로지 이진수로 된 기계어밖에 알아듣지 못한다. 그래서 소스를 컴퓨터가 이해할 수 있는 기계어 코드로 번역해야 하는데 이 동작을 컴파일(Compile)이라고 한다. 컴파일이란 소스에 작성된 명령들을 컴퓨터 언어인 기계어로 번역하는 작업이며 컴파일을 하는 프로그램을 컴파일러(Compiler)라고 부른다.

컴파일러는 소스 파일에 작성된 고급 언어 명령을 해석하여 기계어 코드로 바꾸고 그 결과를 목적 파일(Object File)에 써 넣는다. 즉 컴파일러는 소스 파일을 목적 파일로 바꾸는 프로그램이다. 목적 파일은 소스의 명령들을 번역한 기계어 코드를 가진 파일이되 이 파일도 곧바로 실행할 수 없다. 왜냐하면 프로그램은 기계어 코드외에도 운영체제가 요구하는 코드를 추가로 가져야 하기 때문이다.

목적 파일을 실행 파일로 바꾸기 위해서는 이 실행 파일이 운영체제의 요건에 맞도록 형태를 조금 바꾸고 스타트업(StartUp)이라는 추가 코드를 가져야 한다. 목적 파일에 이런 처리를 하여 실행 파일로 만드는 동작을 링크(Link)라고 하며 링크를 해 주는 프로그램을 링커(Linker)라고 부른다. 하나의 프로그램이 작성되는 과정은 다음과 같이 그릴 수 있다.

사용자 삽입 이미지
소스 파일은 컴파일러에 의해 컴파일되어 목적 파일이 되며 목적 파일은 링커에 의해 링크되어 최종적으로 실행 가능한 실행 파일이 된다. 이렇게 컴파일과 링크를 통해 실행 파일을 만드는 과정을 빌드(Build)라고 한다. 소스 파일을 번역하여 곧바로 실행 파일을 만들지 않고 목적 파일이라는 중간 과정을 거치는 이유는 여러 개의 소스를 합쳐 하나의 실행 파일을 만들어낼 수 있어야 하기 때문이다. 하나의 소스에 필요한 모든 명령을 다 기술할 수 없으므로 소스를 여러 개 작성하고 이것을 모두 연결하면 완전한 실행 파일 하나가 나온다.
사용자 삽입 이미지
A.cpp를 컴파일하여 A.obj를 만들고 B.cpp, C.cpp는 각각 B.obj, C.obj를 만든다. 각 목적 파일은 소스 파일의 명령을 번역한 기계어 코드를 가지고 있을 것이다. 이렇게 개별 소스를 컴파일해서 만들어진 세 개의 목적 파일을 연결하면 하나의 실행 파일이 되며 링크 단계에서 이미 만들어진 라이브러리도 결합된다. 이런 식으로 소스를 여러 개 작성해서 최종적으로 링크하는 방식을 분할 컴파일이라고 하는데 여러 사람이 같이 작업하거나 기능별로 모듈을 개발할 때 일반적으로 사용하는 방법이다.

목적 파일은 개발 언어에 독립적인 형식을 가지고 있기 때문에 한 프로그램을 작성하는 데 여러 개의 언어를 같이 사용할 수 있다. 예를 들어 위 그림에서 A.cpp는 C로 작성하고 B.cpp는 파스칼로, C.cpp는 베이직으로 작성했다고 하자. 이때 각 언어의 컴파일러는 자신의 소스를 해석하여 목적 파일을 만들 것이고 이렇게 만들어진 목적 파일은 링커에 의해 연결되어 하나의 완성된 실행 파일이 될 수 있는 것이다. 이런 식으로 여러 개의 언어를 같이 사용하는 방식을 혼합 프로그래밍이라고 하는데 가능은 하지만 번거로운 문제가 많기 때문에 그리 일반적이지는 않다.

하나의 실행 파일을 만들려면 편집기로 명령들을 기술하여 소스를 만들고 이 소스를 컴파일하여 목적 파일로 만든 후 다시 링크 과정을 거쳐야 한다. 불과 얼마전까지만 해도 프로그래머는 이 번거로운 과정을 거쳐야만 실행 파일을 만들 수 있었는데 여러 단계를 거쳐야 하기 때문에 무척 불편했다. 아직도 일부 리눅스, 유닉스 환경에서는 이 방법대로 개발한다.

최근의 개발툴들은 자체에 편집기, 컴파일러, 링커를 모두 내장하고 있기 때문에 한 번에 소스를 실행 파일로 바꿀 수 있다. 뿐만 아니라 디버거, 프로파일러, 리소스 편집기 등 개발에 필요한 편의 기능까지 같이 제공하는데 이런 환경을 통합 개발 환경(IDE, Integrated Development Environment)이라고 부른다. 쉽게 말해서 종합 선물 세트쯤 된다. 개발 환경 내에서 편집, 개발, 디버깅, 최적화까지 다 할 수 있기 때문에 무척 편리하며 생산성 향상에 크게 기여하고 있다.

용어의 원래 뜻만으로 본다면 컴파일러란 소스 파일을 목적 파일로 변환하는 프로그램을 의미하는데 요즘은 통합 개발 환경이 워낙 일반화되었기 때문에 개발 환경 자체를 컴파일러라고 부른다. 문서 작업시에 워드 프로세서를 사용하고 계산을 할 때 스프레드 쉬트 프로그램을 쓰는 것처럼 개발 작업을 할 때는 주로 컴파일러를 사용한다.

Posted by 테티스
,