Posted on ::

Haxe, açık kaynak kodlu ve çapraz derleyiciye sahip bir programlama dilidir. Çapraz derleyici şu anlama gelir: Haxe ile yazdığınız kodu JavaScript'e, Python'a, C++'a ya da başka bir dile çevirebilirsiniz. Yani aynı kodu tekrar yazmadan farklı platformlarda çalıştırabilirsiniz.

Somut bir örnek verelim: Bir oyun yapıyorsunuz. Hem tarayıcıda hem de masaüstünde çalışmasını istiyorsunuz. Normalde biri için JavaScript, diğeri için C++ yazmanız gerekir. Haxe ile bunu tek kod tabanından yapabilirsiniz.

Haxe'in Çeviri Yapabildiği Diller ve Platformlar

Haxe iki tür çıktı üretir:

  • Sourcecode (Kaynak kod): Haxe'i başka bir dilin kaynak koduna çevirir. O dil kendi derleyicisiyle derlenir.
  • Bytecode: Doğrudan çalıştırılabilen ara kod üretir, ayrıca derleme gerekmez.
İsimÇıkışKullanım Alanları
JavaScriptSourcecodeBrowser, Desktop, Mobile, Server
NekoBytecodeDesktop, Server, CLI
HashLinkBytecodeDesktop, Mobile, Game consoles
PHPSourcecodeServer
PythonSourcecodeDesktop, Server
LuaSourcecodeDesktop, Scripting
C++SourcecodeDesktop, Mobile, Server, Game consoles
FlashBytecodeDesktop, Mobile
JavaSourcecodeDesktop, Mobile, Server
JVMBytecodeDesktop, Mobile, Server
C#SourcecodeDesktop, Mobile, Server

Bu liste resmi hedeflerle sınırlı değildir. Reflaxe, Haxe'in AST'ini alıp istediğiniz dile veya formata dönüştüren özel bir arka uç yazmayı kolaylaştıran bir framework'tür. Topluluk Reflaxe kullanarak C++, GDScript, Swift, Dart ve C# gibi hedefler geliştirmiştir; güncel liste için awesome-haxe-targets reposuna göz atabilirsiniz.

Hızlı Başlangıç

class Main {
    static function main() {
        var name = "Haxe";
        trace('Hello, $name!');
    }
}

Yukarıdaki kodu Main.hx olarak kaydedip aşağıdaki komutla istediğiniz hedefe derleyebilirsiniz:

haxe --main Main --js main.js     # JavaScript'e derler
haxe --main Main --python main.py # Python'a derler
haxe --main Main --interp         # Doğrudan çalıştırır

Haxe'in Sözdizimi (Syntax) Yetenekleri

Haxe'in sözdizimi Java veya C#'a benzer, ancak çok daha kısa ve ifade edici kod yazmanıza olanak tanır.

String interpolation: Tek tırnaklı string içinde değişkenleri doğrudan kullanabilirsiniz.

var name = "Alice";
var age = 30;
trace('My name is $name, I am $age years old.');
trace('Total: ${age * 2}');  // Süslü parantez içinde ifade de yazılabilir

Dizi üreteci (Array comprehension): Başka dillerde döngü ve push ile yapacağınız işi tek satırda yazabilirsiniz.

// 0-100 arasındaki çift sayıları listele
var evenNumbers = [for (i in 0...100) if (i % 2 == 0) i];

Koşullu derleme: Hangi platforma derlediğinize göre farklı kod çalıştırabilirsiniz. Bu sayede platforma özel API'leri tek kod tabanında kullanabilirsiniz.

#if js
    js.Lib.alert("Hello");   // Tarayıcıda alert kutusu açar
#elseif sys
    Sys.println("Hello");    // Terminalde yazdırır
#end

Property (get/set): Bir değişkene okunma veya yazılma anında otomatik çalışacak fonksiyonlar tanımlayabilirsiniz. Değerin nereden geldiğini veya nasıl ayarlandığını dışarıdan gizlemiş olursunuz.

public var color(get, set);

function get_color() {
    return element.style.backgroundColor;
}

function set_color(c:String) {
    trace('Setting background color to $c');
    return element.style.backgroundColor = c;
}

Enum ile veri modelleme (ADT): Haxe'deki enum'lar değer taşıyabilir. Bir işlemin sonucunu başarı veya hata olarak modellemenin güvenli bir yoludur.

enum Result {
    Success(data:Array<Int>);
    UserError(msg:String);
    SystemError(msg:String, position:PosInfos);
}

Yukarıdaki tanımla şunu yapabilirsiniz:

function processData():Result {
    if (/* error condition */) return UserError("Invalid input");
    return Success([1, 2, 3]);
}

switch (processData()) {
    case Success(data): trace(data);
    case UserError(msg): trace("User error: " + msg);
    case SystemError(msg, _): trace("System error: " + msg);
}

Tip Sistemi

Haxe statik tipli bir dildir, yani her değişkenin tipi derleme zamanında bilinir. Ancak Java veya C#'tan farklı olarak tip çıkarımı (type inference) sayesinde tipleri her yerde elle yazmanız gerekmez:

var number = 42;                // Otomatik olarak Int
var text = "hello";             // Otomatik olarak String
var items = [1, 2, 3];          // Array<Int>

// Açık tip belirtmek de mümkün
var age:Int = 25;

Derleyici, kodun yanlış tipte değer kullanmaya çalışmasını yakalar. Örneğin String ile Int toplamaya çalışırsanız derleme aşamasında hata alırsınız; bu hatayı çalışma zamanında bulmazsınız.

Standart Kütüphane

Çapraz derlemenin pratikte işe yaramasını sağlayan asıl şey, tüm hedeflerde aynı şekilde çalışan ortak standart kütüphanedir. Array, Map, String, Math, Date, haxe.Http, sys.io.File gibi sınıflar JavaScript'te de Python'da da C++'ta da aynı API ile çalışır.

Yani Haxe'de yazdığınız HTTP istek atan bir fonksiyon, farklı bir hedefe derlendiğinde değişiklik yapmadan çalışır — derleyici arka planda her platforma uygun çağrıları üretir.

Platforma özel API'lere ihtiyacınız olursa (js.Browser, sys.FileSystem gibi) bunlara da erişebilirsiniz; ancak bu kodun yalnızca o hedefte derleneceği unutulmamalıdır.

haxelib — Paket Yöneticisi

Haxe'in resmi paket yöneticisi haxelib'dir; npm ve pip benzeri bir araçtır. Haxe kurulduğunda haxelib de gelir.

haxelib install heaps          # Heaps.io motorunu kur
haxelib install hxnodejs       # Node.js bağlamalarını kur
haxelib list                   # Kurulu paketleri listele

Yayımlanmış tüm paketleri lib.haxe.org üzerinden arayabilirsiniz.

Makro Özelliği

Makro, derleme zamanında çalışan koddur. Program çalışmadan önce Haxe'in kendi makrolarınızı derlemesini ve AST (soyut sözdizimi ağacı) üzerinde değişiklik yapmasını sağlayabilirsiniz.

Pratikte ne işe yarar? Tekrarlayan kod üretimi, derleme zamanı doğrulaması, harici dosyadan veri okuma gibi işleri çalışma zamanına bırakmadan derleme sırasında halledebilirsiniz.

Örneğin JSON dosyasını derleme sırasında okuyup tip güvenli bir yapıya dönüştüren basit bir makro:

class MyMacro {
    public static macro function loadConfig():Expr {
        var content = sys.io.File.getContent("config.json");
        // Derleme sırasında çalışır, çalışma zamanında dosya okumaya gerek kalmaz
        return macro $v{content};
    }
}

Makrolar ileri seviye bir konu olmakla birlikte Haxe'i diğer dillerden ayıran en güçlü özelliklerden biridir. Daha fazla bilgi için tıklayın.

Haxe'de Oyun Geliştirmek

Haxe'in çapraz derleme özelliği oyun geliştirmede büyük avantaj sağlar: yazdığınız oyun aynı kod tabanıyla Windows, Mac, Linux, tarayıcı ve mobil platformlara çıkabilir. Bunun için birden fazla motor seçeneği mevcut.

Heaps.io

Heaps.io, performans odaklı 2D ve 3D oyunlar için tasarlanmış olgun bir motordur. Dead Cells ve Northgard gibi ticari başarıya ulaşmış oyunlar Heaps.io ile yapılmıştır; yani endüstri düzeyinde kullanıma hazır olduğu kanıtlanmıştır.

Darksburg - Heaps.io ile yapılmış oyun

HaxeFlixel

HaxeFlixel, OpenFL üzerine inşa edilmiş 2D oyun motorudur. Flash döneminden gelen köklü bir geçmişi vardır ve Haxe ekosistemindeki en geniş topluluğa sahip motordur. Belge, öğretici ve örnek proje bolluğu açısından diğer seçeneklerin önündedir.

Ceramic

Ceramic, Haxe ile yazılmış modern bir 2D oyun ve uygulama çerçevesidir. Windows, Mac, Linux, iOS, Android ve tarayıcı platformlarını destekler. Entegre editörü ve hot reload desteği sayesinde modern bir geliştirme deneyimi sunar.

Kha

Kha bir oyun motoru değil, düşük seviyeli bir multimedia çerçevesidir. Renderer'dan ses sistemine kadar her şeyi kendiniz inşa edersiniz. Bu yüzden öğrenme eğrisi diktir; ancak tam kontrol size kalmıştır.

Kha'nın üzerine inşa edilmiş birden fazla oyun motoru zaten var; dolayısıyla çoğu zaman Kha'yı doğrudan kullanmak yerine bu motorlardan birini tercih etmek daha mantıklı olabilir.

Kha ile yapılmış oyun motorları için tıklayın.

Oyun Dışı Kullanım

Haxe oyun geliştirmeyle özdeşleşmiş olsa da kullanım alanı bununla sınırlı değil. HxWell, Haxe ile yazılmış Laravel'den ilham alan bir backend web framework'üdür. JVM, C++, HashLink, PHP ve Neko hedeflerine derlenebilir; routing, middleware, ORM benzeri model işlemleri ve veritabanı soyutlaması gibi özellikler sunuyor.


Haxe niş bir dil ama doğru problemi çözüyor: aynı kodu birden fazla platformda çalıştırmak. Denemek için haxe.org tıklayın.

Table of Contents