4. Was ist haXe?
Definition
haXe ist eine objektorientierte, ECMAScript-ähnliche
Programmiersprache.
Sie ermöglicht es, haXe-Quellcode in Quellcode oder
G
ByteCode verschiedener Plattformen zu kompilieren.
haXe ist eine Multiplattform-Sprache!
9. Welche Features bietet haXe?
switch
true/false enum
if/else for
do/while
Language Features
var new this
try/catch return function
Keywords
anderes Verhalten
23. Warum sollten wir haXe verwenden?
Vorteile
Eine Sprache für Client und Server (und Desktop)
Steile Lernkurve für JS/AS-Entwickler
Erweiterung der Sprachen
z.B.: Generics, Packages usw.
Optionale Typsicherheit
24. Warum sollten wir haXe verwenden?
Nachteile
Laufzeitfehler schwer zu debuggen
Keine Crossbrowser-Implementierung von JS
Community im Vergleich zu JS/AS/PHP extrem klein
25. Warum sollten wir haXe verwenden?
Pitfalls
Laufzeitfehler debuggen
PHP: int -> float (pseudo-random)
Template-System unpraktisch
(Funktionen/getter funktionieren nicht)
Suche der Dokumentation ekelhaft
27. Wohin geht es mit haXe?
Tools
Editoren
FlashDevelop
EcliHx
FDT
Textmate
vim
haxelib
install
update
run
haxedoc
generiert Doku aus Java-Doc Kommentaren
28. Wohin geht es mit haXe?
Libs
HXCPP
NME/Neash
Jeash
ScreenWeaver HX
u.v.m.
- Vorstellung - Warum gibts den Vortrag? - Wie mit fragen umgehen?
Objektorientiert + Lambda ECMA-Script ähnliche ECMA = standart für Websprachen Sprachkern für JavaScript/ActionScript Multiplattform vs Plattformunabhängig: Java -> JVM C# -> .NET Actionscript -> Flash Player bzw. Tamarin
Motion Twin / Nicolas Cannasse AS2 wurde Interpretiert ASML to AS2 Vorcompiler (Typ und Parameterprüfung) MTASC erster Nicht-Macromedia-Compiler für SWF-ByteCode Flashout, ASDT, MTASC, Eclipse, SwfMill ab 2005 neko Was ist neko? Actionscript 3 MTASC eingestellt. 2011 mehrere Targets außer AS3 + neko Motivation zu haXe Überleitung zu Features?
js - eine .js File Flash - eine .swf File - Version 6-8 - Version 9/10 (Tamarin) Php - php files (php 5) NekoVM - eine -n bytecode file Was ist neko? - vm von Motion Twin - Command-Line - C++ - C++ source - ? - Java - C#
- Witz über Compiler? - Später gibts ein Projekt mit JS-Client und PHP Backend - So sieht die "build.hxml aus"
ECMAScript ÄHNLICHE Programmiersprache switch - keine breaks - nach case sofort beendet enum - switch nur mit allen enums, sonst warning - enum parameter for - keine Zählschleifen direkt - alles über Iteratoren
Desto mehr typisiert ist, desto mehr Fehler werden zur compile-zeit gefunden. Vorteile aus beiden Welten. Basistypen Bool Int Float Dynamic Syntax: Sieht aus wie JS/AS Typisiert wie AS
Std (Methoden um Basistypen zu Modifizieren) - parseInt - parseFloat - int - string - usw. Math (mathematische Funktionen und Konstanten) - bekannt aus JS/AS - sin/cos/an - random - usw. Date - bekannt aus JS/AS - erweiterte Funktionen durch DateTools Array, List, Hash, IntHash - alles Typisiert - List ist eine LinkedList (Performanter, zugriff durch index möglich) - Hashtable (String -> Value) - Int Hashtable (Int -> Value) - Wie sieht das Compilat aus? - Was sind Generics?
Strukturierung mittels Packages. Vererbung Interfaces (auch mehrere) Generics Zugriffsmodifikatoren - private (verhält sich wie protected) - public Zugriffsfunktionen - Getter und Setter Konstruktor - new Überscheiben ist möglich Was nicht geht: - Methodenüberladung - Mehrfachvererbung - Abstrakte Klassen Generics zu komplex?
Serializer/Unserializer - wird für remoting verwendet - was passiert mit Referenzen? Remoting - Client/Server - Flash/JavaScript - Flash/AMF (Kein Serializer) Template System - Ausdrücke - if/elseif/else - Foreach - Macros UnitTests - Basis-Api - TestCase - TestRunner XML - Crossplattform - War auf php langsam weil - Wurde jetzt gefixt
Jedes Target hat ein eigenes Package. z.B.: PHP - db: Datenbank - io: Zugriff auf Dateisystem - net: Socket In jedem Package: Lib: - dump - print oder bei js - document - window - alert - eval Web: - redirect - getHeader - setHeader - getParams - getMethod
Was mache ich, wenn ich eine Plattformspezifische Lib einbinden möchte? in diesem Beispiel jQuery (ein Teil davon) Es gibts zwei Möglichkeiten, hier die erste (und saubere) Das extern Keyword sagt dem Compiler, dass die Implemetierung dieser Klasse zur Laufzeit zur Verfügung stehen wird. Die Package-Struktur muss beibehalten werden: z.B. bar.Foo = function() {} Diese Lösung ist Typsicher! PHP: Wenn es eine eigene Klasse ist, muss man sie natürlich includen. Die nächste Lösung ist nicht so schön, wird teilweise aber auch gebraucht!
Die haXe Magic funktionen bieten uns die Möglichkeiten Zielcode direkt einzubetten. // JS Der Parameter wird im Zielcode auch value heißen, deshalb können wir ihn direkt so übernhemen. // PHP PHP bietet mehrere Magic-Funktionenen, hier sprechen wir nur 2 an. __call__ ruft eine Funktion auf, der wir die Parameter mitgeben können. __php__ lässt uns direkt Code einbetten. Auch hier sieht man, dass die Parameter genau wie in haxe benannt sind, mit dem Unterschied, dass wir das $ vorstellen müssen. Magic Methoden gibt es auch für Flash und Neko, darauf gehen wir jetzt mal nicht genauer ein.
Was mach ich, wenn ich Code auf mehreren Plattformen verwenden möchte, der Code aber Plattformspezifischen Code enthält? Lösung: Conditional Compilation Dies ermöglicht uns je nach Target des Compilers einen anderen Code zu verwenden. Negierung möglich z.B. !php Abfragen ob debug-version #if debug Man kann auch eigene Variablen einführen.
Zwei Entitäten Der Client ist eine JavaScript-Anwendung Bestehen aus "Application Server" und einem CDN Zusätzlich eine Ort wo unsere Assets liegen (z.B.: ein CDN) In dem Beispiel gibts kein CDN. Der Client lädt sich die Assets vom Server und rendert diese: z.B.: Unser Login-Formular (html) Die Eingaben im Login-Formular werden einen den Application Server gesendet und wir erhalten Daten des Users (oder auch nicht). UserService.login() liefert ein User-Objekt (shared Code) wie im folgenden Beispiel... Der Client verarbeitet die Antwort.
Eine Sprache: Wird der Algorythmus auf dem Client oder auf dem Server ausgeführt?
Masterplan Debugging: Zeitersparnis durch Fehler zur Compilezeit größer als Fehlersucher zur Laufzeit. Template-System: Macros