Haxe
![]() Logo języka | |
Pojawienie się | |
---|---|
Paradygmat | |
Typowanie | |
Aktualna wersja stabilna |
4.3.6 |
Twórca | |
Platforma sprzętowa | |
Platforma systemowa | |
Strona internetowa |
Haxe – wieloplatformowy język programowania open source, przeznaczony do tworzenia aplikacji natywnych oraz interaktywnych aplikacji webowych. Obecnie współpracuje z: Adobe Flash, C++, C#, JavaScriptem, Javą, PHP, Pythonem, Luą, Node.js oraz Neko VM[1]. Twórcą Haxe jest Nicolas Cannasse.
Historia
[edytuj | edytuj kod]Prace nad językiem Haxe rozpoczęto 22 października 2005 roku. Pierwsza wersja alpha języka została wydana 14 listopada tego samego roku. Pierwsza wersja beta została wydana 4 lutego 2006 roku. Wersja Haxe 1.0 została wydana 17 kwietnia tego samego roku. Obecna wersja języka Haxe jest wersją 3.4.7 i została wydana 22 lutego 2018 roku[2].
Kompilator do języka Haxe został wydany na licencji GNU General Public License.
Nazewnictwo i wymowa
[edytuj | edytuj kod]Nazwa Haxe (wymawiane jako hex, aczkolwiek autorzy jedynej opublikowanej jak dotąd książki o tym języku wymawiają nazwę jako "hacks"[3]) została wybrana, ponieważ jest krótka, prosta i "zawiera X w nazwie", co autor języka uważa za niezbędne, aby nowa technologia odniosła sukces[4].
Język
[edytuj | edytuj kod]Oficjalna strona Haxe opisuje ten język jako "zorientowany webowo język uniwersalny". Szczególną cechą Haxe, która tłumaczy powyższy opis, jest docelowa obsługa wielu maszyn wirtualnych: Adobe Flash AVM1 (Flash 6-8) oraz AVM2 (Flash 9+), Javascript, NekoVM, PHP, a także maszynę wirtualną ogólnego przeznaczenia stworzoną przez twórcę języka Haxe. Haxe oraz jego biblioteki zostały zaprojektowane tak, aby zapewnić maksymalną obsługę platform docelowych, a kompilator generuje docelowy kod źródłowy lub kod bajtowy w zależności od wybranych opcji i języka. Określenie "zorientowany webowo język uniwersalny" bierze się z jego umiejętności produkowania tego samego kodu docelowo dla różnych warstw aplikacji WWW.
Haxe obecnie obsługuje:
Język Haxe jest zbliżony do ECMAScript, aczkolwiek prawie żadna aplikacja napisana w ECMAScript nie będzie działała w Haxe bez modyfikacji. W przeciwieństwie do ECMAScript, Haxe jest językiem kompilowanym. Haxe to zorientowany obiektowo język ogólnego przeznaczenia, obsługujący wyjątki, inferencję typów oraz klasy parametryzowane. Na funkcjonalność Haxe oraz jego bibliotek składają się m.in. typy generyczne, mechanizm refleksji, iteratory oraz programowanie funkcjonalne[5]. Język ten obsługuje silne i dynamiczne typowanie, co jest dość niespotykane wśród języków programowania. Kompilator automatycznie sprawdza typy i zwraca błędy w czasie kompilacji, ale także umożliwia programiście wyłączenie sprawdzania typów w Haxe i poleganie na systemie typów platformy docelowej.
Parametry funkcji w języku Haxe mogą być definiowane bardzo precyzyjnie:
function multipleparams(threedimensionalarray : Array<Array<Array<Int>>>, stringval : String, boolval : Bool) {}
function optionalargument( ?i : Int ) : Int {return 0;} // opcjonalny parametr typu int, zwraca int
function functionasparameter( f : Void -> Void ) {f();} // wywołanie funkcji bez parametrów
function anotherfunctionparm( f : Int -> Int ) {var result = f(1);} // wywołanie funkcji zwracającej int, z parametrem typu int
function icoulddoanything(d : Dynamic) : Dynamic {return d;} // funkcja pobierająca i zwracająca parametr dowolnego typu
Typy wyliczeniowe są kluczową cechą języka; mogą być rekursywne i zawierać parametry[6]. Są zbliżone do typów algebraicznych w językach jak ML lub Haskell. Typy wyliczeniowe w HaxeHaxe nie są indeksowanymi wartościami o "magicznych numerach", jak ma to miejsce w większości języków, ale są bardziej abstrakcyjne: nie mają przypisanej żadnej wartości, ale mogą być przypisane do zmiennych, jak w poniższym przykładzie:
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: 0xFF000;
case green: 0x00FF00;
case blue: 0x0000FF;
case rgb(r,g,b): (r << 16) | (g << 8) | b;
}
}
static function validCalls() {
var redint = toInt(red);
var rgbint = toInt(rgb(100,100,100));
}
}
(Zmodyfikowany kod ze strony języka)
Demonstracja użycia języka Haxe do celów graficznych – przykładowy kod dla Adobe Flash (pochodzący ze strony języka):
class Test {
static function main {
var mc : flash.MovieClip = flash.Lib.current;
mc.beginFill(0xFF0000);
mc.moveTo(50,50);
mc.lineTo(100,50);
mc.lineTo(100,100);
mc.lineTo(50,100);
mc.endFill();
}
}
Ten kod narysuje kwadrat przy użyciu obiektu Flash MovieClip.
Implementacja i wydajność kompilatora
[edytuj | edytuj kod]Kompilator do języka Haxe został zaimplementowany w języku Ocaml. Kod wygenerowany z języka Haxe jest uruchamiany na wirtualnej maszynie, dlatego też do tworzenia w nim aplikacji nie jest wymagana znajomość OCamla. Oznacza to również, że pomiary wydajności dają różne wyniki w zależności od docelowej platformy.
Test wydajności wskazuje[7], że kod bajtowy Flash 9 (AVM2) skompilowany przy użyciu Haxe jest bardziej wydajny niż równoważny kod AS3 na kompilatorze Adobe. Od publikacji tego testu wydajność kompilatora Haxe została zwiększona poprzez dodanie funkcji inline.
Przypisy
[edytuj | edytuj kod]- ↑ Use Cases for Haxe (ang.)
- ↑ Aktualna wersja (ang.)
- ↑ Franco Ponticelli , Professional haXe and Neko, Lee McColl-Sylvester, Hoboken, NJ: Wiley Technology Pub, 2008, ISBN 978-0-470-12213-6, OCLC 608622329 (ang.).
- ↑ Nazewnictwo. lists.motion-twin.com. [zarchiwizowane z tego adresu (2013-01-30)]. (Web Archive)(ang.)
- ↑ Dokumentacja haXe. haxe.org. [zarchiwizowane z tego adresu (2012-05-02)]. (ang.)
- ↑ Dokumentacja haXe (typy wyliczeniowe). haxe.org. [zarchiwizowane z tego adresu (2012-05-11)]. (ang.)
- ↑ Testy wydajności (ang.)