Смешанный
![]() | |
Парадигма | Мультипарадигмальность : объектно-ориентированная , функциональная , универсальная. |
---|---|
Семья | ECMAScript |
Разработчик | Фонд Хаксе |
Впервые появился | 14 ноября 2005 г |
Стабильная версия | 4.3.5 [1] ![]() |
Дисциплина набора текста | статический , динамический через аннотации, номинальный |
Объем | лексический |
Язык реализации | OCaml |
Платформа | IA-32 , x86-64 , AArch64 , Armel, Armhf , MIPS, MIPS64el, MIPSel , ppc64el , s390x |
ТЫ | Андроид , iOS ; Linux , MacOS , Windows |
Лицензия | GPL 2.0, библиотека: Массачусетский технологический институт |
Расширения имен файлов | .hx, .hxml |
Веб-сайт | смешивание |
Под влиянием | |
ECMAScript , JavaScript , ActionScript , OCaml , Java , C++ , PHP , C# , Python , Lua , NekoVM |
Haxe — это высокого уровня кроссплатформенный язык программирования и компилятор , который может создавать приложения и исходный код для множества различных вычислительных платформ из одной базы кода. Это бесплатное программное обеспечение с открытым исходным кодом , выпущенное под лицензией MIT . [2] Компилятор, написанный на OCaml , распространяется под лицензией GNU General Public License (GPL) версии 2.
Haxe включает в себя набор функций и стандартную библиотеку. [3] поддерживается на всех платформах , включая числовые типы данных , строки , массивы , карты , двоичные файлы , рефлексивное программирование , математику, протокол передачи гипертекста ( HTTP ), файловую систему и распространенные форматы файлов . ) для конкретной платформы Haxe также включает в себя интерфейсы прикладного программирования ( API для каждой цели компилятора. [4] Kha , OpenFL и Heaps.io — популярные фреймворки Haxe, которые позволяют создавать многоплатформенный контент из одной базы кода. [5]
Haxe возник с идеей поддержки клиентского и серверного программирования на одном языке и упрощения логики взаимодействия между ними. [6] Код, написанный на Haxe, можно скомпилировать в JavaScript , C++ , Java , JVM , PHP , C# , Python , Lua. [7] и Node.js. [8] Haxe также может напрямую компилировать SWF , HashLink и NekoVM байт-код , а также работать в интерпретируемом режиме. [9]
Haxe поддерживает externs (файлы определений), которые могут содержать информацию о типах данных существующих библиотек для описания целевого взаимодействия типобезопасным способом, например, C++ файлы заголовков могут описывать структуру существующих объектных файлов . Это позволяет использовать значения, определенные в файлах, как если бы они были статически типизированными объектами Haxe. Помимо внешних средств, существуют и другие решения для доступа к собственным возможностям каждой платформы.
Многие популярные IDE и редакторы исходного кода поддерживают разработку Haxe. [10] Haxe Foundation официально не рекомендует какую-либо конкретную среду разработки или набор инструментов, хотя VS Code , IntelliJ IDEA и HaxeDevelop имеют наибольшую поддержку разработки Haxe. Основные функции подсветки синтаксиса , завершения кода , рефакторинга , отладки и т. д. доступны в различной степени.
История
[ редактировать ]Разработка Haxe началась в октябре 2005 года. Первая альфа-версия была выпущена 14 ноября 2005 года. [11] [12] Haxe 1.0 был выпущен в апреле 2006 года с поддержкой программ Adobe Flash , JavaScript и NekoVM . Поддержка PHP была добавлена в 2008 году, а C++ — в 2009 году. Дополнительные платформы, такие как C# и Java, были добавлены после капитального ремонта компилятора в 2012 году.
Haxe был разработан Николя Каннассом и другими участниками и первоначально назывался haXe. [13] потому что он был коротким, простым и «имеет X внутри», что, как с юмором утверждает автор, необходимо для успеха любой новой технологии. [14]
Haxe является преемником компилятора ActionScript 2 с открытым исходным кодом MTASC . [15] также создан Николя Каннассом и выпущен под лицензией GNU General Public License версии 2 или более поздней.
Компилятор
[ редактировать ]Язык Haxe может компилироваться в байт-код , который может выполняться непосредственно виртуальными машинами, на которые он нацелен. Он может компилироваться в исходный код на C++ , JavaScript , PHP , C# , Java , Python и Lua . У Haxe также есть интерпретатор eval . [16] Этот же интерпретатор также используется во время компиляции для запуска макросов, которые позволяют изменять абстрактное синтаксическое дерево (AST).
Эта стратегия компиляции на несколько языков исходного кода основана на парадигме «запись один раз, запуск где угодно» . Это также позволяет программисту выбрать лучшую платформу для работы. Типичные программы Haxe работают одинаково на всех платформах, но разработчики могут указать код, специфичный для платформы, и использовать условную компиляцию , чтобы предотвратить его компиляцию на других платформах.
Компилятор Haxe является оптимизирующим компилятором и использует встраивание полей и функций , устранение хвостовой рекурсии , свертывание констант , развертывание цикла и устранение мертвого кода (DCE) для оптимизации производительности скомпилированных программ во время выполнения. [17] Компилятор Haxe предлагает опцию null-safety , он проверяет время компиляции на наличие значений, допускающих значение NULL.
Цели
[ редактировать ]В Haxe поддерживаемые платформы известны как «цели» и состоят из следующих модулей:
- Серверные компиляторы, отвечающие за генерацию соответствующего кода.
- Специальные API-интерфейсы времени выполнения, выходящие за рамки поддержки основного языка (цели платформы).
В следующей таблице описана платформа и языковая поддержка Haxe. Язык Haxe позволяет разработчикам получить доступ ко многим функциям платформы, но Haxe не является полнофункциональным движком, им могут потребоваться фреймворки, позволяющие создавать контент для определенных платформ.
Имя | Уровень | Выход | Платформа | Использовать | Начиная с версии Haxe |
---|---|---|---|---|---|
Ничего | 3 | байт-код | НекоВМ | Сервер, рабочий стол, CLI | 2005 (альфа) |
Флэш/SWF | 3 | байт-код | Flash : AVM2 , Flash Player 9+, AIR | Рабочий стол, браузер, сервер | 2005 (альфа) |
JavaScript | 1 | источник | JavaScript : HTML5 , NodeJS , PhoneGap. | Сервер, настольный компьютер, браузер, мобильный телефон | 2006 г. (бета) |
ActionScript | — | источник | ActionScript 3 : AIR , Flex , Royale | Сервер, настольный компьютер, браузер, мобильный телефон | 2007 г. (1.12), удалено с 2019 г. (4.0) |
PHP | 1 | источник | PHP : Zend-движок | Сервер | 2008 (2.0) PHP 5 ; PHP 7 с 2019 г. (4.0) |
С++ | 2 | источник | C++ : Windows , Linux , macOS , Android , iOS , Palm , WebOS | Сервер, настольный компьютер, мобильный телефон, интерфейс командной строки, игровые консоли | 2009 г. (2,04); cppia добавлено в 2014 г. (3.2) |
С# | 3 | источник | C# : .NET Framework, .NET Core , Mono | Сервер, настольный компьютер, мобильный | 2012 (2.10) |
Ява | 3 | источник | Java : Java OpenJDK. | Сервер, десктоп | 2012 (2.10) |
Питон | 3 | источник | Питон | CLI, веб, рабочий стол | 2014 (3.2) |
Два | 2 | источник | Два | CLI, веб, настольный компьютер, мобильный телефон | 2016 (3.3) |
ХэшСсылка | 1 | байт-код | HashLink VM или HL/C (компилировать в файл C) | Сервер, настольный компьютер, мобильный телефон, игровые консоли (экспорт C) | 2016 (3.4) |
JVM | 1 | байт-код | JVM : HotSpot , OpenJ9 | Сервер, десктоп | 2019 (4.0) |
Оценить | 1 | устный переводчик | Это переводчик | Прототипирование, скриптинг | 2019 (4.0) |
Преимущества
[ редактировать ]- Возможность ориентироваться на несколько платформ и устройств, используя один и тот же язык.
- Умение использовать строго типизированный код
- Возможность использования макросов (преобразование синтаксиса), которое можно выполнить с помощью языка Haxe. [18]
- Добавлены функции языка, такие как методы расширения и функциональное программирование.
- Скорость выполнения программ Haxe сопоставима с рукописными источниками. [19]
Язык
[ редактировать ]Haxe — это язык программирования общего назначения, поддерживающий объектно-ориентированное программирование , обобщенное программирование и различные функционального программирования конструкции . Такие возможности, как итерации , исключения и рефлексивное программирование (отражение кода), также являются встроенными функциями языка и библиотек. Необычный среди языков программирования, Haxe содержит систему типов одновременно строгую и динамичную . Компилятор будет проверять типы неявно посредством вывода типа и выдавать ошибки во время компиляции, но он также позволяет программам обходить проверку типов и полагаться на динамическую обработку типов целевой платформы. Можно использовать все собственные целевые API.
Типовая система
[ редактировать ]Haxe имеет сложную и гибкую систему типов. Типы типов, которые он предлагает, — это классы , интерфейсы, типы функций-методов, анонимные типы, алгебраические типы данных (называемые enum в Haxe) и абстрактные типы. Параметрический полиморфизм возможен с классами, алгебраическими типами и типами функций, обеспечивая языковую поддержку универсального программирования, основанного на стирании типов. Это включает поддержку вариативности в полиморфных функциях , но не в конструкторах типов .
Система типов является статической аннотации для динамической типизации , если не присутствуют для использования с целями, которые их поддерживают. Проверка типов следует за номинальной типизацией , за исключением анонимных типов , где структурная типизация вместо этого используется . Наконец, вывод типов поддерживается , позволяющий объявлять переменные без аннотаций типов .
Модули и пространства имен
[ редактировать ]Весь код Haxe организован в модули, адресация которых осуществляется с помощью путей. По сути, каждый файл .hx представляет собой модуль, который может содержать несколько типов. Например, чтобы создать тип A
в пакете my.pack , как показано, структура папок должна быть my\pack а файл может иметь формат A.hx. в папке package ,
// file my/pack/A.hx
package my.pack;
class A {}
В других модулях другие типы можно импортировать, поставив import
утверждения под определением пакета, например import my.pack.A;
Модуль может содержать несколько типов, например следующие. Из этого модуля можно импортировать по одному типу, используя import my.pack2.A;
. Тип может быть private
, и в этом случае доступ к нему может получить только содержащий его модуль.
package my.pack2;
typedef A = {a:String}
private typedef B = {b:String}
Классы
[ редактировать ]Классы (ключевое слово class
) в Haxe аналогичны тем, что есть в Java или TypeScript. Их поля могут быть методами, переменными или свойствами, статическими или экземплярными соответственно. Haxe поддерживает средства доступа public
и private
и более продвинутые методы управления доступом, обозначаемые с помощью аннотаций. Методы и статические константные переменные можно встроить с помощью ключевого слова inline
. Поля могут быть помечены как final
объявить константу, которая должна быть инициализирована немедленно или в конструкторе и не может быть записана в случае функции final
будет помечен как непереопределяемый в подклассах.
Интерфейсы в Haxe очень похожи на интерфейсы, например, в Java.
interface ICreature {
public var birth:Date;
public var name:String;
public function age():Int;
}
class Fly implements ICreature {
public var birth:Date;
public var name:String;
public function age():Int return Date.now().getFullYear() - birth.getFullYear();
}
Дженерики
[ редактировать ]Haxe поддерживает общее программирование . Ниже приведен пример функции идентичности .
function identity<T>(arg:T):T {
return arg;
}
Перечислимые типы
[ редактировать ]Перечислимые типы — важная особенность языка; они могут иметь параметры типа и быть рекурсивными. [20] Они обеспечивают базовую поддержку алгебраических типов данных , позволяя включать типы продуктов аналогично Haskell и ML . А switch
Выражение может применять сопоставление шаблонов со значением перечисления, что позволяет элегантно решать сложные проблемы программирования:
enum Color {
red;
green;
blue;
rgb(r:Int, g:Int, b:Int);
}
class Colors {
static function toInt(c:Color):Int {
return switch (c) {
case red: 0xFF0000;
case green: 0x00FF00;
case blue: 0x0000FF;
case rgb(r, g, b): (r << 16) | (g << 8) | b;
}
}
static function validCalls() {
var redint = toInt(Color.red);
var rgbint = toInt(Color.rgb(100, 100, 100));
}
}
Примерами параметрических типов перечислений являются типы стандартной библиотеки Haxe. [21] и Либо: [22]
enum Option<T> {
Some(v:T);
None;
}
enum Either<L, R> {
Left(v:L);
Right(v:R);
}
Haxe также поддерживает обобщенные алгебраические типы данных (GADT). [23] [24]
Анонимные типы
[ редактировать ]Анонимные типы определяются путем явного обозначения их структуры с использованием синтаксиса, который соответствует математическому представлению типа на основе записей. Их можно использовать для реализации структурной типизации аргументов функции (см. ниже), и им можно дать псевдоним с ключевым словом typedef
:
typedef AliasForAnon = { a:Int, b:String, c:Float->Void };
Типы функций
[ редактировать ]Функции — это первоклассные значения в Haxe. Их тип обозначается стрелками между типами аргументов, а также между типами аргументов и возвращаемым типом, как это принято во многих функциональных языках. Однако, в отличие от известных примеров, таких как Haskell или семейство языков ML , не все функции являются унарными (функциями только с одним аргументом), а в Haxe функции не могут применяться частично по умолчанию. Таким образом, следующие сигнатуры типов имеют иную семантику, чем в вышеупомянутых языках. Тип F1
это функция, которая принимает String
в качестве аргументов и возвращает значение типа Float
.
Типы F1
и F2
обозначают тот же тип, за исключением того, что F2
использует помеченный параметр, который полезен для завершения и документирования.
Типы F4
и F5
обозначают один и тот же тип. Обе являются двоичными функциями, которые возвращают двоичную функцию типа F3
. Для F5
используется синтаксис для объявления типа функции внутри типа функции.
typedef F1 = String -> Float;
typedef F2 = (text:String) -> Float;
typedef F3 = (score:Int, text:String) -> Float;
typedef F4 = (score:Int, text:String) -> F3;
typedef F5 = (score:Int, text:String) -> ((score:Int, text:String) -> Float);
Анонимные функции
[ редактировать ]В Haxe анонимные функции называются лямбда-выражениями и используют синтаксис function(argument-list) expression;
.
var f = function(x) return x*x;
f(8); // 64
(function(x,y) return x+y)(5,6); // 11
Абстрактные типы
[ редактировать ]Относительно новым дополнением к системе типов Haxe является концепция, называемая абстрактными типами . В Haxe это относится к чему-то отличному от обычного абстрактного типа . Они используются для неявных преобразований между типами, позволяя повторно использовать существующие типы для определенных целей, например реализацию типов для единиц измерения. Это значительно снижает риск смешивания значений одного и того же базового типа, но с разным значением (например, мили и км).
В следующем примере предполагается, что по умолчанию используется метрическая система, а для устаревших данных требуется преобразование в мили. Haxe может автоматически конвертировать мили в километры, но не наоборот.
abstract Kilometer(Float) {
public function new(v:Float) this = v;
}
abstract Mile(Float) {
public function new(v:Float) this = v;
@:to public inline function toKilometer():Kilometer return (new Kilometer (this / 0.62137));
}
class Test {
static var km:Kilometer;
static function main(){
var one100Miles = new Mile(100);
km = one100Miles;
trace(km); // 160.935
}
}
Как показано в примере, для присвоения «km = one100Miles;» явное преобразование не требуется. поступать правильно.
Абстрактные типы полностью являются особенностью Haxe во время компиляции и вообще не существуют во время выполнения программы. Например, обе переменные используют абстрактные типы выше. Mile
и Kilometer
будет типа Float
во время выполнения. [25]
Структурная типизация
[ редактировать ]Во многих функциональных языках программирования структурная типизация важную роль играет . Haxe использует его при наличии анонимных типов, используя именительную типизацию объектно -ориентированного программирования , когда задействованы только именованные типы. Анонимные типы в Haxe аналогичны неявным интерфейсам языка Go в плане типизации. В отличие от интерфейсов Go, можно создать значение, используя анонимный тип.
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"});
}
}
Внутренняя архитектура
[ редактировать ]Компилятор
[ редактировать ]Компилятор Haxe разделен на один интерфейс и несколько серверов. Интерфейсный интерфейс создает абстрактное синтаксическое дерево (AST) из исходного кода и выполняет проверку типов, расширение макросов и оптимизацию AST. Различные серверные части преобразуют обработанный AST в исходный код или генерируют байт-код , в зависимости от их цели.
Компилятор написан на OCaml . Его можно запускать в режиме сервера, чтобы обеспечить завершение кода для интегрированных сред разработки (IDE) и поддерживать кэш для дальнейшего ускорения компиляции. [26]
См. также
[ редактировать ]- Дарт (язык программирования)
- Ним (язык программирования)
- Опа (язык программирования)
- Кложур
- Кофескрипт
- Машинопись
- Скала (язык программирования)
- Вала (язык программирования)
- Эмскрипты
- ОпенФЛ
Ссылки
[ редактировать ]- ^ «Выпуск 4.3.5» . 18 июля 2024 г. Проверено 23 июля 2024 г.
- ^ «Лицензия открытого исходного кода Haxe» .
- ^ Введение в стандартную библиотеку Haxe , Haxe Docs
- ^ Целевые API, Введение в стандартную библиотеку Haxe , Документы Haxe
- ^ Дусе, Ларс (24 июня 2014 г.). «Уважаемый Adobe: поддержите Haxe, сохраните свои инструменты» . Гамасутра .
- ^ «Интервью Хакса» . Я программа. 01 апреля 2009 г. стр. 1–6. Архивировано из оригинала 8 декабря 2015 г. Проверено 6 августа 2015 г.
- ^ «Привет, Луа!» . Haxe.org .
- ^ "hxnodejs" .
- ^ Jump up to: Перейти обратно: а б «Цели компилятора» . Хаксе . Проверено 5 ноября 2021 г.
- ^ Список IDE, поддерживающих Haxe , Haxe Foundation
- ^ «Выпуск альфа-1» . хаксе . Фонд Хаксе. 14 ноября 2005 г. Получено 2 апреля 2022 г. - через GitHub .
- ^ Каннасс, Николя (17 ноября 2005 г.). «Хакс Альфа 1б» . haXe (список рассылки). Архивировано из оригинала 26 октября 2007 г.
- ^ «Объявление Николаса об изменении написания в официальном списке рассылки Haxe» .
- ^ «Сообщение в списке рассылки Haxe об именовании» . Архивировано из оригинала 28 марта 2007 г.
- ^ Компилятор MTASC , веб-сайт MTASC
- ^ «Eval — новый интерпретатор макросов Haxe» .
- ^ «Функции компилятора» .
- ^ «Макросы в Хаксе» .
- ^ Дьяченко, Вадим (05.12.2013). «О том, что «В Haxe невозможно создавать хорошие HTML5-игры» » . Желтый после жизни.
- ^ «Справочник по Haxe, подробно описывающий использование перечисления» . Архивировано из оригинала 11 мая 2012 г.
- ^ «haxe/Option.hx в стадии разработки · HaxeFoundation/haxe» . Гитхаб . 7 ноября 2021 г.
- ^ "haxe/Either.hx в стадии разработки · HaxeFoundation/haxe" . Гитхаб . 7 ноября 2021 г.
- ^ «Особенности языка» . Haxe — Кроссплатформенный набор инструментов . Фонд Хаксе . Проверено 30 апреля 2015 г.
- ^ "haxe/TestGADT.hx в стадии разработки · HaxeFoundation/haxe" . Гитхаб . 7 ноября 2021 г.
- ^ "Абстрактный" . Haxe — Кроссплатформенный набор инструментов . Проверено 24 апреля 2023 г.
- ^ Командная строка режима сервера:
haxe --wait [host:]port
Внешние ссылки
[ редактировать ]- Языки программирования высокого уровня
- Функциональные языки
- Мультипарадигмальные языки программирования
- Объектно-ориентированные языки программирования
- Программное обеспечение OCaml
- Языки программирования сопоставления шаблонов
- Языки программирования
- Языки программирования, созданные в 2005 году.
- Программное обеспечение, использующее лицензию GPL
- Компиляторы исходного кода
- Статически типизированные языки программирования