Смешанный
![]() | |
Парадигма | Мультипарадигмальность : объектно-ориентированная , функциональная , универсальная. |
---|---|
Семья | ECMAScript |
Разработчик | Фонд Хаксе |
Впервые появился | 14 ноября 2005 г |
Стабильная версия | 4.3.4 [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 может иметь формат
// файл my/pack/A.hx,
пакет my . пакет ;
класс А {}
В других модулях другие типы можно импортировать, поставив import
утверждения под определением пакета, например import my.pack.A;
Модуль может содержать несколько типов, например следующие. Из этого модуля можно импортировать по одному типу, используя import my.pack2.A;
. Тип может быть private
, и в этом случае доступ к нему может получить только содержащий его модуль.
упакуйте мой . пакет2 ;
typedef A = { a : String }
частный typedef B = { b : String }
Классы [ править ]
Классы (ключевое слово class
) в Haxe аналогичны тем, что есть в Java или TypeScript. Их поля могут быть методами, переменными или свойствами, статическими или экземплярными соответственно. Haxe поддерживает средства доступа public
и private
и более продвинутые методы управления доступом, обозначаемые с помощью аннотаций. Методы и статические константные переменные можно встроить с помощью ключевого слова inline
. Поля могут быть помечены как final
объявить константу, которая должна быть инициализирована немедленно или в конструкторе и не может быть записана в случае функции final
будет помечен как непереопределяемый в подклассах.
Интерфейсы в Haxe очень похожи на интерфейсы, например, в Java.
интерфейс ICreature {
общественная переменная рождения : Дата ;
публичное переменной имя : String ;
публичная функция age (): Int ;
}
Класс Fly реализует ICreature {
общественная вар рождения : Дата ;
публичное переменной имя : String ;
публичная функция age (): Int return Date . сейчас (). getFullYear () — рождение . получитьПолныйГод ();
}
Дженерики [ править ]
Haxe поддерживает общее программирование . Ниже приведен пример функции идентичности .
функции идентичность < T >( arg : T ): T {
return arg ;
}
Перечислимые типы [ править ]
Перечислимые типы — важная особенность языка; они могут иметь параметры типа и быть рекурсивными. [20] Они обеспечивают базовую поддержку алгебраических типов данных , позволяя включать типы продуктов аналогично Haskell и ML . А switch
Выражение может применять сопоставление шаблонов со значением перечисления, что позволяет элегантно решать сложные проблемы программирования:
перечисление Цвет {
красный ;
зеленый ;
синий ;
rgb ( r : Int , g : Int , b : Int );
}
класса Colors {
статическая функция toInt ( c : Color ): Int {
возврата переключатель ( c ) {
регистр красный : 0xFF0000 ;
регистр зеленый : 0x00FF00 ;
регистр синий : 0x0000FF ;
случай rgb ( р , г , б ): ( р << 16 ) | ( г << 8 ) | б ;
}
}
Статическая функция validCalls () {
var redint = toInt ( Color . red );
var rgbint = toInt ( Color . rgb ( 100 , 100 , 100 ));
}
}
Примерами параметрических типов перечислений являются типы стандартной библиотеки Haxe. [21] и либо: [22]
enum Option < T > {
Some ( v : T );
Никто ;
}
enum Либо < L , R > {
Влево ( v : L );
Вправо ( 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 = ( текст : String ) -> Float ;
typedef F3 = ( оценка : Int, текст: String ) -> Float ;
typedef F4 = ( оценка : Int, текст: String ) -> F3 ;
typedef F5 = ( оценка :Int, текст:String ) -> (( оценка :Int, текст:String ) -> Float );
Анонимные функции [ править ]
В Haxe анонимные функции называются лямбда-выражениями и используют синтаксис function(argument-list) expression;
.
var f = функция ( x ) return x * x ;
ж ( 8 ); // 64
( функция ( x , y ) возвращает x + y )( 5 , 6 ); // 11
Абстрактные типы [ править ]
Относительно новым дополнением к системе типов Haxe является концепция, называемая абстрактными типами . В Haxe это относится к чему-то отличному от обычного абстрактного типа . Они используются для неявных преобразований между типами, позволяя повторно использовать существующие типы для определенных целей, например реализацию типов для единиц измерения. Это значительно снижает риск смешивания значений одного и того же базового типа, но с разным значением (например, мили и км).
В следующем примере предполагается, что по умолчанию используется метрическая система, а для устаревших данных требуется преобразование в мили. Haxe может автоматически конвертировать мили в километры, но не наоборот.
абстрактный километр ( Float ) {
общественная функция new ( v : Float ) this = v ;
}
Abstract Mile ( Float ) {
общественная функция new ( v : Float ) this = v ;
@:to общедоступная встроенная функция toKilometer (): километра возврат ( новый километр ( this / 0.62137 ));
}
Класс Test {
статический вар км : километр ;
статическая функция main () {
var one100Miles = новая миля ( 100 );
км = один100 миль ;
трасса ( км ); // 160.935
}
}
Как показано в примере, для присвоения «km = one100Miles;» явное преобразование не требуется. поступать правильно.
Абстрактные типы полностью являются особенностью Haxe во время компиляции и вообще не существуют во время выполнения программы. Например, обе переменные используют абстрактные типы выше. Mile
и Kilometer
будет типа Float
во время выполнения. [25]
Структурная типизация [ править ]
Во многих функциональных языках программирования структурная типизация важную роль играет . Haxe использует его при наличии анонимных типов, используя именительную типизацию , объектно-ориентированного программирования когда задействованы только именованные типы. Анонимные типы в Haxe аналогичны неявным интерфейсам языка Go в плане типизации. В отличие от интерфейсов Go, можно создать значение, используя анонимный тип.
класс FooBar {
общественный вар foo : Int ;
общественная var панель : String ;
публичная функция new () {
foo = 1 ;
бар = "2" ;
}
Функция AnyFooBar ( v : { foo : Int , bar : String })
трассировка ( v . foo );
статической функции тест () {
вар fb = новый FooBar ();
фб . AnyFooBar ( ФБ );
фб . AnyFooBar ({ foo : 123 , bar : "456" });
}
}
Внутренняя архитектура [ править ]
Компилятор [ править ]
Компилятор Haxe разделен на один интерфейс и несколько серверов. Интерфейсный интерфейс создает абстрактное синтаксическое дерево (AST) из исходного кода и выполняет проверку типов, расширение макросов и оптимизацию AST. Различные серверные части преобразуют обработанный AST в исходный код или генерируют байт-код , в зависимости от их цели.
Компилятор написан на OCaml . Его можно запускать в режиме сервера, чтобы обеспечить завершение кода для интегрированных сред разработки (IDE) и поддерживать кэш для дальнейшего ускорения компиляции. [26]
См. также [ править ]
- Дарт (язык программирования)
- Ним (язык программирования)
- Опа (язык программирования)
- Клоджур
- Кофескрипт
- Машинопись
- Скала (язык программирования)
- Вала (язык программирования)
- Эмскриптен
- ОпенФЛ
Ссылки [ править ]
- ^ «Выпуск 4.3.4» . 4 марта 2024 г. Проверено 16 марта 2024 г.
- ^ «Лицензия открытого исходного кода Haxe» .
- ^ Введение в стандартную библиотеку Haxe , Haxe Docs
- ^ Целевые API-интерфейсы, Введение в стандартную библиотеку Haxe , Документы Haxe
- ^ Дусе, Ларс (24 июня 2014 г.). «Уважаемый Adobe: поддержите Haxe, сохраните свои инструменты» . Гамасутра .
- ^ «Интервью Хакса» . Я программа. 01 апреля 2009 г. стр. 1–6.
- ^ «Привет, Луа!» . Haxe.org .
- ^ "hxnodejs" .
- ^ Перейти обратно: а б «Цели компилятора» . Хаксе . Проверено 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
- Компиляторы исходного кода
- Статически типизированные языки программирования.