맨위로가기

Haxe

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

Haxe는 2005년에 개발이 시작된 오픈 소스 범용 프로그래밍 언어이다. 다양한 플랫폼을 지원하며, 강력한 타입 시스템과 매크로 기능을 제공하는 것이 특징이다. Haxe 컴파일러는 AVM, Java VM, Neko, HashLink의 바이트코드, JavaScript, ActionScript 3, C++, Cppia, C#, Java, PHP, Python 3, Lua의 소스 코드를 생성하여 "Write once, run anywhere"를 지향한다. Haxe는 객체 지향, 제네릭, 함수형 프로그래밍을 지원하며, 타입 추론, 매크로, 열거형, 추상 타입 등 다양한 기능을 제공한다. Haxe는 게임 개발 분야에서 널리 사용되며, Evoland, Papers, Please, OpenFL 등의 소프트웨어가 Haxe로 개발되었다. Haxe는 다양한 IDE에서 지원되며, HashLink라는 자체 가상 머신을 통해 다양한 플랫폼을 지원한다.

더 읽어볼만한 페이지

  • 객체 기반 프로그래밍 언어 - 자바스크립트
    자바스크립트는 웹 페이지에 동적인 기능을 추가하기 위해 개발된 프로그래밍 언어로, 초기에는 라이브스크립트라 불렸으나 자바의 인기에 힘입어 변경되었고, ECMAScript로 표준화되어 웹 브라우저와 Node.js 등 다양한 환경에서 활용되지만, 오라클의 상표권 소유로 논란이 있다.
  • 객체 기반 프로그래밍 언어 - 비주얼 베이직
    비주얼 베이직은 1991년 마이크로소프트에서 출시된 GUI 기반 응용 프로그램 개발에 강점을 가진 프로그래밍 언어이며, 윈도우용 응용 프로그램 및 데이터베이스 조작 프로그램 개발에 주로 사용되었고, 2005년 표준 지원이 중단되었다.
  • 소스 대 소스 컴파일러 - 스칼라 (프로그래밍 언어)
    스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다.
  • 소스 대 소스 컴파일러 - 타입스크립트
    타입스크립트는 마이크로소프트에서 개발한 자바스크립트의 상위 집합으로, 정적 타입 지정, 타입 추론 등의 기능을 제공하여 코드의 안정성과 가독성을 높이는 언어이다.
  • 패턴 매칭 프로그래밍 언어 - AWK
    AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다.
  • 패턴 매칭 프로그래밍 언어 - 하스켈
    하스켈은 해스켈 커리의 이름을 딴 순수 함수형 프로그래밍 언어로, 여러 함수형 언어 통합 노력의 결과로 탄생하여 느긋한 계산법, 패턴 매칭, 타입 클래스, 모나드 등의 특징을 가지며 GHC가 표준 구현체로 사용된다.
Haxe - [IT 관련 정보]에 관한 문서
기본 정보
Haxe 로고
Haxe 로고
개발사Haxe 재단
최초 출시일2005년 11월 14일
최신 안정화 버전 출시일}}
프로그래밍 언어OCaml
웹사이트공식 웹사이트
기술 정보
프로그래밍 패러다임멀티 패러다임: 객체 지향, 함수형, 제네릭
종류ECMAScript
타이핑정적, 동적 (어노테이션 사용), 명목적
스코프어휘적
파일 확장자.hx, .hxml
플랫폼
지원 플랫폼IA-32
x86-64
AArch64
armel, armhf
MIPS, MIPS64el, MIPSel
ppc64el
RISC-V
s390x
지원 운영체제Android
iOS
리눅스
macOS
Windows
라이선스
라이선스GPL 2.0 (컴파일러), MIT (표준 라이브러리)
영향 받은 언어
영향 받은 언어ECMAScript
JavaScript
ActionScript
OCaml
Java
C++
PHP
C#
Python
Lua
NekoVM

2. 역사

Haxe의 개발은 2005년 10월에 시작되었다. 첫 번째 알파 버전은 2005년 11월 14일에 출시되었다.[10][11] 2006년 4월에는 Haxe 1.0이 출시되어 어도비 플래시(Adobe Flash), 자바스크립트(JavaScript), 네코VM(NekoVM) 프로그램을 지원했다. 2008년에는 PHP 지원이, 2009년에는 C++ 지원이 추가되었다. 2012년에는 컴파일러 개편을 통해 C#과 Java 같은 더 많은 플랫폼이 지원되었다.

Haxe는 니콜라스 칸나세(Nicolas Cannasse)와 다른 기여자들에 의해 개발되었으며, 원래 이름은 "haXe"였다.[12] 이는 짧고 단순하며, 저자는 새로운 기술의 성공에 필요하다고 유머러스하게 주장하는 "X가 안에 있다"는 이유 때문이었다.[13]

Haxe는 니콜라스 칸나세가 개발한 오픈 소스 액션스크립트(ActionScript) 2 컴파일러 MTASC의 후속작이며,[14] GNU 일반 공중 사용 허가서 버전 2 이상에 따라 배포된다. Haxe는 개발 초기부터 현재까지 [http://ncannasse.fr/ 니콜라스 카나스](Nicolas Cannasse)가 프로젝트 리더를 맡고 있다. ActionScript의 대체 컴파일러로 개발되었기 때문에 Flash 타겟으로 사용되는 경우가 많았지만, 현재는 플랫폼 중립적인 언어 환경을 목표로 하고 있다.[51]

연도내용
2005년 10월프랑스의 브라우저 게임 개발 회사 [Motion Twin](en)의 독자적인 ActionScript 컴파일러 MTASC의 후속 프로젝트로 Haxe가 탄생 (초기 표기는 haXe)
2006년 5월Haxe 1.0 출시, JavaScript 타겟 지원
2008년 7월Haxe 2.0 출시, Franco Ponticelli에 의해 PHP 타겟 추가
2009년 7월Haxe 2.04 출시, Hugh Sanderson에 의해 C++ 타겟 추가
2011년
2012년
2013년 5월Haxe 3.0 출시



Haxe의 이름은 짧고 단순하며 사용되지 않는 데다가, 새로운 기술을 성공으로 이끄는 데 필요한 X(has a X inside)를 안에 담고 있다는 점[52]에서 유래되었다.

원래 표기는 haXe였으나, 2012년 4월의 World Wide Haxe 컨퍼런스에서 고유 명사로 더 익숙하게 만들기 위해 표기를 Haxe로 변경한다고 발표했다.[53]

3. 특징

Haxe는 객체 지향 프로그래밍, 제네릭 프로그래밍, 다양한 함수형 프로그래밍 구조체를 지원하는 범용 목적의 언어이다. 반복, 예외 처리, 코드 반영 등의 기능들 또한 이 언어와 라이브러리의 내장 기능들이다.[62] Haxe는 강력한 형식 지정과 동적 형식 지정을 모두 갖춘 형식 시스템을 포함하고 있으며, 컴파일러는 형식 추론을 통해 암묵적으로 형식을 확인하고 컴파일 시 오류를 발생시킨다. 하지만, 프로그램이 형식 검사를 우회하고 대상 플랫폼의 동적 형식 처리에 의존할 수 있도록 할 수도 있다.

Haxe 언어는 대상 가상 머신에서 직접 실행할 수 있는 바이트코드로 컴파일할 수 있으며, C++, JavaScript, PHP, C#, Java, Python, Lua의 소스 코드로도 컴파일할 수 있다.[15] Haxe에는 'eval'이라는 인터프리터도 있는데,[15] 이 인터프리터는 추상 구문 트리(AST)의 수정을 허용하는 매크로를 실행하기 위해 컴파일 시간에 사용된다.

여러 소스 코드 언어로 컴파일하는 이러한 전략은 한 번 작성, 어디서나 실행 패러다임에서 영감을 받았다. 또한 프로그래머가 작업에 가장 적합한 플랫폼을 선택할 수 있도록 한다.

Haxe 컴파일러는 최적화 컴파일러이며, 컴파일된 프로그램의 런타임 성능을 최적화하기 위해 필드 및 함수 인라인, 꼬리 재귀 제거, 상수 폴딩, 루프 언롤링 및 데드 코드 제거(DCE)를 사용한다.[16] 또한, 옵트인 null-safety를 제공하며, 컴파일 시간에 null 허용 값을 확인한다.

Haxe의 주요 특징은 다음과 같다:


  • 동일한 언어를 사용하여 여러 플랫폼과 장치를 타겟팅하는 기능
  • 엄격하게 형식이 지정된 코드를 사용할 수 있는 기능
  • Haxe 언어로 수행할 수 있는 매크로(구문 변환)를 사용할 수 있는 기능[17]
  • 확장 메서드 및 함수형 프로그래밍과 같은 추가 언어 기능
  • Haxe 프로그램의 런타임 성능은 수작업으로 작성된 소스와 비슷한 속도[18]

4. 언어

Haxe는 객체 지향 프로그래밍, 제네릭 프로그래밍, 다양한 함수형 프로그래밍 구조를 지원하는 범용 목적의 언어이다. 반복, 예외 처리, 코드 리플렉션 등의 기능 또한 이 언어와 라이브러리에 내장되어 있다.[62]

Haxe는 대상 가상 머신에서 직접 실행할 수 있는 바이트코드로 컴파일할 수 있다. C++, JavaScript, PHP, C#, Java, Python, Lua 등의 소스 코드로도 컴파일 가능하다. Haxe에는 'eval'이라는 인터프리터가 있는데,[15] 이는 매크로 실행을 위해 컴파일 시간에 사용되며, 추상 구문 트리 (AST) 수정을 허용한다.

이처럼 여러 소스 코드 언어로 컴파일하는 전략은 한 번 작성, 어디서나 실행 패러다임에서 영감을 받았다. 프로그래머는 작업에 가장 적합한 플랫폼을 선택할 수 있다. 일반적인 Haxe 프로그램은 모든 플랫폼에서 동일하게 실행되지만, 개발자는 플랫폼별 코드를 지정하고 조건부 컴파일을 사용하여 다른 플랫폼에서 컴파일되지 않도록 할 수 있다.

Haxe 컴파일러는 최적화 컴파일러이며, 컴파일된 프로그램의 런타임 성능을 최적화하기 위해 필드 및 함수 인라인, 꼬리 재귀 제거, 상수 폴딩, 루프 언롤링, 데드 코드 제거 (DCE)를 사용한다.[16] 컴파일 시간에 null 허용 값을 확인하는 옵트인 null-safety도 제공한다.

Haxe는 강력한 형식 지정과 동적 형식 지정을 모두 갖춘 형식 시스템을 포함하여, 프로그래밍 언어 중에서도 특이하다. 컴파일러는 형식 추론을 통해 암묵적으로 형식을 확인하고 컴파일 시 오류를 발생시키지만, 형식 검사를 우회하고 대상 플랫폼의 동적 형식 처리에 의존할 수도 있다.

Haxe는 정적 타입 객체 지향 언어이며, ActionScript에서 파생되어 기본 구문은 ActionScript3와 공통점이 많다. ActionScript3의 기능을 일부 가지고 있으며, 그 외에 독자적인 기능도 가지고 있다.[48]
ActionScript3 기능 (일부):


  • 클래스, 인터페이스
  • 프로퍼티
  • 패키지, 모듈
  • 접근 제한자 (public, private)
  • 로컬 함수, 일급 함수 객체, 클로저
  • 각종 연산자 (산술, 대입, 논리, 문자열, 조건, 비트)
  • 리플렉션

Haxe 독자 기능:

4. 1. 타입 시스템

Haxe는 객체 지향 프로그래밍, 제네릭 프로그래밍, 그리고 다양한 함수형 프로그래밍 구성을 지원하는 범용 프로그래밍 언어이다. 반복, 예외 처리, 반사 프로그래밍(코드 리플렉션)과 같은 기능 또한 언어와 라이브러리의 내장 함수이다. Haxe는 강력한 형식 지정과 동적 형식 지정을 모두 갖춘 형식 시스템을 포함하고 있어, 프로그래밍 언어 중에서도 특이한 경우에 속한다. 컴파일러는 형식 추론을 통해 암묵적으로 형식을 확인하고 컴파일 시 오류를 발생시키지만, 프로그래머는 형식 검사를 우회하고 대상 플랫폼의 동적 형식 처리에 의존할 수 있다.[62] 모든 기본 대상 API를 사용할 수 있다.

Haxe는 정교하고 유연한 타입 시스템을 가지고 있다. 제공되는 타입 종류는 클래스, 인터페이스, 함수-메서드 타입, 익명 타입, 대수적 자료형(Haxe에서는 ''enum''이라고 부름), 그리고 추상 타입이다. 매개변수 다형성은 클래스, 대수적 타입, 함수 타입에서 가능하며, 타입 소거를 기반으로 한 제네릭 프로그래밍을 지원한다. 여기에는 다형 함수의 공변성 지원이 포함되지만, 타입 생성자에서는 지원되지 않는다.

타입 시스템은 정적 타입을 따르며, 동적 타이핑을 위한 주석이 있는 경우를 제외하고는 해당 기능을 지원하는 대상에 사용된다. 타입 검사는 명목적 타입 시스템을 따르지만, 익명 타입의 경우에는 구조적 타이핑이 대신 사용된다. 타입 추론이 지원되어 타입 어노테이션 없이 변수를 선언할 수 있다.

Haxe에서는 세밀한 형 선언이 가능하다.

```haxe

function func1(threeDimensionalArray:Array>>, string:String, bool:Bool) { ... }

// 옵션의 Int 정수 값을 넘겨 Int를 반환

function func2(?i:Int):Int {

return 0;

}

// 인수가 없는 함수를 파라미터로 넘김

function func3(f:Void -> Void) {

f();

}

// Int를 넘겨 Int를 반환하는 함수를 파라미터로 넘김

function func4(f:Int -> Int) {

var result = f(1);

}

// 임의 형을 받아 임의 형을 반환

function func5(d:Dynamic):Dynamic {

return d;

}

```

Haxe는 정적 타입 언어이지만, `Dynamic`형이나 `untyped`를 사용하면 부분적으로 타입 검사를 무효화할 수 있다. 반대로 `extern` 클래스에 의한 타입 정의를 함으로써, 동적 타입의 대상 라이브러리에 대해 타입 검사를 유효하게 하여 연계할 수 있다.

4. 2. 모듈과 네임스페이스

Haxe 코드는 경로를 사용하여 주소를 지정하는 모듈로 구성된다. 각 `.hx` 파일은 여러 유형을 포함할 수 있는 모듈을 나타낸다. 예를 들어, `my.pack` 패키지에 `A` 유형을 생성하려면 폴더 구조는 `my\pack`이어야 하고 파일은 `pack` 폴더 안에 `A.hx`이어야 한다.

```haxe

// 파일 my/pack/A.hx

package my.pack;

class A {}

```

다른 모듈에서는 패키지 정의 아래에 `import` 문을 넣어 다른 유형을 가져올 수 있다. 예를 들어 `import my.pack.A;`와 같이 사용한다.

`import my.pack2.A;`를 사용하여 해당 모듈에서 한 번에 하나의 유형을 가져올 수 있다. 유형은 `private`으로 지정할 수 있으며, 이 경우 해당 유형을 포함하는 모듈만 해당 유형에 접근할 수 있다.

```haxe

package my.pack2;

typedef A = {a:String}

private typedef B = {b:String}

4. 3. 클래스

Haxe의 클래스(키워드 class)는 Java 또는 TypeScript의 클래스와 유사하다. 클래스의 필드는 메서드, 변수 또는 속성일 수 있으며, 각각 정적이거나 인스턴스별로 존재한다. Haxe는 `public` 및 `private` 접근자를 지원하며, 어노테이션을 사용하여 접근 제어를 위한 고급 메서드를 지원한다. 메서드 및 정적 상수 변수는 `inline` 키워드를 사용하여 인라인 처리할 수 있다. 필드는 즉시 또는 생성자에서 초기화해야 하며, 쓸 수 없는 상수를 선언하기 위해 `final`로 표시할 수 있고, 함수의 경우 `final`은 하위 클래스에서 재정의할 수 없도록 표시한다.

Haxe의 인터페이스는 Java의 인터페이스와 매우 유사하다.

```haxe

interface ICreature {

public var birth:Date;

public var name:String;

public function age():Int;

}

class Fly implements ICreature {

public var birth:Date;

public var name:String;

public function age():Int return Date.now().getFullYear() - birth.getFullYear();

}

4. 4. 제네릭

Haxe는 제네릭 프로그래밍을 지원한다. 다음은 항등 함수의 예시이다.[1]

```haxe

function identity(arg:T):T {

return arg;

}

```

별도로 수정할 부분은 보이지 않습니다. Haxe 코드 예시는 `` 태그를 사용하여 코드 블록으로 표시하는 것이 적절하며, `[1]` 형태의 각주도 올바르게 사용되었습니다.

4. 5. 열거형

Haxe에서 열거형(enum)은 단순한 값의 목록을 넘어, 각 열거자에 서로 다른 매개변수를 지정할 수 있는 추상적인 자료형이다. 이는 ML이나 Haskell과 같은 언어의 대수적 데이터 타입과 유사하며,[49] 타입 매개변수를 가질 수 있고 재귀적인 구조도 가능하다.[19]

다음은 열거형 `Color`를 정의하고 사용하는 예시이다.

```haxe

enum Color {

red;

green;

blue;

rgb(r:Int, g:Int, b:Int);

}

class Colors {

static function toInt(c:Color):Int {

return switch (c) {

case red: 0xFF0000;

case green: 0x00FF00;

case blue: 0x0000FF;

case rgb(r, g, b): (r << 16) | (g << 8) | b;

}

}

static function validCalls() {

var redint = toInt(Color.red);

var rgbint = toInt(Color.rgb(100,100,100));

}

}

```

`switch` 표현식을 사용하여 열거형 값에 대한 패턴 매칭을 할 수 있다. 이를 통해 복잡한 데이터 처리를 간결하게 표현할 수 있다.

Haxe 표준 라이브러리에는 매개변수화된 열거형 타입인 `Option`[20]과 `Either`[21]가 있다.

```haxe

enum Option {

Some(v:T);

None;

}

enum Either {

Left(v:L);

Right(v:R);

}

```

Haxe는 일반화된 대수적 데이터 타입 (GADTs)도 지원한다.[22][23]

4. 6. 익명 형식

Haxe에서 익명 형식은 형식의 수학적 레코드 기반 표현을 따르는 구문을 사용하여 구조를 명시적으로 나타내어 정의한다. 이는 함수 인수를 위한 구조적 타이핑을 구현하는 데 사용할 수 있으며, `typedef` 키워드를 사용하여 별칭을 지정할 수 있다.

```haxe

typedef AliasForAnon = { a:Int, b:String, c:Float->Void };

4. 7. 함수 형식

Haxe는 함수를 일급 값으로 취급한다. 함수의 유형은 인자 유형과 반환 유형 사이에 화살표를 사용하여 나타낸다. 예를 들어, `String`을 인수로 받아 `Float` 유형의 값을 반환하는 함수의 유형은 다음과 같이 표현할 수 있다.

```haxe

typedef F1 = String -> Float;

```

`F1`과 `F2`는 동일한 유형을 나타내지만, `F2`는 자동 완성 및 문서화에 유용한 레이블 매개변수를 사용한다.

```haxe

typedef F2 = (text:String) -> Float;

```

`F3` 유형은 `Int`와 `String` 두 개의 인수를 받아 `Float`를 반환하는 함수이다.

```haxe

typedef F3 = (score:Int, text:String) -> Float;

```

`F4`와 `F5`는 동일한 유형을 나타낸다. 둘 다 `F3` 유형의 이항 함수를 반환하는 이항 함수이다. `F5`의 경우 함수 유형 내에서 함수 유형을 선언하는 구문이 사용된다.

```haxe

typedef F4 = (score:Int, text:String) -> F3;

typedef F5 = (score:Int, text:String) -> ((score:Int, text:String) -> Float);

```

Haxe는 객체 지향 프로그래밍, 제네릭 프로그래밍, 그리고 다양한 함수형 프로그래밍 구성을 지원하는 범용 프로그래밍 언어이다.[1] 반복, 예외 처리, 그리고 반사 프로그래밍 (코드 리플렉션)과 같은 기능 또한 언어와 라이브러리의 내장 함수이다.[1] 프로그래밍 언어 중에서 특이하게 Haxe는 강력한 형식 지정과 동적 형식 지정을 모두 갖춘 형식 시스템을 포함한다.[1] 컴파일러는 형식 추론을 통해 암묵적으로 형식을 확인하고 컴파일 시 오류를 발생시키지만, 프로그램이 형식 검사를 우회하고 대상 플랫폼의 동적 형식 처리에 의존할 수 있게 한다.[1]

4. 8. 추상 형식

Haxe는 객체 지향 프로그래밍, 제네릭 프로그래밍, 그리고 다양한 함수형 프로그래밍 구성을 지원하는 범용 프로그래밍 언어이다. 반복, 예외 처리, 반사 프로그래밍(코드 리플렉션)과 같은 기능 또한 언어와 라이브러리의 내장 함수이다. Haxe는 프로그래밍 언어 중에서 특이하게 강력한 형식 지정과 동적 형식 지정을 모두 갖춘 형식 시스템을 포함한다. 컴파일러는 형식 추론을 통해 암묵적으로 형식을 확인하고 컴파일 시 오류를 발생시키지만, 프로그램이 형식 검사를 우회하고 대상 플랫폼의 동적 형식 처리에 의존할 수 있게 한다. 모든 기본 대상 API를 사용할 수 있다.

Haxe 타입 시스템에 비교적 최근에 추가된 기능은 '추상 타입'이라고 불리는 개념이다. Haxe에서 사용되는 추상 타입은 일반적인 추상 타입과는 다른 의미를 가진다. 추상 타입은 타입 간의 암시적 변환을 만들어, 특정 목적(예: 측정 단위의 타입 구현)을 위해 기존 타입을 재사용할 수 있도록 한다. 이를 통해 동일한 기본 타입을 가지면서도 의미가 다른 값(예: 마일 vs. 킬로미터)을 혼동할 위험을 크게 줄일 수 있다.

다음 예시는 미터법을 기본으로 하고, 기존 데이터에 대한 변환으로 마일이 필요한 경우를 가정한다. Haxe는 마일을 킬로미터로 자동 변환할 수 있지만, 그 반대는 불가능하다.

```haxe

abstract Kilometer(Float) {

public function new(v:Float) this = v;

}

abstract Mile(Float) {

public function new(v:Float) this = v;

@:to public inline function toKilometer():Kilometer return (new Kilometer (this / 0.62137));

}

class Test {

static var km:Kilometer;

static function main(){

var one100Miles = new Mile(100);

km = one100Miles;

trace(km); // 160.935

}

}

```

예시에서 보듯이, "km = one100Miles;" 할당에 올바른 동작을 위해 명시적인 변환이 필요하지 않다.

추상 타입은 Haxe에서 전적으로 컴파일 타임에만 존재하는 기능이며 프로그램 실행 시점에는 전혀 존재하지 않는다. 예를 들어, 위에서 추상 타입 `Mile`과 `Kilometer`를 사용하는 두 변수는 런타임에 `Float` 타입이 된다.[24]

4. 9. 구조적 타이핑

Haxe는 익명 타입을 사용하여 구조적 타이핑을 지원한다. 익명 타입은 타입의 구조를 명시적으로 나타내는 방식으로 정의된다. 예를 들어, 다음 코드는 `a`, `b`, `c` 필드를 가지는 익명 타입 `AliasForAnon`을 정의한다.

```haxe

typedef AliasForAnon = { a:Int, b:String, c:Float->Void };

```

익명 타입을 사용하면 함수 인수에 대한 구조적 타이핑을 구현할 수 있다. 다음 코드는 `foo`와 `bar` 필드를 가지는 익명 타입을 인수로 받는 `anyFooBar` 함수를 정의한다.

```haxe

function anyFooBar(v:{foo:Int, bar:String}) trace(v.foo);

```

`anyFooBar` 함수는 `foo`와 `bar` 필드를 가지고 있다면, 타입을 명시하지 않고도 해당 함수에 전달될 수 있다.

```haxe

class FooBar {

public var foo:Int;

public var bar:String;

public function new() {

foo = 1;

bar = "2";

}

function anyFooBar(v:{foo:Int, bar:String})

trace(v.foo);

static function test() {

var fb = new FooBar();

fb.anyFooBar(fb);

fb.anyFooBar({foo: 123, bar: "456"});

}

}

```

위의 코드에서 `fb` 객체는 `FooBar` 클래스의 인스턴스이지만, `anyFooBar` 함수에 인수로 전달될 수 있다. 또한, `{foo: 123, bar: "456"}`와 같이 익명 객체를 만들어서 `anyFooBar` 함수에 전달할 수도 있다. 이는 Haxe가 명목적 타이핑이 아닌 구조적 타이핑을 따르기 때문이다. 즉, 타입의 이름이 아니라 구조가 일치하는지를 확인한다.

5. 컴파일러

Haxe 컴파일러는 OCaml로 작성되었으며, 하나의 프런트엔드와 여러 개의 백엔드로 구성된다. 프런트엔드는 소스 코드로부터 추상 구문 트리(AST)를 생성하고, AST에 대한 타입 검사, 매크로 확장, 최적화를 수행한다. 백엔드는 처리된 AST를 대상에 따라 소스 코드로 번역하거나 바이트코드를 생성한다.[16]

Haxe 컴파일러는 최적화 컴파일러로서, 컴파일된 프로그램의 런타임 성능을 높이기 위해 다음과 같은 최적화 기법을 사용한다.[16]



또한, Haxe 컴파일러는 옵트인 null-safety를 제공하여 컴파일 시간에 null 허용 값을 검사한다.[16]

컴파일러는 통합 개발 환경(IDE)에 대한 코드 완성 기능을 제공하고 컴파일 속도를 높이기 위해 서버 모드로 실행할 수 있으며, 캐시를 유지한다.[25]

5. 1. 타겟 플랫폼

Haxe 컴파일러는 다양한 플랫폼을 대상으로 코드를 생성할 수 있으며, 이를 통해 개발자는 한 번 작성한 코드를 여러 플랫폼에서 실행할 수 있다. Haxe에서는 이러한 플랫폼을 "타겟"이라고 부른다. Haxe 언어를 통해 개발자는 여러 플랫폼 기능에 접근할 수 있지만, Haxe는 완전한 기능을 갖춘 엔진은 아니므로 특정 플랫폼용 콘텐츠를 생성하려면 프레임워크가 필요할 수 있다.[8]

다음은 Haxe 컴파일러가 지원하는 주요 타겟 플랫폼과 각 플랫폼의 특징이다.

Haxe 컴파일러 타겟[8]
이름티어출력플랫폼사용Haxe 버전
Neko3바이트 코드NekoVM서버, 데스크톱, CLI2005 (알파)
Flash/SWF3바이트 코드플래시: AVM2, Flash Player 9+, AIR데스크톱, 브라우저, 서버2005 (알파)
JavaScript1소스자바스크립트: HTML5, NodeJS, PhoneGap서버, 데스크톱, 브라우저, 모바일2006 (베타)
ActionScript소스액션스크립트 3: AIR, Flex, Royale서버, 데스크톱, 브라우저, 모바일2007 (1.12), 2019 (4.0) 이후 제거됨
PHP1소스PHP: 젠드 엔진서버2008 (2.0) PHP 5; 2019 (4.0) 이후 PHP 7
C++2소스C++: 윈도우, 리눅스, macOS, 안드로이드, iOS, Palm, WebOS서버, 데스크톱, 모바일, CLI, 게임 콘솔2009 (2.04); cppia는 2014 (3.2)에 추가됨
C#3소스C#: .NET 프레임워크, .NET Core, Mono서버, 데스크톱, 모바일2012 (2.10)
Java3소스Java: Java OpenJDK서버, 데스크톱2012 (2.10)
Python3소스PythonCLI, 웹, 데스크톱2014 (3.2)
Lua2소스LuaCLI, 웹, 데스크톱, 모바일2016 (3.3)
HashLink1바이트 코드HashLink VM 또는 HL/C (C 파일로 컴파일)서버, 데스크톱, 모바일, 게임 콘솔(C export 사용 시)2016 (3.4)
JVM1바이트 코드JVM: HotSpot, OpenJ9서버, 데스크톱2019 (4.0)
Eval1인터프리터Haxe 인터프리터프로토타입 제작, 스크립팅2019 (4.0)



각 타겟 플랫폼에 대한 추가 설명은 다음과 같다.


  • Neko: Haxe 초기부터 지원된 가상 머신으로, 서버, 데스크톱, 명령 줄 인터페이스(CLI) 응용 프로그램 개발에 사용된다.
  • Flash/SWF: 어도비 플래시 플랫폼을 대상으로 하며, AVM2(ActionScript Virtual Machine 2)를 지원하는 Flash Player 9 이상 또는 AIR(Adobe Integrated Runtime) 환경에서 실행되는 SWF 파일을 생성한다. 데스크톱, 브라우저, 서버 환경에서 사용된다.
  • JavaScript: 웹 브라우저, NodeJS, PhoneGap 등 다양한 자바스크립트 환경에서 실행되는 코드를 생성한다. 서버, 데스크톱, 브라우저, 모바일 응용 프로그램 개발에 사용된다. Haxe 4.0 현재, ECMAScript 5에 준수하는 코드로 컴파일된다.[33]
  • ActionScript: AIR, Flex, Royale 등 액션스크립트 3 기반 환경에서 실행되는 코드를 생성한다. 2019년 Haxe 4.0 버전부터 지원이 중단되었다.
  • PHP: PHP 환경에서 실행되는 코드를 생성하며, 서버 측 웹 개발에 사용된다. Haxe 3까지는 PHP 5.1.0, Haxe 4 이후에는 PHP 7.0.0 버전을 기준으로 코드를 생성한다.[36]
  • C++: C++ 코드를 생성하며, 윈도우, 리눅스, macOS, 안드로이드, iOS 등 다양한 플랫폼에서 네이티브 응용 프로그램 개발에 사용된다. 게임 콘솔 개발에도 활용 가능하다.
  • C#: C# 코드를 생성하며, .NET 프레임워크, .NET Core, Mono 등 C# 실행 환경에서 응용 프로그램 개발에 사용된다.
  • Java: Java 코드를 생성하며, JVM 환경에서 실행되는 응용 프로그램 개발에 사용된다.
  • Python: Python 코드를 생성하며, 명령 줄 인터페이스(CLI), 웹, 데스크톱 응용 프로그램 개발에 사용된다.
  • Lua: Lua 코드를 생성하며, CLI, 웹, 데스크톱, 모바일 응용 프로그램 개발에 사용된다.
  • HashLink: HashLink 가상 머신 또는 HL/C (C 파일로 컴파일)를 대상으로 하는 바이트 코드를 생성한다. 서버, 데스크톱, 모바일 응용 프로그램, 게임 콘솔(C export 사용 시) 개발에 사용된다.
  • JVM: JVM을 대상으로 하는 바이트 코드를 생성하며, HotSpot, OpenJ9 등 JVM 환경에서 실행되는 응용 프로그램 개발에 사용된다.
  • Eval: Haxe 인터프리터를 대상으로 하며, 프로토타입 제작 및 스크립팅에 사용된다.

5. 2. 장점

Haxe는 다음과 같은 다양한 장점을 제공한다.

  • 다양한 플랫폼 동시 타겟팅: 동일한 Haxe 코드를 사용하여 여러 플랫폼과 장치를 대상으로 프로그램을 개발할 수 있다. 이는 "Write once, run anywhere" 패러다임에 기반하며, 개발자는 작업에 가장 적합한 플랫폼을 선택할 수 있다.[15]
  • 엄격한 타입 검사: Haxe는 엄격하게 형식이 지정된 코드를 사용하므로, 컴파일 시간에 오류를 발견하고 수정하기 쉽다.
  • 매크로 기능: Haxe 언어로 수행할 수 있는 매크로(구문 변환)를 통해 추상 구문 트리 (AST)를 수정할 수 있다.[17]
  • 확장 메서드 및 함수형 프로그래밍: 확장 메서드 및 함수형 프로그래밍과 같은 추가적인 언어 기능을 지원하여 코드의 재사용성과 가독성을 높인다.
  • 높은 런타임 성능: Haxe 프로그램의 런타임 성능은 수작업으로 작성된 소스와 비슷한 속도를 제공한다.[18] Haxe 컴파일러는 최적화 컴파일러로, 필드 및 함수 인라인, 꼬리 재귀 제거, 상수 폴딩, 루프 언롤링, 데드 코드 제거 (DCE) 등의 최적화를 수행한다.[16]
  • Null-safety: Haxe 컴파일러는 옵트인 null-safety를 제공하며, 컴파일 시간에 null 허용 값을 확인한다.


Haxe 컴파일러는 AVM, Java VM, 그리고 자체 가상 머신인 Neko 및 HashLink의 바이트코드, JavaScript, ActionScript 3, C++C#, Java, PHP, Python 3, Lua의 소스 코드를 생성한다.[15]

6. 내부 아키텍처

Haxe 컴파일러는 하나의 프런트엔드와 여러 개의 백엔드로 구성되어 Haxe 소스 코드를 다양한 플랫폼에서 실행 가능한 형태로 변환한다. 프런트엔드는 소스 코드로부터 추상 구문 트리(AST)를 생성하고, 타입 검사, 매크로 확장, 최적화를 수행한다. 백엔드는 처리된 AST를 대상에 따라 소스 코드로 번역하거나 바이트코드를 생성한다.

6. 1. 컴파일러 구현 및 성능

Haxe 컴파일러는 하나의 프런트엔드와 여러 개의 백엔드로 나뉜다. 프런트엔드는 소스 코드로부터 추상 구문 트리(AST)를 생성하고, AST에 대한 타입 검사, 매크로 확장, 최적화를 수행한다. 다양한 백엔드는 처리된 AST를 대상에 따라 소스 코드로 번역하거나 바이트코드를 생성한다.[15]

컴파일러는 최적화 컴파일러이며, 컴파일된 프로그램의 런타임 성능을 최적화하기 위해 필드 및 함수 인라인, 꼬리 재귀 제거, 상수 폴딩, 루프 언롤링, 데드 코드 제거(DCE)를 사용한다.[16] 또한 컴파일 시간에 null 허용 값을 확인하는 옵트인 null-safety를 제공한다.

OCaml로 작성되었으며, 통합 개발 환경(IDE)에 대한 코드 완성 기능을 제공하고 컴파일 속도를 빠르게 하기 위해 캐시를 유지하는 서버 모드로 실행할 수 있다.[25] Haxe 사용자는 OCaml에 대한 지식이 필요하지 않다.

7. Haxe로 작성된 소프트웨어


  • Evoland - Haxe 창시자인 니콜라 카나스(Nicolas Cannasse) 등이 제작한 인디 롤플레잉 게임이다.[50]
  • Papers, Please - 가상의 공산 국가 입국 심사관 체험 게임으로, OpenFL을 사용하였다. Metacritic에서 메타스코어 85점을 획득하였고, 게임 개발자 회의(GDC) 2014의 Independent Games Festival에서 최우수상을 받았다.[50]
  • http://www.openfl.org/showcase/ OpenFL - Showcase - OpenFL을 사용한 게임 쇼케이스이다.[50]
  • http://www.stencyl.com/ Stencyl - 2D 게임 에디터로, OpenFL을 사용한다.[50]
  • TiVo - 안드로이드, iOS, 디지털 비디오 레코더 애플리케이션에 사용되고 있다.[50]

8. 통합 개발 환경 (IDE)

Haxe에서의 프로그래밍에는 각종 통합 개발 환경(IDE) 및 에디터를 이용할 수 있다. Haxe 컴파일러에는 IDE에 컴파일 및 자동 완성 기능을 제공하는 서버 기능이 탑재되어 있다.

10. 자주 비교되는 언어


  • CoffeeScript
  • TypeScript
  • Dart
  • JSX

참조

[1] 웹사이트 Open Source licence Haxe https://haxe.org/fou[...]
[2] 문서 Introduction to the Haxe Standard Library https://haxe.org/doc[...] Haxe Docs
[3] 문서 Target Specific APIs, Introduction to the Haxe Standard Library https://haxe.org/doc[...] Haxe Docs
[4] 웹사이트 Dear Adobe: Support Haxe, save your Tools http://www.gamasutra[...] 2014-06-24
[5] 뉴스 Haxe Interview http://ncannasse.fr/[...] Io Programmo 2015-08-06
[6] 웹사이트 Hello Lua! https://haxe.org/blo[...]
[7] 웹사이트 hxnodejs https://lib.haxe.org[...]
[8] 웹사이트 Compiler Targets https://haxe.org/doc[...] 2021-11-05
[9] 문서 List of IDEs supporting Haxe https://haxe.org/doc[...] Haxe Foundation
[10] 웹사이트 Release alpha-1 https://github.com/H[...] HaxeFoundation 2022-04-02
[11] 간행물 Haxe Alpha 1b http://lists.motion-[...] 2005-11-17
[12] 웹사이트 Nicolas' announcement of spelling change on Haxe official mail list https://groups.googl[...]
[13] 웹사이트 Haxe mailing list post on naming http://lists.motion-[...]
[14] 문서 MTASC Compiler http://www.mtasc.org MTASC website
[15] 웹사이트 Eval - The new Haxe macro interpreter https://haxe.org/blo[...]
[16] 웹사이트 Compiler Features https://haxe.org/man[...]
[17] 웹사이트 Macros in Haxe https://haxe.org/man[...]
[18] 웹사이트 On "You can't make good HTML5 games in Haxe" http://yal.cc/answer[...] Yellow After Life 2013-12-05
[19] 웹사이트 Haxe reference detailing the use of enum http://haxe.org/ref/[...]
[20] 웹사이트 haxe/Option.hx at development · HaxeFoundation/haxe https://github.com/H[...] 2021-11-07
[21] 웹사이트 haxe/Either.hx at development · HaxeFoundation/haxe https://github.com/H[...] 2021-11-07
[22] 웹사이트 Language Features http://haxe.org/docu[...] Haxe Foundation 2015-04-30
[23] 웹사이트 haxe/TestGADT.hx at development · HaxeFoundation/haxe https://github.com/H[...] 2021-11-07
[24] 웹사이트 Abstract https://haxe.org/man[...] 2023-04-24
[25] 문서 Server mode command-line: haxe --wait [host:]port
[26] 웹사이트 Haxe 4.3.6 https://haxe.org/dow[...] 2024-08-20
[27] 웹사이트 Haxe git builds https://build.haxe.o[...] 2024-08-20
[28] 문서 Haxeの発音について言語開発者による回答 http://osflash.org/p[...]
[29] 문서 公式メーリングリストにおけるHaxeの読み方についての会話 http://haxe.org/foru[...]
[30] 문서 haXe is now Haxe https://groups.googl[...]
[31] 웹사이트 History https://haxe.org/man[...] 2019-11-03
[32] 웹사이트 Using external JavaScript libraries https://haxe.org/man[...] 2019-11-03
[33] 웹사이트 JavaScript https://haxe.org/man[...] 2019-11-03
[34] 웹사이트 JavaScript https://haxe.org/man[...] 2019-11-03
[35] 웹사이트 Haxe 2.0.0 https://haxe.org/dow[...] 2019-11-03
[36] 웹사이트 Getting started with Haxe/PHP https://haxe.org/man[...] 2019-11-03
[37] 웹사이트 Haxe 2.4.0 https://haxe.org/dow[...] 2019-11-03
[38] 웹사이트 Getting started with Haxe/C++ https://haxe.org/man[...] 2019-11-03
[39] 웹사이트 Haxe 2.10.0 https://haxe.org/dow[...] 2019-11-03
[40] 웹사이트 .NET version and external libraries https://haxe.org/man[...] 2019-11-03
[41] 웹사이트 Getting started with Haxe/Java https://haxe.org/man[...] 2019-11-03
[42] 웹사이트 Replace hxjava-std with Java 8. https://github.com/H[...] 2019-11-03
[43] 웹사이트 Haxe 3.2.0-rc.2 https://haxe.org/dow[...] 2019-11-03
[44] 웹사이트 Getting started with Haxe/Cppia https://haxe.org/man[...] 2019-11-03
[45] 웹사이트 Haxe 3.3.0-rc.1 https://haxe.org/dow[...] 2019-11-03
[46] 웹사이트 Haxe 3.3.0-rc.1 https://haxe.org/dow[...] 2019-11-03
[47] 웹사이트 Haxe 4.0.0-rc.3 https://haxe.org/dow[...] 2019-11-03
[48] 웹사이트 Language Features - Haxe - The Cross-platform Toolkit http://haxe.org/manu[...]
[49] 웹사이트 Enum Instance - Haxe - The Cross-platform Toolkit http://haxe.org/manu[...]
[50] 간행물 WWX2015 Haxe in the Enterprise https://github.com/T[...]
[51] 웹사이트 Getting Rid of Flash ? http://ncannasse.fr/[...]
[52] 웹사이트 Haxeのネーミングについて言語開発者のコメント https://web.archive.[...]
[53] 웹사이트 haXe is now Haxe https://groups.googl[...]
[54] 웹사이트 London Haxe Meetup 20th October 2016 - Part 2 https://haxe.org/vid[...] Haxe Foundation 2019-03-15
[55] 웹사이트 HashLink - Haxe Virtual Machine https://hashlink.hax[...] Haxe Foundation 2019-03-15
[56] 웹사이트 About - Haxe Game Engine https://heaps.io/abo[...] Heaps.io 2019-03-15
[57] 웹사이트 Hello HashLink https://github.com/H[...] Heaps.io 2019-03-15
[58] 웹인용 Nicolas' announcement of spelling change on Haxe official mail list https://groups.googl[...]
[59] 서적 Professional haXe and Neko https://books.google[...] Wiley 2008-02-11
[60] 서적 Away3D 3.6 Cookbook https://books.google[...] Packt Publishing Ltd 2011-05-24
[61] 웹인용 Haxe/OpenFL for home game consoles http://gamasutra.com[...] Gamasutra 2015-06-03
[62] 웹인용 Haxe language reference http://Haxe.org/ref



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com