Парадигма | Мультипарадигма |
---|---|
Разработчик | Фонд Haxe |
Впервые появился | 2005 |
Стабильный выпуск | 4.2.0 [1] / 25 декабря 2020 г . |
Печатная дисциплина | Статический , динамический через аннотации, номинальный |
Язык реализации | OCaml |
Платформа | ARM ; IA-32 , x86-64 |
Операционные системы | Android , iOS ; Linux , macOS , Windows |
Лицензия | GPL 2.0, библиотека: MIT |
Расширения имени файла | .hx, .hxml |
Интернет сайт | haxe |
Под влиянием | |
EcmaScript , OCaml , Java , JavaScript , C ++ , PHP , C # , Python , Lua , ActionScript , NekoVM |
Haxe - это кроссплатформенный язык программирования высокого уровня с открытым исходным кодом [2] и компилятор, который может создавать приложения и исходный код для многих различных вычислительных платформ из одной кодовой базы. Это бесплатное программное обеспечение с открытым исходным кодом , выпущенное под лицензией MIT . Компилятор, написанный на 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 и Neko , байт-код.а также работает в интерпретируемом режиме. [9]
Haxe поддерживает externs (файлы определения), которые могут содержать информацию о типах существующих библиотек для описания целевого взаимодействия безопасным для типов образом, например, файлы заголовков C ++ могут описывать структуру существующих объектных файлов . Это позволяет использовать значения, определенные в файлах, как если бы они были статически типизированными объектами Haxe. Помимо внешних, существуют и другие решения для доступа к собственным возможностям каждой платформы.
Многие популярные Иды и редактора исходного кода имеют поддержку доступную для развития Haxe . [10] Haxe Foundation официально не рекомендует ни одной конкретной среды разработки или набора инструментов, хотя VS Code , IntelliJ IDEA и HaxeDevelop имеют наибольшую поддержку для разработки Haxe. Основные функциональные возможности подсветки синтаксиса , завершение кода , рефакторинг , отладка и т.д. доступны в различной степени.
История [ править ]
Разработка Haxe началась в октябре 2005 года. Первая бета-версия была выпущена в феврале 2006 года. Haxe 1.0 был выпущен в апреле 2006 года с поддержкой программ Adobe Flash , JavaScript и Neko . Поддержка PHP была добавлена в 2008 году, а C ++ - в 2009 году. В 2012 году после капитального ремонта компилятора было добавлено больше платформ, таких как C # и Java.
Haxe был разработан Николасом Каннассом и другими участниками и первоначально назывался haXe [11], потому что он был коротким, простым и «имел X внутри», что, как с юмором утверждает автор, необходимо для успеха любой новой технологии. [12]
Haxe является правопреемником открытым исходным кодом ActionScript 2 компилятора MTASC , [13] также построил Николя Каннасс и выпущен под лицензией GNU General Public версии 2 или более поздней версии.
Компилятор [ править ]
Язык Haxe может компилироваться в байт-код, который может выполняться непосредственно виртуальными машинами, на которые он ориентирован. Он может компилировать исходный код на C ++ , JavaScript , PHP , C # , Java , Python и Lua . У Haxe также есть интерпретатор под названием eval . [14] Этот же интерпретатор также используется во время компиляции для запуска макросов, которые позволяют изменять AST .
Эта стратегия компиляции для нескольких языков исходного кода основана на парадигме « писать один раз и запускать где угодно» . Это также позволяет программисту выбрать лучшую платформу для работы. Типичные программы Haxe работают одинаково на всех платформах, но разработчики могут указать код для конкретной платформы и использовать условную компиляцию, чтобы предотвратить его компиляцию на других платформах.
Компилятор Haxe является оптимизирующим компилятором и использует встраивание полей и функций , устранение хвостовой рекурсии , сворачивание констант , развертывание цикла и устранение мертвого кода (DCE) для оптимизации производительности скомпилированных программ во время выполнения. [15] Компилятор Haxe предлагает подписку на нулевую безопасность , он проверяет время компиляции на наличие нулевых значений.
Цели [ править ]
В Haxe поддерживаемые платформы известны как «цели», которые состоят из следующих модулей:
- Бэкэнды компилятора, которые отвечают за генерацию соответствующего кода.
- API-интерфейсы времени выполнения, которые выходят за рамки поддержки основного языка (платформенные цели).
В следующей таблице указана поддержка платформы и языка в Haxe. Язык Haxe позволяет разработчикам получить доступ ко многим функциям платформы, но Haxe не является полнофункциональным движком, им могут потребоваться фреймворки, позволяющие создавать контент для определенных платформ.
Цель компилятора | Выход | Платформа | Использовать | Начиная с версии Haxe |
---|---|---|---|---|
JavaScript [3] | источник | HTML5 , NodeJS , PhoneGap | Сервер, настольный компьютер, браузер, мобильный | 2006 г. |
C ++ | источник | Windows , Linux , MacOS , Android , iOS , Palm , WebOS | Сервер, настольный компьютер, мобильный, интерфейс командной строки, игровые консоли | 2009 (2.04) |
PHP [3] | источник | PHP | Сервер | 2008 (2.0) |
C # [3] | источник | .NET Framework | Сервер, настольный компьютер, мобильный | 2012 (2.10) |
Java [3] | источник | Ява | Сервер, настольный компьютер | 2012 (2.10) |
JVM [3] | байт-код | Виртуальная машина Java | Сервер, настольный компьютер | 2019 (4,0) |
Python [3] | источник | Python | CLI, Интернет, рабочий стол | 2014 (3,2) |
Lua [3] | источник | Lua | CLI, Интернет, настольный компьютер, мобильный | 2016 (3,3) |
Неко [3] | байтовый код | НекоВМ | Сервер, рабочий стол, CLI | 2005 г. |
Flash / SWF [3] | байтовый код | Adobe Flash Player 9+, Adobe AIR , Tamarin | Рабочий стол, браузер, сервер | 2005 г. |
HashLink [3] | байтовый код | HashLink VM или HL / C (компилировать в файл C) | Серверные, настольные, мобильные, игровые консоли (экспорт C) | 2016 (3,4) |
Так как Haxe версии 1.12 (2007) существовала исходная цель ActionScript 3 (для Adobe FlashPlayer), она была удалена из Haxe в версии 4.0.
Преимущества Haxe [ править ]
- Возможность настроить таргетинг на несколько платформ и устройств, используя один и тот же язык.
- Возможность использовать строго типизированный код
- Возможность использовать макросы (преобразование синтаксиса), которые могут быть выполнены с помощью языка Haxe [16]
- Добавлены языковые функции, такие как методы расширения и функциональное программирование.
- Производительность программ Haxe во время выполнения сопоставима со скоростью рукописных источников. [17]
Язык [ править ]
Haxe - это язык общего назначения, поддерживающий объектно-ориентированное программирование , универсальное программирование и различные конструкции функционального программирования . Такие функции, как итерации , исключения и отражение кода , также являются встроенными функциями языка и библиотек. Необычный среди языков программирования, Haxe содержит сильную и динамичную систему типов . Компилятор будет проверять типы неявно, используя вывод типаи выдает ошибки времени компиляции, но также позволяет программисту обходить проверку типов и полагаться на динамическую обработку типов целевой платформы. Можно использовать все собственные целевые API.
Система типов [ править ]
Haxe имеет сложную и гибкую систему шрифтов. Типы типов, которые он предлагает, - это классы, интерфейсы, типы функций-методов, анонимные типы, алгебраические типы данных (ADT, называемые enum в Haxe) и абстрактные типы. Параметрический полиморфизм возможен с классами, ADT и типами функций, обеспечивая языковую поддержку универсального программирования на основе стирания типа. Это включает поддержку дисперсии в полиморфных функциях , но не в конструкторах типов .
Система типов является статической, если не присутствуют аннотации для динамической типизации , для использования с целевыми объектами, которые их поддерживают. Проверка типов следует за номинальной типизацией, за исключением анонимных типов, где вместо нее используется структурная типизация . Наконец, поддерживается вывод типа , что позволяет объявлять переменные без аннотаций типов .
Модули и пространства имен [ править ]
Весь код Haxe организован в модули, которые адресуются с помощью путей. По сути, каждый файл .hx представляет собой модуль, который может содержать несколько типов. Например, чтобы создать тип A
в пакете my.pack, как показано, структура папок должна быть my \ pack, а файл может быть A.hx в папке pack .
// файл my / pack / A.hx package my . упаковка ;класс A {}
В других модулях другие типы можно импортировать, поместив import
операторы под определением пакета, например, import my.pack.A;
модуль может содержать несколько типов, например следующие. Из этого модуля можно импортировать по одному типу за раз, используя import my.pack2.A;
. Тип может быть private
, и в этом случае только содержащий его модуль может получить к нему доступ.
упаковать мой . pack2 ;typedef A = { a : String } частный typedef B = { b : String }
Классы [ править ]
Классы (ключевое слово class
) в Haxe аналогичны классам в Java или TypeScript. Их поля могут быть методами, переменными или свойствами, каждое статическое или для каждого экземпляра соответственно. Haxe поддерживает аксессор public
и private
, и более современные методы контроля доступа , которые обозначаются с помощью аннотаций. С помощью ключевого слова можно встроить методы и статические постоянные переменные inline
. Поля могут быть помечены как final
для объявления константы, которая должна быть инициализирована немедленно или в конструкторе и не может быть записана, в случае, если функция final
будет отмечена как непереопределяемая в подклассах.
Интерфейсы в Haxe очень похожи, например, на интерфейсы Java.
интерфейс ICreature { общественного уаг рождения : Дата ; общественное вар имя : строка ; публичная функция age (): Int ; }Класс Fly реализует ICreature { общественный уаг рождения : Дата ; общественное вар имя : строка ; публичная функция age (): Int return Date . сейчас (). getFullYear () - рождение . getFullYear (); }
Дженерики [ править ]
Haxe поддерживает универсальное программирование . Ниже приведен пример функции идентификации .
идентификатор функции < T > ( arg : T ): T { return arg ; }
Перечислимые типы [ править ]
Нумерованные типы - важная особенность языка; они могут иметь параметры типа и быть рекурсивными. [18] Они обеспечивают базовую поддержку алгебраических типов данных , позволяя включать типы продуктов аналогично Haskell и ML . switch
Выражение можно применить сопоставление с образцом на значение перечисления, что позволяет элегантные решения сложных задач программирования:
enum Color { красный ; зеленый ; синий ; rgb ( r : Int , g : Int , b : Int ); }class Colors { статическая функция toInt ( c : Color ): Int { return switch c { case red : 0xFF0000 ; корпус зеленый : 0x00FF00 ; корпус синий : 0x0000FF ; case rgb ( r , g , b ): ( r << 16 ) | ( g << 8 ) | б ;} }статическая функция validCalls () { var redint = toInt ( Color . red ); var rgbint = toInt ( Color . rgb ( 100 , 100 , 100 )); } }
Примерами параметрических типов перечислений являются типы стандартной библиотеки Haxe Option [19] и Either: [20]
enum Option < T > { Некоторые ( v : T ); Нет ; }перечисление Either < L , R > { Left ( v : L ); Вправо ( v : R ); }
Haxe также поддерживает обобщенные алгебраические типы данных (GADT). [21] [22]
Анонимные типы [ править ]
Анонимные типы определяются путем явного обозначения их структуры с использованием синтаксиса, который соответствует математическому представлению типа на основе записей. Их можно использовать для реализации структурной типизации аргументов функции (см. Ниже), и им можно дать псевдоним с ключевым словом 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 - это концепция, называемая абстрактными типами . В Haxe это относится к чему-то отличному от обычного абстрактного типа . Они используются для неявного преобразования между типами, что позволяет повторно использовать существующие типы для определенных целей, например, для реализации типов для единиц измерения. Это значительно снижает риск смешивания значений одного и того же базового типа, но с разными значениями (например, мили против км).
В следующем примере предполагается, что по умолчанию используется метрическая система, а для устаревших данных требуется преобразование в мили. Haxe может автоматически конвертировать мили в километры, но не наоборот.
абстрактный километр ( Float ) { публичная функция new ( v : Float ) this = v ; } абстрактная миля ( Float ) { публичная функция new ( v : Float ) this = v ; @: для общедоступной встроенной функции toKilometer (): возврат километра ( новый километр ( this / 0.62137 )); } class Test { static var km : Kilometer ; статическая функция main () { var one100Miles = новая миля ( 100 ); км = один100 миль ; трасса ( км ); // 160.935 } }
Как показывает пример, явное преобразование не требуется для присвоения «km = one100Miles;» поступать правильно.
Структурная типизация [ править ]
Во многих языках функционального программирования структурная типизация играет важную роль. Haxe использует его в присутствии анонимных типов, используя именительном ввод в объектно-ориентированном программировании , когда задействованы только названные типы. Анонимные типы в Haxe аналогичны неявным интерфейсам языка Go в том, что касается набора текста. В отличие от интерфейсов Go, можно создать значение, используя анонимный тип.
класс FooBar { общедоступный var foo : Int ; общедоступная панель var : String ;публичная функция new () { foo = 1 ; bar = "2" ; }функция anyFooBar ( v : { foo : Int , bar : String }) trace ( v . foo );статическая функция test () { var fb = new FooBar (); fb . anyFooBar ( фб ); fb . anyFooBar ({ foo : 123 , bar : "456" }); } }
Внутренняя архитектура [ править ]
Компилятор [ править ]
Компилятор Haxe разделен на один интерфейс и несколько бэкэндов. Интерфейс создает абстрактное синтаксическое дерево (AST) из исходного кода и выполняет проверку типов, расширение макросов и оптимизацию AST . Различные бэкенды переводят обработанный AST в исходный код или генерируют байт-код , в зависимости от своей цели.
Компилятор написан на OCaml . Его можно запустить в серверном режиме, чтобы обеспечить автозавершение кода для интегрированных сред разработки (IDE) и поддерживать кэш для дальнейшего ускорения компиляции. [23]
См. Также [ править ]
- Сравнение вариантов IDE для программистов Haxe
- Дарт (язык программирования)
- Ним (язык программирования)
- Опа (язык программирования)
- Clojure
- CoffeeScript
- Машинопись
- Scala (язык программирования)
- Вала (язык программирования)
- Emscripten
- OpenFL
Ссылки [ править ]
- ^ "Выпуск 4.2.0" . 9 февраля 2021 . Проверено 10 февраля 2021 года .
- ^ "Лицензия с открытым исходным кодом Haxe" .
- ^ a b c d e f g h i j k Введение в стандартную библиотеку Haxe, Документы Haxe
- ^ Целевые API, Введение в стандартную библиотеку Haxe, Документы Haxe
- ^ Дусе, Ларс (2014-06-24). «Уважаемый Adobe! Поддержите Haxe, сохраните свои инструменты» . Гамасутра .
- ^ "Haxe Interview" . Io Programmo. 2009-04-01: 1–6. Цитировать журнал требует
|journal=
( помощь ) - ^ "Привет, Луа! - Хакс" .
- ^ "hxnodejs" .
- ^ "Цели компилятора" .
- ^ Список IDE, поддерживающих Haxe , Haxe Foundation
- ^ "Объявление Николаса об изменении правописания в официальном списке рассылки Haxe" .
- ^ "Сообщение в списке рассылки Haxe по именованию" . Архивировано из оригинала на 2007-03-28.
- ^ Компилятор MTASC, веб-сайт MTASC
- ^ "Eval - новый интерпретатор макросов Haxe" .
- ^ «Особенности компилятора» .
- ^ «Макросы в Haxe» .
- ^ Дьяченко, Вадим (2013-12-05). «Вкл.» На Haxe не получится делать хорошие HTML5-игры » » . Желтый после жизни.
- ^ "Ссылка на Haxe, подробно описывающая использование перечисления" . Архивировано из оригинала на 2012-05-11.
- ^ "haxe / Option.hx в разработке · HaxeFoundation / haxe" . Github .
- ^ "haxe / Either.hx в разработке · HaxeFoundation / haxe" . Github .
- ^ «Особенности языка» . Haxe - кроссплатформенный инструментарий . Фонд Haxe . Проверено 30 апреля 2015 года .
- ^ "haxe / TestGADT.hx в разработке · HaxeFoundation / haxe" . Github .
- ^ Командная строка в режиме сервера:
haxe --wait [host:]port
Внешние ссылки [ править ]
- Официальный веб-сайт