본문 바로가기

프로그래밍

Haxe - 멀티플랫폼 프로그래밍 언어

멀티플랫폼 프로그래밍

멀티플랫폼은 이미 IT에서 중요한 요소로 자리잡았습니다. 데스크톱 환경에서 맥, 리눅스 사용자가 늘어남에 따라 탈 MS 현상이 일어나고 있고, 핸드폰이나 타블렛 같은 모바일 디바이스의 지원도 필수적이기 때문입니다. 다양한 환경은 사용자에게 선택의 자유를 주지만, 개발자의 입장에서는 지원해야 하는 플랫폼이 늘어나기 때문에 삶이 힘들어 지고 있습니다. 개발자들은 나름 고된 삶에서 벗어나고자 여러가지 방법을 강구하고 있습니다. 그 중 하나가 Haxe입니다. Haxe는 처음부터 멀티플랫폼을 지원하기 위해 설계되어 만들어진 언어입니다. 그래서 쉽게 다양한 플랫폼을 지원하는 어플리케이션을 개발할 수 있습니다.



Haxe의 지원 플랫폼

공식홈페이지의 설명에 따르면 Haxe는 다음과 같은 플랫폼들을 지원합니다.

  • Javascript: Haxe 프로그램을 .js 파일로 컴파일 할 수 있습니다. 또한 DOM API을 자동완성 기능을 이용하여 접근할 수 있습니다. 그 외에 의존적인 부분을 컴파일 타임에 해결할 수 있습니다.
  • Flash: Haxe 프로그램을 .swf 파일로 컴파일 할 수 있습니다. 
  • NekoVM: Haxe 프로그램을 NekoVM 바이트코드로 컴파일 할 수 있습니다. (NekoVM 이 뭔지는 잘 모르겠습니다.)
  • PHP: Haxe 프로그램을 .php 파일로 컴파일 할 수 있습니다. 고수준 언어의 타입검사 기능을 이용하여 보다 안전한 시스템을 만들 수 있습니다.
  • C++: Haxe 프로그램을 C++ 코드로 바꿀 수 있습니다. 이를 이용하여 네이티브 어플리케이션을 만들 수 있습니다. NME 라이브러리를 이용하여 C++ 코드를 iOS, 안드로이드에서 작동하게 할 수 있습니다.
  • C#, Java: Haxe 프로그램을 C#, Java 코드로 바꿀 수 있습니다.

이 처럼 Haxe는 다양한 플랫폼을 지원하고 있습니다. 하지만 플랫폼에서 제공해주는 유용한 라이브러리들을 직접 사용하기에는 어려움이 있을 것 같습니다. 대체로 다른 멀티플랫폼 프레임워크들도 플랫폼에서 지원하는 라이브러리들을 제대로 활용할 수 없기 때문에 크게 뜨지 못하고 있지요.

보통 가장 활용하기 어려운 부분이 UI와 관련된 부분이 아닐까 싶습니다. 안드로이드와 아이폰은 상반되는 UI 디자인 철학을 가지고 있기 때문에 안드로이드와 아이폰의 UI를 모두 지원하는 멀티플랫폼 프레임워크를 만든다는 것은 굉장히 어려운 일이기 때문입니다. 반면 오디오, 네트워크, OpenGL, 터치 API는 대체로 비슷한 부분들이 있기 지원하기가 비교적 쉽습니다. 이러한 이유 때문에 결국 멀티플랫폼 프레임워크는 게임 프레임워크가 되는 경우가 다반사인데, 지금의 Haxe도 일반적인 어플리케이션보다는 게임류에 많이 사용되는 것 같습니다.


Haxe의 특징

Haxe는 단순히 멀티플랫폼을 지원하기 때문에 좋은 것 만은 아닙니다. 단순히 프레임워크가 아니고 언어라는 점은 큰 메리트가 될 수 있습니다. 언어 단에서 멀티플랫폼에 최적화 될 수 있는  설계를 갖추고 있기 때문입니다.

타임검사

Haxe는 타임검사를 수행합니다. Javascript나 php 같은 Haxe가 지원하는 몇몇 언어는 타입 시스템이 없는데, Haxe는 타입검사를 지원함으로써 좀더 버그가 적은 프로그램을 만들 수 있습니다. 타입이 필요한가 필요하지 않는가에 대해서는 굉장히 논란이 많은 부분이긴 한데, 일단 Haxe는 다른 다양한 언어로 컴파일이 되어야 하기 때문에 타입검사는 필수 불가결한 요소입니다.

ECMA 스타일 프로그래밍

Haxe는 Actionscript와 Javascript랑 매우 비슷합니다. 그래서 플래쉬나 웹 개발자들이 쉽게 입문할 수 있습니다.

Haxe의 언어적 기능

Haxe는 타겟 플랫폼이 가지고 있지 않는 유용한 언어적 기능을 가지고 잇습니다. 

오픈소스

Haxe는 오픈소스입니다. 또한 OSX, 윈도, 유닉스 기반 OS등 모든 데스크탑 플랫폼에서 개발할 수 있는 환경을 제공합니다.


아래는 공식 홈페이지에 있는 Stopwatch라고 하는 샘플코드입니다.

import haxe.Timer;
class StopWatch{
    public var ms: Float;
    public var seconds(getSeconds,null):Float;
    private var timer: Timer;
    private var startTime:Int;
    private var preText:String;
    private var lastStamp:Float;
    
    public inline function new(preText:String='')
    {
        timer = new Timer(1);
        timer.run();
        
        this.preText = preText;
        lastStamp = 0;
    }
    
    public inline function stop():String
    {
        timer.stop();
        ms = getStamp();
        return(preText+" "+Std.string(ms)+" ms.");
    }
    
    private inline function getSeconds(  ):Float
    {
        return ms/1000;
    }
    
    private inline function getStamp():Float{
        var s:Float = Timer.stamp() - lastStamp;
        lastStamp = Timer.stamp();
        return s;
    }
    
    public inline function toString():String
    {
        return(preText+" "+Std.string(ms)+" ms.");
    }
}


개인적인 느낌

Haxe를 봤을때 들었던 느낌은 언어들이 많이 짬뽕되어 있는 느낌입니다. 전체적인 스타일은 JavaScript와 비슷하면서도 패키지 시스템이 있고, public/private 같은 가시성 인자들이 있고, 타입시스템이 있어서 여러가지 섞어놓은 듯한 느낌입니다. 어떻게 보면 스칼라와 비슷해 보이기도 하네요. 둘다 함수적인 자바라는 느낌이 들기 때문이죠. 물론 자세히 보면 엄청 다르긴 합니다.

Haxe를 사용하면 멀티 플랫폼 개발에 유용할 것 같습니다. 하지만 언어를 하나를 더 배워야 한다는 점도 껄끄러운 점입니다. JavaScript와 비슷하다고는 하지만 그렇게 비슷해 보이지도 않습니다. 언어를 하나 더 배우는 것은 꽤나 많은 시간과 노력을 쏟아야 하는 일이기 때문에 신생 언어인 Haxe로 넘어오는 사람은 그렇게 많을 것 같진 않습니다. 그래도 멀티플랫폼 어플리케이션 개발을 염두에 두고 계신다면 한번쯤 도전해 봐도 괜찮지 않는 언어가 아닐까 합니다.