윈도우 프로그래밍은 꼭 정품 비주얼 스튜디오를 써야 하나?

http://www.visualstudio.com/ko-kr/products/visual-studio-express-vs

비주얼 스튜디오 익스프레스를 MS에서 제공해 주고 있습니다. MS는 자사의 익스프레스 제품을 통해 개발할 때 자신들의 익스프레스 제품을 이용하여 자유롭게 개발을 해볼 수 있도록 지원해 주고 있죠.

근데 이게 골때립니다. 상용 비주얼 스튜디오가 상당히 비싸기 때문에 회사에서 익스프레스로 개발해서 쓰는 상황을 볼 때가 있긴 합니다. (대놓고 익스프레스로만 개발하라는 사장도 있습니다. 진짜로)

그래서… 무지하게 관련 내용을 뒤져본 적이 있습니다. 일단 결론부터 적겠습니다.

결론: 회사에서 프로그램 창작을 할 때 익스프레스 버전을 사용해도 되나, 익스프레스로 개발한 프로그램을 회사에서 상업적 용도로 배포할 수는 없다.

MS랑 상의하던가 MSDN 구독해 주세요. ㅡㅅㅡ 소규모 기업이면 아마 싸게 지원해 주는 것도 있는 걸로 알고있습니다.

그러나, 자유로운 창작을 위해 써도 된다는 건 공부할 때 써도 된다는 내용입니다. ㅇㅅㅇ 공부할 땐 라이센스 제약 덜받는 익스프레스 버전 써주세요. 그게 나중에 본인한테 피해 덜받는 방법입니다. MS는 상당히 라이센스에 민감한 기업입니다.

갑자기 뜬금없이 이 글을 왜 썼냐고 물으실텐데… 제가 예~전에 C#과 닷넷 공부할 때, 몇몇 영문 사이트에서 알려준 방법이 한국에서는 아직 들어오진 않았는데, 그 내용 보고 질문하는 사람 생길까봐서 그렇습니다.

익스프레스 버전을 받고, 그 안에 같이 설치되어 나오는 CSC(C# Compiler)를 가지고 커멘드 라인에서 컴파일해서 공부하는 방법을 써놓은 글들이 상당히 많습니다. 저게 어디까지 가냐면요… 메모장으로 코딩해서 프로그램 뚝딱 짜놓고 릴리즈 판으로 빌드까지 완전히 끝내는 방법도 나옵니다. 그걸로 멋대로 배포하는 글도 있긴 한데.. 지금은 찾기 힘들군요.

근데 중요한 건, 저건 그냥 지인들끼리 잠깐 돌리고 하는 방법으로 쓰는 것 중 하나일 뿐입니다. 아님 단순히 이렇게도 쓸 수 있다고 알려주는 용도이거나요. ㅡㅅㅡ (여러분이 찰스 페졸드 아저씨처럼 MSDN의 모든 내용을 다 머릿속에 넣어두고 있다면 그렇게 프로그래밍 해도 됩니다만 그래도 상업 배포는 안됩니다. ㅇㅅㅇ) 실제로 돈을 받고 배포할 목적이라면 비주얼 스튜디오 정품을 구하시거나 MSDN을 구독하세요.

p.s. 규링도 MSDN 구독중입니다.

CTS, CLS에 대한 부가적 설명

CTS, CLS에 대한 설명을 하긴 했습니다만 이해가 잘 안가실 겁니다.(저도 잘 안갔습니다) 그래서 관계도를 올립니다.

CTS CLS 관계도

CLS는 개발자가 짜는 프로그래밍 언어가 어떤 것이던 간에 닷넷에서 동작하기 위한 최소한의 규약을 나타내는 것입니다. 이 부분에 대해서는 MS C++, C#, VB.NET을 배울 때 공통적으로 가르치는 부분입니다. 당연히 C++, VB, C#의 순수한 언어적인 측면을 배울 때는 눈에 띄지 않는 부분입니다. 스스로 직접 윈도우 환경에서 동작하는 프로그래밍을 하다보면 하나 둘 씩 등장하는 개념이니 천천히 배우면 됩니다.

CTS는 보시면 아시겠지만 언어에 상관 없는, 즉, 닷넷 프레임워크 환경에서 제공되는 데이터 형식, 런타임 구조 등등의 환경이 정의되어 있는 구조입니다. C++로 개발을 한다 하더라도 32비트 운영체제와 64비트 운영체제에 따라 데이터 형식이 달라지는 점이나, 플랫폼에 따라 데이터 형식에 약간의 차이가 발생할 수 있는 점 등등 여러가지 차이점이 있을 수 있습니다. 실행 환경에 대한 고려는 중요한 겁니다. 그런 환경에 대한 정의를 하고 있기 때문에 상당히 중요한 내용을 가지고 있는 것이죠. (프로그래밍을 시작하신 분들이나 일반 응용 프로그램 개발 시에는 데이터 형식에 대해 깊게 따지지 않는 경우가 많아 쉽게 넘어가는 경우가 많습니다. (것보다 따지면서 개발해야 하는 환경이 특수한 환경인데… 할 줄 아는 사람 많은가? ㅡㅅㅡ))

그리고 환경이 언어에 영향을 받지 않아야 하므로 모든 언어에 공통적으로 적용하고 있습니다. 그래서 여러 언어를 지원하면서도 동일한 형식을 이용할 수 있는 것이죠. ㅇㅅㅇ

.net Framework 간단히 보기

음… 닷넷 프레임워크를 무지 간단하게 볼 수 있는 방법이 뭐 있을까 했습니다만… 마침 좋은 게 떠올랐군요.

.net Framework. 핵심 요소만 보고 넘어가죠. 주 핵심 요소는 CLR, BCL, CTS, CLS로 정리할 수 있겠습니다.

  • CLR: 닷넷 프레임워크의 핵심 주으이 핵심입니다. 코드를 실행하고 메모리를 자동 관리하며 형식의 안정성을 보장하는 등 여러 가지 실행 환경을 제공합니다.
  • BCL: 닷넷이 제공하는 여러 가지(GUI, 웹, DB연결, 보안 등등) 클래스 라이브러리입니다.
  • CTS: 닷넷의 모든 데이터 형식이 기술되어 있으며, 런타임 프로그래밍 구조가 정의되어 있는 부분이다.
  • CLS: 닷넷의 모든 언어가 지켜야 하는 형식에 대한 일련의 규약으로써, CLS 규약을 지펴 만들어진 형식이라면 어떤 닷넷 언어에서도 사용할 수 있게 됩니다. 이전에 닷넷은 여러 언어가 쓰이지만 형식이나 방법만 제대로 지킨다면 어떤 언어를 써도 상관 없다고 했습니다. 그게 이겁니다. ㅇㅂㅇ

이걸 한 큐에 정리한 것이 아래의 구조입니다.

닷넷에 대한 구조

어셈블리(Assembly)

어셈블리 하면 다들 어셈블리어랑 어셈블러가 생각날지도 모르겠군요…ㅇㅂㅇ;;;

어셈블리는 닷넷의 컴파일된 모듈로 버전 관리되는 배포의 단위입니다. 프로그램 시작 진입점(main 함수)을 가지고 있는 exe 파일과 다른 프로그램으로 시작되는 dll 확장자를 가지고 있습니다. 또 여러 파일로 이루어진 다중 파일 어셈블리와 하나의 파일로 이루어진 단일 파일 어셈블리로 나눌 수 있으며 하나의 응용 프로그램에서 사용하느냐 여러 응용 프로그램에서 사용하느냐에 따라 전용 어셈블리와 공용 어셈블리로 나눌 수 있습니다. 근데 대부분 보는 것은 단일 파일 어셈블리입니다. 이건 좀 더 나중에 다룰 수 있으면 좋겠군요.

어셈블리 구조

위의 그림이 어셈블리 구조입니다.

  • 메니페스트: 어셈블리 자체의 정보를 갖는 메타데이터. 이 어셈블리가 또 다른 어떤 어벨블리를 참조하는지부터 사진에 대한 정보를 모두 담고있다.
  • 형식 메타데이터: 어셈블리에서 사용하는 모든 형식에 대한 구체적이고 자세한 정보를 가지고 있다. 형식 메타데이터 덕분에 리플렉션 기능이 가능하다.
  • CIL 코드: Common Intermediate Language의 약자로, 모든 닷넷 언어들이 만들어 내는 중간코드이다. 이 중간코드는 실행 시 Just-In-Time(JIT)에 의해 네이티브 코드로 변환된다.

닷넨 어셈블리는 CIL 코드라는 중간 코드를 가지고 있다고 했습니다. 그럼 이 구조도 한번 봐야죠. ㅇㅅㅇ

닷넷 컴파일러 구조

위의 구조가 각각의 닷넷 언어의 컴파일러와 Jitter 컴파일러 구조를 보여주는 구조도입니다. 각 닷넨 언어의 컴파일러는 동일한 어셈블리를 만들어 냅니다. 또 이 어셈블리를 어셈블러가 사용되는 시점(실행 시간)에 단 한번(캐싱) 네이티브 코드로 변환합니다. (이 말은 즉, 동일한 논리적, 구조적으로 프로그램을 작성한다면 작성 언어에 대해 굳이 따지지 않는다는 것도 있습니다. ㅇㅅㅇ)

이 외에도 외부에서 라이브러리를 참조하는 과정이 클래스 로더에 있습니다. 주로 사용되는 클래스 라이브러리는 Base Class Library라는 이름으로 닷넷이 있고, 추가적인 라이브러리는 다른 dll을 참조합니다. ㅇㅅㅇ