![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/7065039/haxe-logo-large.png)
Daniil Korostelev
About me
- Coding since 7 y.o. (Speccy, Fido, Quake mods, fun years)
- First love: Python (UI and then server dev)
- Then a bit of C and C++
- Then some ActionScript3 and JavaScript
- Then C# and Unity... and Haxe \o/
- OCaml somewhere inbetween
- Currently a Haxe dev at Forge of Empires
- Still keeping an eye on different tech
About HAXE
- Created by Nicolas Cannasse (Motion Twin/Shiro Games)
- 1.0 released in 2006, 4.1.4 released in 2020
- Open souce, independent, supported by foundation partners
- General-purpose, but originally comes from gamedev
NOTABLE GAMES
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/7878108/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/7878110/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/7878112/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/7878114/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/7878115/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/7878118/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/7878142/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8008478/pasted-from-clipboard.png)
NOTABLE GAMES
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8032490/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8032491/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8032493/pasted-from-clipboard.png)
Some code
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8008523/pasted-from-clipboard.png)
good things
- Multi-target compiler
- Powerful type system
- Expressive syntax
- Static analyzer and optimizer
- Fast compile times, compiler cache
- Trivial-to-easy native interop
- Compile-time code generation
- Small (compiler+std - 6-8mb zipped)
Multi-target compiler
- Single codebase -> multiple target platforms
- Common standard library across targets
- Cheap or zero-cost abstractions for target-specific things
- Conditional compilation and native code injection
- Eval (built-in interpreter)
- Lua
- C#
- Python
- Java
- Neko
- JavaScript
- JVM
- HashLink (and C, kinda)
- C++ (and CPPIA)
- PHP
- SWF (Flash)
Type system: trivial stuff
- basic types
- class/interfaces
- Bullet Three
...yep, it has those
TYPE SYSTEM: FUNCTION TYPE
- AKA function pointer, delegate, callback, etc
- Describes function arguments and return type
- Can include argument names for readability
- Helps with architectural bloat, but beware of callback hell :)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8009050/pasted-from-clipboard.png)
TYPE SYSTEM: TYPE INFERENCE
- unspecified types are inferred from context
- very useful for local vars anonymous function args
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8008797/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8008799/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8008802/pasted-from-clipboard.png)
(keep some balance for good readability and errors)
Type system: TYPE PARAMETERS
- Array<T>, Map<K, V>
- and any custom types and functions
- type parameter constraints
- type parameters are erased from run-time (Java-like)
- @:generic for C++-like templating
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8008755/pasted-from-clipboard.png)
TYPE System: enum
- NOT a glorified number (C-style)
- also known as sum / algebraic / variant type
- great for defining variants of data
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8008958/pasted-from-clipboard.png)
- Processed using pattern matching (more on this later)
- Exhaustiveness checking
- Type parameters and even GADT are supported
TYPE SYSTEM: structure type (and anonymous objects)
- Objects are checked by structure, not type name
- Type-safe duck-typing (AKA structural typing)
- Complemented by anonymous objects
- Useful for config objects, multiple return, etc.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8009003/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8009007/pasted-from-clipboard.png)
(may have some run-time costs, depending on the target)
type system: typedef
- Gives types new names
- Useful for anonymous types (function, structure)
- Useful for shortening parametrized types
- Can have type parameters on their own
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8009136/pasted-from-clipboard.png)
type system: abstract type
- Gives types new meanings
- Compile-time abstractions over types
- Eliminated from run-time (zero cost abstraction)
- Methods, operator overloading, implicit casting
- enum abstract for "classic" enums
- Helps against "primitive obsession"
Type system: abstract type
Example #1: type safety
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8009326/pasted-from-clipboard.png)
Type system: abstract type
Example #2: moar abstraction!
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8009337/pasted-from-clipboard.png)
syntax: pattern matching
- Branching by matching object structure against a pattern
- Patterns can be simple, like basic constants (classic switch)
- Or complex, checking inner structure of values
- Supports or-patterns, variable capture, guards, extractors
- The way to extract arguments from enum values
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8009526/pasted-from-clipboard.png)
SYNTAX: PATTERN MATCHING
example #1: enum
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8009578/pasted-from-clipboard.png)
SYNTAX: PATTERN MATCHING
example #2: structure
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8027418/pasted-from-clipboard.png)
SYNTAX: for loops
- NOT a "C-for" (no init;cond;step)
- Declarative, based on iterators
- Supports key => value iteration
- Standard Array, Map are iterable
- Standard simple Int iterator
- Custom iterators (zero cost with inlining)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8026434/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8026446/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8026451/pasted-from-clipboard.png)
SYNTAX: Array/map Comprehension
- Create Array/Map with for loops
- Short and declarative
- Supports conditions and inner loops
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8026462/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8026474/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8026481/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8026487/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8026981/pasted-from-clipboard.png)
syntax/type system: static extensions
- Static helper methods for any type
- Use like it was a member method
- First argument is the type to attach to
- Enable with using MyExtensions;
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8026611/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8026616/pasted-from-clipboard.png)
syntax/type system: import.hx
- Global or per-directory imports/usings
- Literally a file named import.hx containing imports
- Nice for widely used "framework" things
syntax: everything is an expression
- No separation between statements and expressions
- Almost anything can be used in a value place
- Often more declarative and less imperative
- Useful to avoid repetition in code
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8026810/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8026812/pasted-from-clipboard.png)
syntax: everything is an expression
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8026745/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8033077/pasted-from-clipboard.png)
- Compile-time code generation
- NOT textual replacement (C-like)
- Procedural AST processing
- Extensive compiler API
- Can replace expressions in place
- Can change and define new types
- Access to system API (filesystem, sockets, etc)
- Lots of use cases:
- syntax sugar
- DSLs
- boilerplate generation
- pre-calculation and embedding
- types from static data (e.g. assets)
- custom static analysis
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8027060/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8027061/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8027064/pasted-from-clipboard.png)
example
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8027050/pasted-from-clipboard.png)
less useless macro
example: embedding
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8027250/pasted-from-clipboard.png)
example: type-safe asset access
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8027296/pasted-from-clipboard.png)
example: ui components
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8027179/pasted-from-clipboard.png)
example: shader language
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8027183/pasted-from-clipboard.png)
example: serialization
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8027187/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8027327/pasted-from-clipboard.png)
example: web routing
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8027238/pasted-from-clipboard.png)
- Dead code elimination
- Tail recursion elimination
- Explicit inlining
- Const/copy propagation
- Loop unrolling
- etc.
- Care required for untyped parts
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8027483/pasted-from-clipboard.png)
...doesn't take 7.5m years to calculate
![](https://s3.amazonaws.com/media-p.slid.es/uploads/80378/images/8033555/pasted-from-clipboard.png)
bad things (compared to big players)
- Well-unknown
- Small community
- No big-tech support
- Not enough quality libraries
- Standard lib is barebones
- Some undefined behaviour
- Tooling is still lacking
thank you!
Haxe
By Dan Korostelev
Haxe
- 1,427