Haxe | |
---|---|
Kieliluokka | Moniparadigma |
Esiintyi | 2005 |
Kehittäjä | Haxin säätiö |
Vapauta | 4.2.5 ( 6. maaliskuuta 2022 ) |
Tyyppijärjestelmä | staattinen , dynaaminen merkintöjen kautta |
Vaikutettu | Java , OCaml , ActionScript ja MTASC [1] |
Lisenssi | GPL v2, kirjasto: MIT |
Verkkosivusto | haxe.org |
Alusta | ARM , IA-32 , x64 |
OS | Android , iOS _ Linux , macOS , Windows |
Haxe on avoimen lähdekoodin , korkean tason, monialustainen ohjelmointikieli ja kääntäjä , jota voidaan käyttää sovellusten rakentamiseen ja lähdekoodin luomiseen eri alustoille säilyttäen samalla yhtä koodikantaa [2] [3] [4] [5] .
Haxe sisältää kaikilla alustoilla tuettuja toimintoja , kuten numeerisia tietotyyppejä, merkkijonoja , taulukoita , sekä tukea joillekin tiedostomuodoille ( xml , zip ) [3] [6] . Haxe sisältää myös tuen erityisille API-liittymille jokaiselle kohdekääntäjäalustalle.
Haxe-kielellä kirjoitettu koodi voidaan kääntää JavaScript , C++ , Java , JVM , PHP , C# , Python , Lua ja Node.js [7] koodiksi . Haxe-koodi käännetään myös SWF:ksi, HashLinkiksi ja Nekoksi , tavukoodiksi , ja se voidaan suorittaa myös tulkintatilassa [7] .
Haxen pääkäyttäjät ovat TiVo , Prezi , Nickelodeon , Disney , Mattel , Hasbro , Coca Cola , Toyota ja BBC [8] [9] . OpenFL ja Flambe ovat suosittuja Haxe-kehyksiä usean alustan sisällön ja ohjelmien luomiseen yhdestä koodikannasta [9] . Lisäksi Snõwkit [10] kehittyy parhaillaan aktiivisesti . Koska Adobe Flash -teknologia on viime vuosina siirtynyt yhä enemmän HTML5 :n hyväksi , Haxe, Unity ja muut monialustaiset työkalut käyttävät yhä enemmän aikaa jälkimmäiseen säilyttäen samalla Adobe Flash Playerin taaksepäin tuen [9] [11] .
Merkittävin näkökohta Haxe-arkkitehtuurin kehityksessä oli päätös tukea Adobe Flash-, JavaScript- ja palvelinsovelluksia yhdessä koodikannassa [12] [13] . Tyypillisissä verkkoprojekteissa kehittäjien on käytettävä monia eri kieliä rakentaakseen täydellisen verkkosovelluksen [12] [13] :
Haxe luotiin ajatuksella yhdistää kaikki nämä komponentit yhdeksi koodipohjaksi sekä yksinkertaistaa sovelluskomponenttien välistä vuorovaikutusta [12] [13] [14] .
Nicholas Kennessyn (Haxe-projektin perustaja) kirjoittama kirja kertoo Haxen luomisen alkuperäiset tavoitteet [12] :
Haxe-kääntäjä on jaettu yhteen käyttöliittymään ja useisiin taustaohjelmiin. Käyttöliittymä vastaa jäsentämisestä ja tyypin tarkistuksesta, makrojen soveltamisesta, yleisestä optimoinnista, erilaisista koodimuunnoksista ja koodin väliesityksen luomisesta abstraktin syntaksipuun ( ASD) muodossa. Jokainen taustaohjelma on vastuussa tämän AST:n kääntämisestä kohdealustan lähdekoodiksi tai tavukoodiksi .
Kääntäjä on kirjoitettu OCamlilla . Sitä voidaan käyttää palvelintilassa koodin viimeistelyn tukemiseksi IDE:ssä, ja tässä tilassa tuetaan myös välimuistia käännösajan lyhentämiseksi [15] .
Haxe-kääntäjä on optimoiva kääntäjä , joka käyttää myös funktioiden korvaamista , jatkuvaa taittoa , kuolleen koodin poistoa (DCE) optimoidakseen koottujen ohjelmien suorituskyvyn.
Haxessa kirjoitettujen ohjelmien suorituskyky riippuu kohdealustasta.
Haxen kehitys aloitettiin lokakuussa 2005 [20] ja ensimmäinen beta-versio julkaistiin helmikuussa 2006. Haxe 1.0 julkaistiin huhtikuussa 2006 ja se tuki hahmontamista Adobe Flashiin , Javascriptiin ja Nekoon .
Haxen ovat kehittäneet Nicolas Cannasse ja muut, ja sen nimi oli alun perin haXe , koska se on lyhyt, yksinkertainen nimi ja "sen nimessä on X" -ominaisuus, joka on välttämätön uuden tekniikan menestymiselle. kieli [21] .
Haxe on avoimen lähdekoodin ActionScript 2 :n seuraaja MTASC- kääntäjälle, jonka myös teki Nicholas Hennessy [12] [22] ja joka on julkaistu GNU General Public License -lisenssin versiolla 2 tai uudemmalla [23] .
Haxella on paljon yhteistä ActionScript 3 :n kanssa . Haxe-kääntäjä on kehitetty OCaml -kielellä , mutta Haxella kirjoittaminen ei edellytä OCamlin tuntemusta.
Haxen käytön etuja ovat:
Suositeltu IDE Haxe-kehitykseen on FlashDevelop [12] , joka tukee ActionScript 2, 3 ja Haxea pääkielinä syntaksin korostuksella , koodin viimeistelyllä ja muilla ominaisuuksilla [12] [25] . Tämä IDE tukee myös koodin taittoa , uudelleenmuodostusta ja interaktiivista virheenkorjausta . [26]
Voidakseen käyttää olemassa olevaa koodia avoimen lähdekoodin yhteisö on luonut lähdekoodin muuntajia seuraaville:
Haxe-kieli voidaan kääntää erilaisten virtuaalikoneiden, kuten Adobe Flash Playerin ja Nekon , tavukoodiksi sekä ActionScript 3 :ksi , JavaScript - lähdekoodiksi , mukaan lukien kokeellisesti tuetut C++ ja C# . Tämä eri lähteisiin "kokoamisen" strategia kehitettiin "kirjoita kerran, juokse missä tahansa" -mallin inspiraation alaisena. Tämän strategian avulla ohjelmoija voi myös valita parhaan alustan ohjelmille.
Koodigeneraattori | Tulos | Alusta | Käyttö | Mistä Haxen versiosta |
---|---|---|---|---|
AVM1 [6] | Tavukoodi | Adobe Flash Player 6+ | Työpöytä, selain | 2005 (alfa) |
AVM2 [6] | Tavukoodi | Adobe Flash Player 9+, Adobe AIR , Tamarin VM | Työpöytä, selain, palvelin | 2005 (alfa) |
ActionScript 3 [6] | Lähde | Adobe Flash Player 9+ | Palvelin, työpöytä | 2007 (1.12) |
C++ (hxcpp) [6] | Lähde | Windows, Linux, Mac OS X | Palvelin, työpöytä, CLI | 2009 (2.04) |
C++ | Lähde | Android [29] , Apple iOS [30] , Palm webOS [31] | mobiili | 2009 (2.04) |
C# [6] | Lähde | .NET Framework | Palvelin, pöytäkone, mobiili | 2012 (2.10) |
Java [6] | Lähde | Java | Palvelin, työpöytä | 2012 (2.10) |
JavaScript [6] | Lähde | HTML5 , Node.js , PhoneGap | Palvelin, pöytäkone, selain, mobiili | 2006 (beta) |
Neko [6] | Tavukoodi | NekoVM | Palvelin, työpöytä, CLI | 2005 (alfa) |
PHP [6] | Lähde | PHP | palvelin | 2008 (2,0) |
Python [6] | Lähde | Python | CLI, Web, työpöytä | 2014 (3,2) |
Lua [32] | Lähde | Lua | Verkko, työpöytä, mobiili | 2016 (3,3) |
Haxe on yleiskäyttöinen oliokieli , joka tukee poikkeusten käsittelyä ja luokkaparametrien tyyppipäätelmiä . Kieli ja kirjastot tukevat myös yleistä ohjelmointia , reflektiota , iteraattoria ja toiminnallista ohjelmointia [33] . Haxe myös, toisin kuin monet muut kielet, tukee sekä staattista että dynaamista kirjoitusta samanaikaisesti. Kääntäjä voi tarkistaa tyyppipäätelmän ja heittää käännösaikavirheitä, mutta kehittäjät voivat myös kytkeä tyyppitarkistuksen pois päältä ja luottaa kohdealustan dynaamiseen tyyppitarkistukseen.
Haxe-kieli on samanlainen kuin ECMAScript , vaikka käytännössä mitään ECMAScript-koodia ei voida kääntää Haxessa ilman muutoksia. Toisin kuin ECMAScript, Haxe on käännetty kieli . Haxeen vaikuttivat ActionScript , Java ja OCaml [13] .
Koska Haxe perustui ActionScript 3 :een , se tukee kaikkia Flash API:n ominaisuuksia, vaikka se vaatiikin parempaa koodausta ja korkeampia kehitysstandardeja kuin Adoben kääntäjät.
Tämä ohjelma kirjoittaa "Hello World" kääntämisen ja suorittamisen jälkeen:
class Main { staattinen toiminto main () { trace ( "Hei maailma" ); } }Voit testata tätä koodia tallentamalla sen tiedostoon, jolla on nimi Main.hxja suorittamalla Haxe-kääntäjän seuraavilla vaihtoehdoilla: haxe -main Main --interp. Tämä komento käynnistää Haxe Compilerin koodin tulkintatilassa ja näyttää Main.hx:3: Hello world.
Haxe on staattisesti kirjoitettu kieli. Siinä on monimuotoinen järjestelmä, joka sisältää luokat, rajapinnat, toiminnalliset tyypit, anonyymit tyypit, algebralliset tietotyypit ( ADT:t, joita kutsutaan nimellä " enums " Haxessa) sekä abstrakteja tietotyyppejä. Luokat, algebralliset tietotyypit ja funktiotyypit tukevat tyypin poistamiseen perustuvaa parametrista polymorfismia , jota kutsutaan usein "yleisiksi" muissa oliokielissä.
Haxe sisältää tuen rajoitetulle polymorfismille ja alatyyppipolymorfismille .
Lisäksi Haxe tukee rakenteellista tyypitystä ja nimellistä tyypitystä . Ohjelmoijien asioiden helpottamiseksi ja tyyppiturvallisuudesta tinkimättä Haxe tukee tyyppipäätelmää, mikä monissa tapauksissa poistaa tarpeen kirjoittaa tyyppejä manuaalisesti.
Luokat (avainsana "luokka") Haxessa ovat samanlaisia kuin Javassa tai AS3 :ssa . Niiden kentät voivat olla menetelmiä, staattisia luokkamuuttujia tai luokan ilmentymän ominaisuuksia. Haxe tukee "julkisia" ja "yksityisiä" pääsymääritteitä sekä edistyneempiä kulunvalvontamenetelmiä (ACL:t, linkit), jotka kuvataan huomautuksilla. Menetelmät ja staattiset muuttujat, joilla on vakioarvo, voidaan rivittää käyttämällä "inline"-avainsanaa.
Haxen käyttöliittymät ovat samanlaisia kuin Java - rajapinnat .
käyttöliittymä ICreature { public var birth : Date ; julkinen var nimi : String ; julkisen tehtävän ikä (): Int ; } class Fly toteuttaa ICreaturen { julkinen var syntymä : Päivämäärä ; julkinen var nimi : String ; julkinen toiminta ikä () : Väliaikainen palautuspäivä . nyt (). getFullYear () - syntymä . getFullYear (); }Luetteloidut tyypit ovat kielen keskeinen ominaisuus. Enumeissa voi olla omat parametrinsa, ja ne voivat olla myös rekursiivisia [34] . Ne ovat samanlaisia kuin algebralliset tietotyypit , koska ne ovat kielillä, kuten ML tai Haskell . Tarkkaan ottaen nämä ovat oikeita summatyyppejä edellyttäen, että niihin sisältyvät tuotetyypit on määriteltävä näiden summatyyppien sisällä. Tämä tarkoittaa, että enumeita ei nimetä vain "maagisiksi numeroiksi", kuten useimmissa kielissä, ne voivat ratkaista tyylikkäästi monimutkaisia arkkitehtonisia ongelmia:
enum Väri { punainen ; vihreä ; sininen ; rgb ( r : Int , g : Int , b : Int ); } luokka Värit { staattinen funktio toInt ( c : Väri ) : Int { paluukytkin ( c ) { tapaus punainen : 0xFF0000 ; _ kotelo vihreä : 0x00FF00 ; kotelo sininen : 0x0000FF_ _ tapaus rgb ( r , g , b ): ( r << 16 ) | ( g << 8 ) | b ; } } staattinen funktio validCalls () { var redint = toInt ( Väri . punainen ); var rgbint = toInt ( väri . rgb ( 100 , 100 , 100 )); } }Haxe tukee myös parametrisia enum-tyyppejä. Esimerkki on tyyppien Option, Joko ja ConsList toteutus, ja ConsList on myös rekursiivinen:
enum Optio < T > { Jotkut ( v : T ); ei yhtään ; } enum Joko < T , U > { Vasen ( v : T ); Oikea ( v : U ); } enum ConsList < T > { Nolla ; Miinukset ( pää : T , häntä : ConsList < T >); }Sivuston dokumentaatio osoittaa [35] , että Haxe tukee myös yleistettyjä algebrallisia tyyppejä (GADT), mutta ei anna esimerkkiä sellaisen luomisesta.
Anonyymit tyypit määritellään niiden rakenteen selkeällä kuvauksella, niille voidaan myös määrittää alias tyyppimääritelmän avulla (avainsana "typedef"):
typedef Anon = { a : Int , b : String , c : Float -> Void };Funktiotyypit ovat ensimmäisen luokan objekteja Haxessa. Ne kuvataan nuolilla argumenttityyppien välillä sekä tyyppien ja palautusarvon välillä, kuten monissa muissa toiminnallisissa kielissä. Toisin kuin Haskell tai ML -perhe , kaikki Haxen funktiot eivät ole unaarisia (funktioita yhdellä argumentilla), niitä ei voi käyttää oletuksena osittain . Siten seuraavien esimerkkien tyyppiallekirjoituksilla on eri merkitys kuin yllä olevilla kielillä.
Tyyppi F on funktio, joka ottaa Int:n ja Stringin argumentteina ja palauttaa tuloksena Floatin.
Kielessä, jossa on vain unaarifunktioita, tämä tyyppi tarkoittaisi funktiota, joka ottaa argumenttina Int:n ja palauttaa funktion, jonka tyyppi on String->Float.
Tyypit F2 ja F3 kuvaavat samaa tyyppiä. Ne molemmat kuvaavat binäärifunktioita, jotka palauttavat tyypin F binäärifunktion. F2:lle kuvataan tapaus, jossa funktiotyyppiä käytetään toisen määritelmän sisällä.
typedef F = Int -> String -> Float ; typedef F2 = Int -> Merkkijono -> F ; typedef F3 = Int -> String ->( Int -> String -> Float );Konsepti, jota kutsutaan abstrakteiksi tyypeiksi , on viimeisin lisäys Haxe-tyyppijärjestelmään. Niiden avulla olemassa olevia tyyppejä voidaan käyttää uudelleen tiettyihin tarkoituksiin, kuten mittayksiköiden tyyppien toteuttamiseen, samalla kun se vähentää huomattavasti eri järjestelmien (kuten mailien ja kilometrien) sekoittamisen mahdollisuutta. Termillä "abstrakti tyyppi" on Haxen kielen kontekstissa eri merkitys kuin tavallisilla abstrakteilla tyypeillä .
Seuraavassa esimerkissä oletetaan, että metrijärjestelmää käytetään oletuksena ja että vanhojen tietojen tukeminen edellyttää muuntamista maileiksi. Haxe pystyy automaattisesti muuttamaan mailit kilometreiksi, mutta ei päinvastoin.
abstrakti Kilometri ( Float ) { public function new ( v : Float ) this = v ; } abstrakti Maili ( Kellu ) { public function new ( v : Float ) this = v ; @: julkiseen rivifunktioon toKilometer (): Kilometer return ( new Kilometer ( this / 0.62137 ) ); } luokka Testi { staattinen vaihtelu km : Kilometri ; staattinen funktio main (){ var one100Miles = new Mailia ( 100 ); km = yksi100 mailia ; jäljittää ( km ); // 160.935 } }km = one100Miles;Esimerkki osoittaa, että oikeiden yksiköiden käyttämiseksi ei tarvitse tehdä nimenomaista muuntamista .
Rakenteellisella kirjoituksella on tärkeä rooli monissa toiminnallisissa ohjelmointikielissä ja samalla melko pieni yleisissä OOP-kielissä. Toisin kuin nimellinen tyyppijärjestelmä, kahden tyypin yhtäläisyys ei määräydy minkään tyyppinimen yhtäläisyyden perusteella, vaan pikemminkin tyypin rakenteen perusteella. Rakennetyyppejä voidaan pitää implisiittisinä rajapinnoina:
class FooBar { julkinen var foo : Int ; public var bar : String ; julkinen funktio new (){ foo = 1 ; palkki = "2" ;} function anyFooBar ( v :{ foo : Int , bar : String }) trace ( v . foo ); staattinen toimintotesti (){ var fb = new FooBar ( ); fb . anyFooBar ( fb ); fb . anyFooBar ({ foo : 123 , bar : "456" }); } }Myös Haxe-alustalla:
Muut JavaScriptiin käännettävät kielet:
Muut monikäyttöiset kielet:
Adobe Flash | |
---|---|
Tiedostomuodot | |
Toteutukset | flash peli |
Muut versiot | |
Kirjastot |
|
Virtuaalikoneet | |
Katso myös |
|