2013. 5. 23. 15:30 Windows8/WPF

windows 8 app 개발하려면 어떤 언어와 Library를 사용해야 하나?

왠만히 개발에 관심있는 분이라면 windows 8의 metro style app 이야기를 한번 정도는 들어 보셨을 것 같습니다.
C/C++ 를 사용하거나 C#이나 VB와 같은 .NET Language 혹은 Javascript로 app을 개발할 수도 있습니다.

다양한 App을 개발하려면 기본적으로 Platform이 다양한 기능을 제공해 주어야 함은 물론이고, 그에 맞는 다양한 API를 사용할 수 있어야 할 겁니다. 게다가 각각의 언어들이 windows 8 app을 개발하기 위해서 새로 만들어진 언어나 library가 아니기 때문에 기존에 익숙한 library를 얼마나 많이 활용할 수 있는가는 개발자들의 학습 시간에 큰 영향을 주기 마련이지요.

windows 8 app을 개발하기 위해서 어떤 library를 사용할 수 있는지에 대해서 구체적으로 살펴보고자 합니다.

어떤 언어를 사용하던지간에 windows 8의 metro platform이 가지는 특성을 사용해야 하기 때문에 전용의 API가 제공되어야 합니다. 보통의 경우 개발 언어별로 API를 제공하는 것이 일반적이고, 그러지 않기 위해서 COM과 같은 Binary 규격으로 API를 제공하기도 합니다만 windows 8 metro platform용 API는 단일의 binary로 C/C++, C#/VB, Javas-ript 모두에서 사용할 수 있는 방식으로 만들어졌습니다. 정말 이정도면 삽질도 보통 삽질이 아니었을겁니다. 
이런 이질적인 3개의 언어군(native/managed/script)에서 사용할 수 있는 공통의 binary라니요??? 하지만 마이크로소프트는 Modem COM 이라는 새로운 규격 하에 3개의 언어에서 쓸 수 있도록 단일의 binary를 진짜로 만들었습니다. 그리고 각 언어의 특성과 binary 사이의 간극을 메우기 위해서 language 별 projection layer를 간단히 걸쳐 놓았습니다.
만들다 보니 아무래도 script language와 library 사이에 간극이 가장 컷던 모양입니다. 여러가지 이유로 그럴 수 밖에 없었는데 가장 큰 이유는 아무래도 공통의 binary(library)가 C/C++로 작성되었기 때문이라고 강하게 추측 해봅니다.

이 binary의 이름이 바로 "Windows Runtime" 입니다. 그래서 어떤 언어를 사용하던 Windows Runtime을 사용하여야만 windows 8 app을 개발할 수가 있습니다.

이게 언어별로 구분해서 살펴보겠습니다.

1. C/C++
먼저 C/C++입니다. C/C++은 visual c runtime을 포함하여 win32와 모든 com api가 사용가능 library군에 포함됩니다. 그런데 windows 8 app은 새로운 platform이기도 하거니와 상당히 제약이 많은 platform이기 때문에 모든 api를 다 사용할 수는 없습니다. 그래서 windows 8 app을 개발할 때 사용할 수 있는 api와 사용할 수 없는 app을 구분짓고 header 파일 내를 2개의 영역으로 구분지어 두었습니다.

#pragma region Application Family
이 영역에 선언되어 있는 API들은 windows 8 app과 dekstop app 모두에서 사용할 수 있습니다.
#pragma region Desktop Family
이 영역에 선언되어 있는 API들은 desktop app에서만 사용할 수 있습니다.

Visual Studio를 사용하면 Windows 8 app을 개발할 때에는 #pragma region Application Family 이하에 정의된 API 들만 사용가능하도록 해주고, desktop app을 개발할 때에는 둘 다를 보여주는 식으로 개발자를 도와줍니다.

C/C++에서만 사용할 수 있는 또 하나의 library가 있는데요, Platform이라는 namespace 안에 모조리 구현되어 있고, exception이나 type과 관련되어 있는 내용이 많이 포함되어 있습니다.
Platform namespace에 대해 궁금하신 분이라면 아래 링크를 살펴보시면 되겠습니다.

정리하면 사용할 수 있는 API 군은 크게 3가지로 요약될 수 있겠습니다.
Windows API: Windows Runtime
http://msdn.microsoft.com/en-us/library/windows/apps/br211377.aspx
Win32 and COM API 중 사용할 수 있도록 허용된 API들
http://msdn.microsoft.com/en-us/library/windows/apps/br205757.aspx
Platform namespace 내에 정의된 class와 method 들
http://msdn.microsoft.com/en-us/library/windows/apps/hh710417.aspx

그리고 약간 불편한 사실 두 가지
단일의 runtime을 구성하기 위해서는 언어별로 약간의 고통들을 감수 해야 했습니다. C/C++도 상당한 고통을 치러야 했는데요, 첫번째로 API 사용의 복잡성에 직면하게 되었습니다. 마이크로소프트는 이러한 복잡성을 해결하기 위한 방책으로 CX(Component Extension)이라는 확장 규격을 언어에 추가하였습니다. 따라서 windows 8 app을 C/C++로 개발하려면 가능한 CX 확장 규격을 사용하는 것이 정신 건강에 좋습니다. 이를 기존의 C++과 구분하기 위해서 C++/CX라고 합니다.

나머지 하나는 일반적인 C/C++ 개발 idiom이나 style이 아닌 windows runtime을 사용하기 위한 개발 style을 사용해야 한다는 것입니다. 이는 마치 C/C++을 사용하지만 표현의 방식이 다른 언어인냥 느껴지기도 합니다.
아주 간단한 예를 들어보면 Windows::ApplicationModel::Resources::Management  식의 namespace를 사용하는 등이죠.
이는 C/C++의 언어규격에는 정확히 맞을지 모르나 기존의 C/C++ 개발자들이 즐겨쓰던 방식은 아님에 분명합니다.

2. C#/VB
사실 C#/VB 언어를 사용하던 개발자라면 windows 8 app 개발시에 가장 빠르게 app을 개발할 수 있습니다. Windows Runtime를 사용해야 하는 것은 당연합니다. 여기에 더하여 .NET의 BCL(Base Class Library)중 windows 8 app 개발에 사용할 수 있는 Type들만을 모아서 ".NET for Metro style apps" 라는 library를 만들었습니다. 이름이 이렇다 보니 영문을 읽다 보면 이것이 Library의 이름인지 아니면 매트로 스타일 앱을 위한 .NET이라고 해석되어야 하는 것인지 혼돈 될 수 있는데, 절대로 혼돈하면 안됩니다. BCL 중 windows 8 apps을 개발할 때 사용할 수 있는 subset 만을 모아둔 API군의 이름이 ".NET APIs for Metro style apps"입니다.

Windows API: Windows Runtime
http://msdn.microsoft.com/en-us/library/windows/apps/br211377.aspx
.NET APIs for Metro style apps
http://msdn.microsoft.com/en-us/library/windows/apps/br230232.aspx

3. Javascript
Javascript는 앞서 2개의 언어와는 상당히 간극이 큰 언어임에 분명합니다. 그래서 Javascript를 이용해서 Windows Runtime을 완전히 사용하기에는 쉽지 않았습니다. 그래서 Windows Runtime과 더불어 "Windows Library for JavaScript"라는 녀석을 같이 써야 제대로 app을 개발할 수가 있습니다.
이런 이유로 C/C++이나 C#/VB로 개발하는 코드에 비해서 Javascript code가 상당히 이질적이거나 구조적으로 달라보이게 됩니다.
또한 많은 문서에서 API의 사용 예제를 3가지로 제공하는 경우 C/C++과 C#/VB 그리고 Javascript로 나누어 제공하고, 2가지로 예제를 제공하는 경우 C/C++/C#/VB 그리고 Javascript로 나누어 제공합니다.
대부분의 문서에서 "Windows Runtime and Windows Library for JavaScript" 하나로 묶어 설명하는데 이는 Javascript만으로 Windows Runtime을 사용하기에는 불가능하지는 않으나 너무나 복잡하기 때문입니다.
그외 HTML5와 CSS를 사용할 수 있겠습니다. 이또한 혼돈하지 말아야할 것은 HTML5와 CSS를 사용하고 있지만 정확히는 HTML5와 CSS 규격의 일부를 확장하여 사용하고 있다고 보는 편이 적절해 보입니다. 또한 광의의 의미에서 HTML5는 엄청나게 다양한 API 군을 포함하게 되는데, 아직 recommended가 확정되지 않은 내용이 많고 그 전체를 다 지원하지도 않습니다 지원되는 API 군과 확장 feature를 살펴보시려면 아래의 "HTML/CSS for Metro style apps" 링크를 살펴보시기 바랍니다.

Windows API: Windows Runtime
http://msdn.microsoft.com/en-us/library/windows/apps/br211377.aspx
HTML/CSS for Metro style apps
http://msdn.microsoft.com/en-us/library/windows/apps/br229576.aspx

posted by townone