Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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 версии 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

Ссылки [ править ]

  1. ^ "Выпуск 4.2.0" . 9 февраля 2021 . Проверено 10 февраля 2021 года .
  2. ^ "Лицензия с открытым исходным кодом Haxe" .
  3. ^ a b c d e f g h i j k Введение в стандартную библиотеку Haxe, Документы Haxe
  4. ^ Целевые API, Введение в стандартную библиотеку Haxe, Документы Haxe
  5. ^ Дусе, Ларс (2014-06-24). «Уважаемый Adobe! Поддержите Haxe, сохраните свои инструменты» . Гамасутра .
  6. ^ "Haxe Interview" . Io Programmo. 2009-04-01: 1–6. Цитировать журнал требует |journal=( помощь )
  7. ^ "Привет, Луа! - Хакс" .
  8. ^ "hxnodejs" .
  9. ^ "Цели компилятора" .
  10. ^ Список IDE, поддерживающих Haxe , Haxe Foundation
  11. ^ "Объявление Николаса об изменении правописания в официальном списке рассылки Haxe" .
  12. ^ "Сообщение в списке рассылки Haxe по именованию" . Архивировано из оригинала на 2007-03-28.
  13. ^ Компилятор MTASC, веб-сайт MTASC
  14. ^ "Eval - новый интерпретатор макросов Haxe" .
  15. ^ «Особенности компилятора» .
  16. ^ «Макросы в Haxe» .
  17. ^ Дьяченко, Вадим (2013-12-05). «Вкл.» На Haxe не получится делать хорошие HTML5-игры » » . Желтый после жизни.
  18. ^ "Ссылка на Haxe, подробно описывающая использование перечисления" . Архивировано из оригинала на 2012-05-11.
  19. ^ "haxe / Option.hx в разработке · HaxeFoundation / haxe" . Github .
  20. ^ "haxe / Either.hx в разработке · HaxeFoundation / haxe" . Github .
  21. ^ «Особенности языка» . Haxe - кроссплатформенный инструментарий . Фонд Haxe . Проверено 30 апреля 2015 года .
  22. ^ "haxe / TestGADT.hx в разработке · HaxeFoundation / haxe" . Github .
  23. ^ Командная строка в режиме сервера:haxe --wait [host:]port

Внешние ссылки [ править ]

  • Официальный веб-сайт