Haxe - mal anders scripten

  • Guten Abend,

    ich bin letzte Woche zufällig auf eine Programmiersprache namens Haxe gestoßen, die sich als ziemlich interessant herausgestellt hat. Folgendes ist kein Tutorial im eigentlichen Sinne, sondern soll Haxe vorstellen und dessen Nutzung im Kontext von MTA diskutieren.

    Was ist Haxe?
    Haxe ist eine statisch-typisierte Programmiersprache, die eine eigene, umfangreiche Standardbibliothek hat und statt zu Maschinencode, zu anderen Sprachen kompiliert - darunter Lua, C++, Java, C#, PHP, Javascript u.v.m..
    Mit relativ wenig Aufwand lassen sich dann Schnittstellen vorhandener Anwendungen (z.B. MTA) definieren, sodass diese ebenfalls verwendet werden können.

    Das Ganze kann z.B. so aussehen:


    Syntaktisch kommt die Sprache Java wohl am nächsten, hat aber einige dynamische Komponenten.

    Wenn man nun den Haxe-Compiler wie folgt anwirft...

    Bash
    haxe -main Main -lua Main.lua Main.hx

    ...erhält man in Main.lua unter anderem...

    Lua
    Main.main = function() 
      _G.outputServerLog("hello");
      local player = _G.getRandomPlayer();
      _G.addEventHandler("onPlayerVehicleEnter",player,function() 
        _G.outputServerLog("Player: " .. player:getName() .. " entered the vehicle");
      end);
      local object = Object.create(1337,Vector3.create(1,2,3));
      object:setFrozen(true);
    end

    Wenn man mal davon absieht, dass der generierte Code nicht übermäßig gut lesbar ist (was nicht schlimm ist), werden direkt die zugehörigen MTA-Funktionen aufgerufen.

    Warum sollte ich Haxe benutzen?
    In der Vergangenheit gab es immer wieder Leute, die Alternativen zu Lua gefordert haben oder die Idee hatten, MTAs Script-API via Sockets in Java zugänglich zu machen. Abgesehen von der potenziell schlechteren Performance hat letzteres außerdem den Nachteil, dass es sich clientseitig nicht (direkt) benutzen lässt.
    Dieses Problem gibt es bei Haxe nicht, da am anderen Ende Lua-Code herauskommt, der ohne zusätzliche Abhängigkeiten ausgeführt werden kann.

    Über die Motivation Lua nicht zu verwenden lässt sich streiten: Manche Argumente sind sicherlich zurecht, andere aber auch nicht.
    An sich ist Lua, meiner Meinung nach, eine gute und für MTA gut geeignet Sprache, da sie leicht zu erlernen und sehr flexibel ist. Das Argument, dass Lua keine richtigen Klassen hat, ist meiner Meinung nach, nicht ganz gerechtfertigt, da diese mithilfe von Metatables mehr oder weniger gut realisierbar ist.

    Der wesentliche Nachteil von Lua (und so gut wie allen dynamischen Scriptsprachen) ist jedoch, dass diese bei wachsender Codebasis nicht gut skalieren, da Tools wie z.B. eine Autovervollständigung im Editor/IDE nicht gut funktionieren (weil nicht genug Informationen über den Inhalt von Variablen zur Verfügung stehen). Außerdem fallen Tippfehler bei Variablennamen oft erst auf, wenn es in der Produktivnutzung schon Fehlermeldungen gab (und wer war nicht schon genervt, von langen Scriptrestarts, nur weil ein Tippfehler im Code ist).
    Dieses Problem gibt es bei statisch-typisierten Programmiersprachen nicht, weil spätestens beim Kompilieren Tippfehler als Fehlermeldung angezeigt werden. Außerdem gibt es eine wunderbar funktionierende Autovervollständigung, die im jeweiligen Kontext immer genau die richtigen Vorschläge macht.

    Haxe erfüllt diese Anforderungen und hat dabei eine ausgezeichnete Unterstützung für verschiedene Editoren/IDEs:

    Wann sollte ich Haxe benutzen und wann nicht?
    Wie schon angedeutet, ist es insbesondere sinnvoll die Sprache für größere Projekte zu benutzen, für die eine Autovervollständigung besonders hilfreich ist (weil es aus vielen Scriptdateien besteht).
    Nicht sinnvoll ist es bei kleinen Scripts, da mit Haxe-Compiler eine weitere Abhängigkeit dazu kommt und die Scriptdateien nicht mehr ohne diesen angepasst werden können.

    Weiterhin ist zu beachten, dass Lua und Haxe nicht sinnvoll miteinander gemischt werden können/sollten. Dementsprechend gilt Haxe ganz oder gar nicht zu verwenden.

    Ich bin überzeugt, wie kann ich Haxe benutzen?
    Benutzt werden kann es sofort, allerdings müssen noch Definitionsdateien für MTAs vorhandene Scripting-API geschrieben werden, damit der Compiler und Editor weiß, welche Funktionen welche Typen als Parameter erwarten. Ich habe damit mal unter https://github.com/Jusonex/haxe-mtasa-typings angefangen und wäre über jede Hilfe beim Vervollständigen der API dankbar.

    Wenn ihr vor habt es für eigene Projekte zu verwenden, wäre es zusätzlich cool, wenn ihr hier etwas drunter schreibt, sodass ich sehen kann, ob es sich lohnt den Spaß weiterzuentwickeln.

    Wie sieht es mit der Performance im Vergleich zu reinem Lua aus?
    Dies ist eine berechtigte Frage, da man auf den ersten Blick denken könnte, dass zusätzliche Umwandlungen von Variablen zur Laufzeit stattfinden müssen. Das ist glücklicherweise nicht der Fall und die Variablen werden 1:1 übergeben.
    In der Realität könnte es sogar anders herum aussehen, da der Haxe-Compiler gleichzeitig einige Optimierungen am Code ausführt.

    2 Mal editiert, zuletzt von ronald drunk (30. Juli 2017 um 00:17)

  • Dieses Thema enthält 8 weitere Beiträge, die nur für registrierte Benutzer sichtbar sind, bitte registrieren Sie sich oder melden Sie sich an um diese lesen zu können.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!