Jump to content

Смешанный

(Перенаправлено с HashLink )
Смешанный
Парадигма Мультипарадигмальность : объектно-ориентированная , функциональная , универсальная.
Семья ECMAScript
Разработчик Фонд Хаксе
Впервые появился 14 ноября 2005 г .; 18 лет назад ( 14 ноября 2005 г. )
Стабильная версия
4.3.5 [1]  Отредактируйте это в Викиданных / 18 июля 2024 г .; 7 дней назад ( 18 июля 2024 г. )
Дисциплина набора текста статический , динамический через аннотации, номинальный
Объем лексический
Язык реализации OCaml
Платформа IA-32 , x86-64 , AArch64 , Armel, Armhf , MIPS, MIPS64el, MIPSel , ppc64el , s390x
ТЫ Андроид , iOS ; Linux , MacOS , Windows
Лицензия GPL 2.0, библиотека: Массачусетский технологический институт
Расширения имен файлов .hx, .hxml
Веб-сайт смешивание .org Отредактируйте это в Викиданных
Под влиянием
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 [9]
Имя Уровень Выход Платформа Использовать Начиная с версии 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]

См. также

[ редактировать ]
  1. ^ «Выпуск 4.3.5» . 18 июля 2024 г. Проверено 23 июля 2024 г.
  2. ^ «Лицензия открытого исходного кода Haxe» .
  3. ^ Введение в стандартную библиотеку Haxe , Haxe Docs
  4. ^ Целевые API, Введение в стандартную библиотеку Haxe , Документы Haxe
  5. ^ Дусе, Ларс (24 июня 2014 г.). «Уважаемый Adobe: поддержите Haxe, сохраните свои инструменты» . Гамасутра .
  6. ^ «Интервью Хакса» . Я программа. 01 апреля 2009 г. стр. 1–6. Архивировано из оригинала 8 декабря 2015 г. Проверено 6 августа 2015 г.
  7. ^ «Привет, Луа!» . Haxe.org .
  8. ^ "hxnodejs" .
  9. ^ Jump up to: Перейти обратно: а б «Цели компилятора» . Хаксе . Проверено 5 ноября 2021 г.
  10. ^ Список IDE, поддерживающих Haxe , Haxe Foundation
  11. ^ «Выпуск альфа-1» . хаксе . Фонд Хаксе. 14 ноября 2005 г. Получено 2 апреля 2022 г. - через GitHub .
  12. ^ Каннасс, Николя (17 ноября 2005 г.). «Хакс Альфа 1б» . haXe (список рассылки). Архивировано из оригинала 26 октября 2007 г.
  13. ^ «Объявление Николаса об изменении написания в официальном списке рассылки Haxe» .
  14. ^ «Сообщение в списке рассылки Haxe об именовании» . Архивировано из оригинала 28 марта 2007 г.
  15. ^ Компилятор MTASC , веб-сайт MTASC
  16. ^ «Eval — новый интерпретатор макросов Haxe» .
  17. ^ «Функции компилятора» .
  18. ^ «Макросы в Хаксе» .
  19. ^ Дьяченко, Вадим (05.12.2013). «О том, что «В Haxe невозможно создавать хорошие HTML5-игры» » . Желтый после жизни.
  20. ^ «Справочник по Haxe, подробно описывающий использование перечисления» . Архивировано из оригинала 11 мая 2012 г.
  21. ^ «haxe/Option.hx в стадии разработки · HaxeFoundation/haxe» . Гитхаб . 7 ноября 2021 г.
  22. ^ "haxe/Either.hx в стадии разработки · HaxeFoundation/haxe" . Гитхаб . 7 ноября 2021 г.
  23. ^ «Особенности языка» . Haxe — Кроссплатформенный набор инструментов . Фонд Хаксе . Проверено 30 апреля 2015 г.
  24. ^ "haxe/TestGADT.hx в стадии разработки · HaxeFoundation/haxe" . Гитхаб . 7 ноября 2021 г.
  25. ^ "Абстрактный" . Haxe — Кроссплатформенный набор инструментов . Проверено 24 апреля 2023 г.
  26. ^ Командная строка режима сервера: haxe --wait [host:]port
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 3f7047bb6475756596eff064fc12844f__1721170560
URL1:https://arc.ask3.ru/arc/aa/3f/4f/3f7047bb6475756596eff064fc12844f.html
Заголовок, (Title) документа по адресу, URL1:
Haxe - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)