Haxe

редактировать
Haxe
Haxe logo.svg
Paradigm Многопарадигма
Разработчик Haxe Foundation
Первое появление2005; 15 лет назад (2005 г.)
Стабильный выпуск 4.1.4 / 11 сентября 2020 г.; 32 дня назад (2020-09-11)
Дисциплина ввода Статический, динамический с помощью аннотаций, номинальный
Язык реализацииOCaml
Платформа ARM ; IA-32, x86-64
OS Android, iOS ; Linux, macOS, Windows
Лицензия GPL 2.0, библиотека: MIT
Расширения имен файлов .hx,.hxml
Веб-сайтhaxe.org
Находится под влиянием
EcmaScript, OCaml, Java,

Haxe является открытым исходный код высокого уровня кроссплатформенный язык программирования и компилятор, которые могут создавать приложения и исходный код для многих различных вычислительных платформ с одной кодовая база. Это бесплатное программное обеспечение с открытым исходным кодом, выпущенное под лицензией MIT. Компилятор, написанный на OCaml, выпущен под Стандартной общественной лицензией GNU (GPL) версии 2.

Haxe включает в себя набор функций и поддерживаемую стандартную библиотеку. на всех платформах, например числовые типы данных, строки, массивы, сопоставления, двоичные, отражение, математика, http, файловая система и распространенные форматы файлов. Haxe также включает API-интерфейсы, специфичные для платформы, для каждой цели компилятора., OpenFL и являются популярными фреймворками Haxe, которые позволяют создавать многоплатформенный контент из одной кодовой базы.

Haxe возник с идеей поддержки клиентское и серверное программирование на одном языке и упрощение логики связи между ними. Код, написанный на языке Haxe, может быть скомпилирован в JavaScript, C ++, Java, JVM, PHP, C#, Python, Lua и Node.js. Haxe также может напрямую компилировать SWF и Neko, байт-код, а также работает в интерпретируемом режиме.

Haxe поддерживает внешние (файлы определений), которые могут содержат информацию о типах существующих библиотек для описания целевого взаимодействия безопасным для типов образом, например C++ файлы заголовков могут описывать структуру существующих объектных файлов. Это позволяет использовать значения, определенные в файлах, как если бы они были статически типизированными объектами Haxe. Помимо внешних, существуют и другие решения для доступа к собственным возможностям каждой платформы.

Многие популярные IDE и имеют поддержку для разработки Haxe. Haxe Foundation официально не рекомендует никакой конкретной среды разработки или набора инструментов, хотя VS Code, IntelliJ IDEA и HaxeDevelop имеют наибольшую поддержку для разработки Haxe. Основные функции подсветки синтаксиса, завершения кода, рефакторинга, отладки и т. Д. Доступны в различной степени.

Содержание
  • 1 История
  • 2 Компилятор
    • 2.1 Цели
    • 2.2 Преимущества Haxe
  • 3 Язык
    • 3.1 Система типов
    • 3.2 Модули и пространства имен
    • 3.3 Классы
    • 3.4 Универсальные типы
    • 3.5 Перечислимые типы
    • 3.6 Анонимные типы
    • 3.7 Типы функций
    • 3.8 Абстрактные типы
    • 3.9 Структурная типизация
  • 4 Внутренняя архитектура
    • 4.1 Компилятор
  • 5 Конвертеры to Haxe
  • 6 См. также
  • 7 Ссылки
  • 8 Внешние ссылки
История

Разработка Haxe началась в октябре 2005 года. Первая бета-версия была выпущена в Февраль 2006 г. Haxe 1.0 был выпущен в апреле 2006 г. с поддержкой программ Adobe Flash, JavaScript и Neko. Поддержка PHP была добавлена ​​в 2008 году, а C ++ был добавлен в 2009 году. Больше платформ, таких как C # и Java, было добавлено после капитального ремонта компилятора в 2012 году.

Haxe был разработан Николасом Каннассом и другими участниками и изначально был назвал haXe, потому что он был коротким, простым и «имел X внутри», что, как шутливо утверждает автор, необходимо для успеха любой новой технологии.

Haxe является преемником open-source Компилятор ActionScript 2 MTASC, также созданный Николасом Каннассом и выпущенный под Стандартной общественной лицензией GNU версии 2 или более поздней.

Компилятор

Язык Haxe может компилироваться в байт-код, который может выполняться непосредственно виртуальными машинами, на которые он нацелен. Он может компилировать исходный код в C ++, JavaScript, PHP, C#, Java, Python и Lua. У Haxe также есть интерпретатор под названием eval. Этот же интерпретатор также используется во время компиляции для запуска макросов, которые позволяют изменять AST.

. Эта стратегия компиляции для нескольких языков исходного кода основана на парадигме написать один раз, запустить где угодно. Это также позволяет программисту выбрать лучшую платформу для работы. Типичные программы Haxe работают одинаково на всех платформах, но разработчики могут указать код конкретной платформы и использовать условную компиляцию, чтобы предотвратить его компиляцию на других платформах.

Компилятор Haxe является оптимизирующим компилятором и использует встраивание полей и функций, устранение хвостовой рекурсии, сворачивание констант, развертывание цикла и устранение мертвого кода (DCE) для оптимизации производительности скомпилированных программ во время выполнения. Компилятор Haxe предлагает опцию нулевую безопасность, он проверяет время компиляции на наличие значений, допускающих значение NULL.

Цели

В Haxe поддерживаемые платформы известны как «цели», которые состоят из следующих модулей:

  • Бэкенды компилятора, отвечающие за генерацию соответствующего кода.
  • API, специфичные для времени выполнения, которые выходят за рамки поддержки основного языка (платформы-цели).

В следующей таблице документируется поддержка платформы и языка в Haxe. Язык Haxe позволяет разработчикам получить доступ ко многим функциям платформы, но Haxe не является полнофункциональным движком, им могут потребоваться фреймворки, позволяющие создавать контент для определенных платформ.

Цель компилятораВыводПлатформаИспользоватьНачиная с версии Haxe
JavaScript исходный кодHTML5, NodeJS, PhoneGap Сервер, настольный компьютер, браузер, мобильный2006
C ++ исходный кодWindows, Linux, MacOS, Android, iOS, Palm, WebOS Server, настольный компьютер, Mobile, CLI, игровые консоли2009 (2.04)
PHP исходный кодPHPServer2008 (2.0)
C# исходный.NET Framework Сервер, настольный ПК, мобильный2012 (2.10)
Java исходныйJava Сервер, настольный компьютер2012 (2.10)
JVM байт-кодвиртуальная машина Java Сервер, рабочий стол2019 (4.0)
Python исходный кодPythonCLI, веб, настольный компьютер2014 (3.2)
Lua исходный кодLuaCLI, веб, настольный компьютер, мобильный2016 (3.3)
Neko байтовый кодNekoVMСервер, настольный компьютер, интерфейс командной строки2005
Flash / SWFбайт-кодAdobe Flash Player 9+, Adobe AIR, TamarinРабочий стол, браузер, сервер2005
HashLinkбайтовый кодHashLink VM или HL / C (скомпилировать в файл C)Сервер, настольный компьютер, мобильные устройства, игровые консоли (экспорт C)2016 ( 3.4)

Так как Haxe версии 1.12 (2007) существовала исходная цель ActionScript 3 (для Adobe FlashPlayer), она была удалена из Haxe в версии 4.0.

Преимущества Haxe

  • Возможность работать с несколькими платформами и устройствами использование того же языка
  • Возможность использования строго типизированного кода
  • Возможность использования макросов (преобразование синтаксиса), которое может быть выполнено с помощью языка Haxe
  • Добавлены языковые функции, такие как методы расширения и функциональное программирование
  • Скорость выполнения программ Haxe сравнима со скоростью рукописных источников.
Язык

Haxe - это язык общего назначения, поддерживающий объектно-ориентированное программирование, общее программирование и различные функции Конструкции онального программирования. Такие функции, как итерации, исключения и отражение кода, также являются встроенными функциями языка и библиотек. Необычный среди языков программирования, Haxe содержит систему типов, одновременно strong и dynamic. Компилятор будет проверять типы неявно, используя определение типа, и выдает ошибки времени компиляции, но также позволяет программисту обходить проверку типов и полагаться на динамическую обработку типов целевой платформы. Можно использовать все собственные целевые API.

Система типов

Haxe имеет сложную и гибкую систему типов. Типы типов, которые он предлагает, - это классы, интерфейсы, типы функций-методов, анонимные типы, алгебраические типы данных (ADT, называемые enum в Haxe) и абстрактные типы. Параметрический полиморфизм возможен с классами, ADT и типами функций, что обеспечивает языковую поддержку для общего программирования на основе стирания типа. Это включает поддержку дисперсии в полиморфных функциях, но не в конструкторах типов.

Система типов является static, если только аннотации для динамической типизации присутствуют для использования с целевыми объектами, которые их поддерживают. Проверка типа следует за номинальной типизацией, за исключением анонимных типов, где вместо этого используется структурная типизация. Наконец, поддерживается вывод типа , что позволяет объявлять переменные без аннотаций типа .

Модули и пространства имен

Весь код Haxe организован в модули, адресация которых осуществляется с помощью путей. По сути, каждый файл.hx представляет собой модуль, который может содержать несколько типов. Например, чтобы создать тип Aв пакете my.pack, как показано, структура папок должна быть my \ pack, а файл может быть A.hx в папке pack.

// файл my / pack / A.hx package my.pack; class A {}

В других модулях другие типы можно импортировать, поместив операторы importпод определение пакета, например import my.pack.A;Модуль может содержать несколько типов, например следующие. Из этого модуля можно импортировать по одному типу за раз, используя import my.pack2.A;. Тип может быть частным, в этом случае только содержащий его модуль может получить к нему доступ.

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; общедоступное имя переменной: String; публичная функция age (): Int; } класс Fly реализует ICreature {public var Birth: Date; общедоступное имя переменной: String; публичная функция age (): Int return Date.now (). getFullYear () - Birth.getFullYear (); }

Generics

Haxe поддерживает общее программирование. Ниже приведен пример идентификатора функции.

идентификатора функции (arg: T): T {return arg; }

Нумерованные типы

Нумерованные типы - важная особенность языка; они могут иметь параметры типа и быть рекурсивными. Они обеспечивают базовую поддержку алгебраических типов данных, позволяя включать типы продуктов аналогично 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) | b; } } static function validCalls() { var redint = toInt(Color.red); var rgbint = toInt(Color.rgb(100, 100, 100)); } }

Примеры параметрических типов перечислений - это типы стандартной библиотеки Haxe Option и Either:

enum Option {Some (v: T); None;} перечисление Либо {Left (v: L); Right (v: R);}

Haxe также поддерживает обобщенные алгебраические типы данных (GADT).

Анонимные типы

Анонимные типы определяются путем явного обозначения их структуры с использованием синтаксиса, который следует за математическим представлением типа на основе записей. Их можно использовать для реализации структурной типизации для аргументов функции (см. Ниже), и им можно дать псевдоним с ключевым словом typedef:

typedef AliasForAnon = {a: Int, b: String, c: Float->Void};

Типы функций

Функции являются первоклассными значениями в Haxe. Их тип обозначается стрелками между типами аргументов, а также между типом (-ами) аргумента и типом возвращаемого значения, как это часто бывает во многих функциональных языках. Однако, в отличие от таких известных примеров, как Haskell или ML языковая семья, не все функции ry (функции только с одним аргументом), а в 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, можно создать значение, используя анонимный тип.

class FooBar {public 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); fb.anyFooBar ({foo: 123, bar: "456"}); }}
Внутренняя архитектура

Компилятор

Компилятор Haxe разделен на один интерфейс и несколько внутренних интерфейсов. Внешний интерфейс создает абстрактное синтаксическое дерево (AST) из исходного кода и выполняет проверку типа, расширение макроса и оптимизацию для AST. Различные бэкенды переводят обработанный AST в исходный код или генерируют байт-код в зависимости от своей цели.

Компилятор написан на OCaml. Его можно запустить в серверном режиме, чтобы обеспечить завершение кода для интегрированных сред разработки (IDE) и поддерживать кэш для дальнейшего ускорения компиляции.

Конвертеры в Haxe

Чтобы использовать существующий код, сообщество Haxe создало несколько конвертеров исходного кода.

См. Также
  • Портал бесплатного программного обеспечения с открытым исходным кодом
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-23 03:49:34
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте