Haxe | ||
İlk versiyonun tarihi | 16 Mayıs 2006 | |
---|---|---|
Yazar | Nicolas cannasse | |
Son sürüm | 4.2.1 (26 Şubat 2021) | |
Yazıyor | Dinamik , statik , aday | |
Tarafından etkilenmiş | Java , OCaml , ActionScript | |
Yazılmış | OCaml | |
İşletim sistemi | Android , iOS , Windows , GNU / Linux , Mac OS X | |
Lisans | GNU GPL ve MIT lisansı | |
İnternet sitesi | haxe.org | |
Dosya uzantıları | .hx | |
Haxe , bir programlama dilinin , çoklu paradigmanın , çapraz platformun , yüksek seviyenin ve tek bir kaynaktan farklı birçok platform için uygulama üretmek için kullanılan bir derleyicinin adıdır . Ayrıca, GPLv2 lisansı altında dağıtılan ücretsiz ve açık kaynaklı bir yazılımın adıdır . Standart kütüphane altındadır MIT lisansı .
Haxe, sayısal , metin , tablo ve ikili veri türleri ve bazı yaygın dosya formatları gibi tüm platformlarda desteklenen bir dizi ortak işlevi içerir . Haxe ayrıca, özellikle Adobe Flash , C ++ , PHP için belirli platformlara özel programlama arayüzlerini (API) içerir .
Haxe dilinde yazılan kod , ActionScript3 , JavaScript , Java , C ++ , C # , PHP , Python , Lua veya Node.js'de yazılmış bir komut dosyasına "kaynaktan kaynağa" derlenir . Haxe'yi " küçük web formatı " ( SWF ) veya " Neko bayt kodu " veya " HashLink " dediğimiz şeyi üretmek için de kullanabiliriz .
Haxe'nin ana kullanıcıları arasında BBC , Coca-Cola , Disney , Hasbro , Mattel , Nickelodeon , Prezi , TiVo ve Zynga'daki geliştiriciler bulunmaktadır . OpenFL (in) ve Flambe , tek bir kaynaktan çapraz platform içerik oluşturmak için popüler olan Haxe çerçeveleridir .
Haxe mimarisinin en benzersiz yönü, Flash , JavaScript ve sunucu tarafı komut dosyalarını birleşik bir dille destekleme kararıydı . Geleneksel web geliştirme projelerinde, geliştiriciler entegre bir web uygulaması oluşturmak için farklı diller kullanır.
Haxe'nin tüm yönlerini tek bir dilde desteklemesi ve aralarındaki iletişim mantığını basitleştirmesi için kökeni vardır. Bu nedenle, uygulamanın mantığının iletişimin uygulanmasını ele almasına gerek yoktur.
Haxe'nin asıl hedefleri:
Derleyici, bir ön uca ve birkaç arka uca bölünmüştür . Ön uç , kaynak koddan bir Soyut Sözdizimi Ağacı (AST) oluşturur ve tür denetimi, makro genişletme ve AST optimizasyonu gerçekleştirir. Farklı arka uçlar, bu şekilde işlenen AST'yi hedeflerine bağlı olarak kaynak koda veya bayt koduna çevirir.
Derleyici OCaml'de yazılmıştır . Geliştirme ortamları (IDE'ler) için kod tamamlama sağlamak ve derlemeyi hızlandırmak için bir önbellek sağlamak için sunucu modunda kullanılabilir .
Haxe'de desteklenen platformlar "hedefler" olarak bilinir. Bunlar, ilgili kodu veya bayt kodunu oluşturmaktan sorumlu olan derleyicinin arka uç bölümleri için dahili API erişimi sağlayan Haxe modülleridir.
Haxe'nin geliştirilmesine 2005 yılında başlandı. İlk beta sürümü şu ülkelerde mevcuttu:Şubat 2006. Haxe 1.0 yayınlandı17 Mayıs 2006Adobe Flash , JavaScript ve Neko hedefleri desteği ile .
Haxe, Nicolas Cannasse tarafından da oluşturulan derleyici açık kaynak MTASC'nin (in) halefidir ve GNU Genel Kamu Lisansı lisansı altında mevcuttur . Haxe kullanarak uygulama geliştirmek için OCaml bilgisi gerekli değildir.
Haxe dili, Adobe Flash Player ve NekoVM gibi çeşitli sanal makineler için bayt kodu olarak derlenebilir ve Javascript ve Python gibi diller için kaynak kodu oluşturabilir .
Birden çok programlama diline derleme stratejisi, "bir kez yaz, her yerde çalıştır" paradigmasından esinlenmiştir . Bu, programcının görevi için en iyi seçenekleri seçmesine olanak tanır.
Jeneratör | çıkış | Platform | kullanım | Dan beri |
---|---|---|---|---|
AVM1 | bayt kodu | Adobe Flash Player 6+ | Masaüstü, Gezgin | 2005 (alfa) |
AVM2 | bayt kodu | Adobe Flash Player 9+, Adobe AIR , Tamarin VM | Masaüstü, tarayıcı, sunucu | 2005 (alfa) |
ActionScript 3 | kaynak | Adobe Flash Player 9+ | Sunucu, ofis | 2007 (1.12) |
C ++ (hxcpp) | kaynak | Windows , Linux , macOS | Sunucu, ofis, CLI | 2009 (2.04) |
C ++ | kaynak | Android , Apple iOS , Palm webOS | Cep Telefonu | 2009 (2.04) |
VS# | kaynak | .NET Framework | Sunucu, ofis, mobil | 2012 (2.10) |
HashLink | kaynak | HashLink | Sunucu, ofis | 2016 (3.3) |
Java | kaynak | Java | Sunucu, ofis | 2012 (2.10) |
Javascript | kaynak | HTML5 , NodeJS , PhoneGap | Sunucu, masaüstü, tarayıcı, mobil | 2006 (beta) |
Neko | bayt kodu | NekoVM | Sunucu, ofis, CLI | 2005 (alfa) |
PHP | kaynak | PHP | Sunucu | 2008 (2.0) |
Python | kaynak | Python | CLI, web, ofis | 2014 (3.2) |
Lua | kaynak | Lua | CLI, web, masaüstü, mobil | 2016 (3.3) |
Haxe, nesne yönelimli programlamayı , genel programlamayı ve çeşitli fonksiyonel programlama yapılarını destekleyen bir dildir . Gibi özellikler tekrarlamalar , istisnalar ve hatta yansıması dilinin temel özellikleridir. Haxe hem güçlü hem de dinamik bir tip sistemine sahiptir . Derleyici, türleri dolaylı olarak kontrol edecek ve derleme hataları verecektir. Ayrıca, programcılara hedeflenen platform için tür kontrolünü atlama ve dinamik yazmayı kullanma seçeneği sunar.
Haxe, esnek ve sofistike bir tip sisteme sahiptir. Kullanılabilir türler, sınıflar , arayüzler, işlevlerin yanı sıra anonim türler, cebirsel veri türleri ( enum) ve soyut türlerdir ( abstract). Parametreli polimorfizmi jenerik programlamaya izin veren sınıflar, fonksiyonlar ve cebirsel türü için mümkündür. Polimorfik fonksiyonlardaki varyans böylece desteklenir.
Varsayılan olarak, onu destekleyen bir hedefle kullanılmak üzere dinamik yazım ek açıklamaları olmadığı sürece yazma statiktir . Tip kontrolü , yapısal tip sisteminin kullanıldığı anonim tipler haricinde , aday tip sistemini kullanır . Son olarak, tür çıkarımı desteklenir ve bir değişkenin tür ek açıklaması olmadan bildirilmesine izin verilir.
classHaxe (anahtar kelime ) sınıfları , Java veya ActionScript 3'tekilere benzer . Alanları, her biri statik veya her bir örneğe özgü yöntemler, değişkenler veya özellikler olabilir. Haxe, erişimcileri publicve privateek açıklamalarla belirtilen daha gelişmiş erişim denetimi yöntemlerini destekler . Statik sabit değişkenler ve yöntemler , anahtar kelime ile satır içi uzantıyı kullanabilir inline.
Haxe'deki arayüzler, örneğin Java'daki arayüzlere çok benzer.
interface ICreature { public var dateDeNaissance:Date; public var nom:String; public function age():Int; } class Mouche implements ICreature { public var dateDeNaissance:Date; public var nom:String; public function age():Int return Date.now().getFullYear() - dateDeNaissance.getFullYear(); }Listelenen tipleri dilin önemli bir parçasıdır; onlar olabilir parametreli ve özyinelemeli olun. Haskell ve ML'ye benzer ürün türlerinin dahil edilmesine izin vererek cebirsel veri türleri için temel destek sağlarlar . Bir uygulayabilirsiniz desen filtreleme karmaşık sorunlara zarif çözümler sağlayan sayılan değerlere.switch
enum Couleur { Rouge; Vert; Bleu; RGB( r : Int, g : Int, b : Int ); } class Couleurs { static function versInt ( c : Couleur ) : Int { return switch ( c ) { case Rouge: 0xFF0000; case Vert: 0x00FF00; case Bleu: 0x0000FF; case RGB(r, g, b): (r << 16) | (g << 8) | b; } } static function appelsPermis() { var rouge = versInt(Couleur.Rouge); var rgbint = versInt(Couleur.RGB(100, 100, 100)); } }Parametreli numaralandırılmış türlerin örnekleri, Option ve Her iki tür gibi Haxe standart kitaplığında mevcuttur .
enum Option<T> { Some(v:T); None; } enum Either<L, R> { Left(v:L); Right(v:R); }Haxe ayrıca genelleştirilmiş cebirsel türleri de destekler .
Anonim türler, yapıları açıkça belirtilerek tanımlanır. Fonksiyon argümanlarının yapısal tiplemesini uygulamak için kullanılabilirler (aşağıya bakın) ve anahtar kelimeyle takma ad olabilirler typedef.
typedef AliasForAnon = { a:Int, b:String, c:Float->Void };Haxe'de işlevler birinci sınıf nesnelerdir . Türleri, birçok işlevsel programlama dilinde olduğu gibi, bağımsız değişken türleri arasında ve bağımsız değişken türleri ile dönüş türü arasında oklar kullanılarak not edilir . Ancak, aksine Haskell ve dillerine ML ailesi , tüm fonksiyonları (bir tek argüman alan fonksiyonu) tekli vardır. Bu nedenle, aşağıdaki türlerin imzaları daha önce bahsedilen dillerden farklı anlamlara sahiptir. Tür F, argüman olarak bir tamsayı ( Int) ve bir karakter dizesi ( String) alan ve real ( Float) türünde bir değer döndüren bir işlevdir .
Yalnızca tek işlevli bir dilde aynı gösterim, birini parametre olarak alan bir işleve atıfta bulunur ve bir tür işlevi Intdöndürür String->Float.
Türler F2ve F3aynı türe karşılık gelir. Bunlar, türden bir ikili işlev döndüren ikili işlevlerdir F. Bunun için F3, bir işlev türünde bir işlev türünü tanımlamak için sözdizimi kullanılır.
typedef F = Int->String->Float; typedef F2 = Int->String->F; typedef F3 = Int->String->(Int->String->Float);Haxe'nin tip sistemine en son eklenen, soyut tipler kavramıdır . Haxe'de geleneksel soyut türlerden farklıdırlar . Farklı türler arasında örtük dönüşümler yapmak için kullanılırlar ve mevcut türlerin ölçü birimi türleri gibi belirli amaçlar için yeniden kullanılmasına izin verirler. Bu, aynı türden, ancak farklı anlambilimle (örneğin, mil ve kilometre) değerlerin karıştırılmasını büyük ölçüde azaltır.
Aşağıdaki örnek, metrik sistemin varsayılan sistem olduğunu varsayar ve yanlış formattaki mevcut veriler için kilometreden kilometreye dönüşüm gerektirir. Dolayısıyla bu örnek, milleri otomatik olarak kilometreye dönüştürür, ancak tersi olmaz.
abstract Kilometre(Float) { public function new(v:Float) this = v; } abstract Mile(Float) { public function new(v:Float) this = v; @:to public inline function toKilometre():Kilometre return (new Kilometre(this / 0.62137)); } class Test { static var km:Kilometre; static function main(){ var centMiles = new Mile(100); km = centMiles; trace(km); // 160.935 } }Örnekte gösterildiği gibi, atamayı gerçekleştirmek için açık bir dönüştürme gerekmez km = centMiles.
Çoğunda fonksiyonel programlama dilleri , yapısal yazarak önemli bir rol oynar. Haxe , adlandırılmış türler kullanıldığında , nesne yönelimli programlamanın kayıtlı sistem türlerini kullanmadan, anonim türler aracılığıyla uygulanır . Haxe'ın anonim türleri, Go dilinin örtük arayüzlerine benzer . Go arayüzlerinden farklı olarak, anonim bir türden bir değer oluşturmak mümkündür.
class FooBar { public var foo:Int; public var bar:String; public function new(){ foo=1; bar="2";} function anyFooBar(v:{foo:Int,bar:String}) trace(v.foo); static function test(){ var fb = new FooBar(); fb.anyFooBar(fb); fb.anyFooBar({foo:123,bar:"456"}); } }Ayrıca Haxe platformunda:
Diğer çapraz platform dilleri: