Haxe

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 23:24, 8 июня 2016.
Haxe
File2.png
Спроектировано Haxe Foundation, Nicolas Canasse
Печать дисциплины статическая
OS Windows, OS X, Linux
Портал: http://haxe.org/

Haxe (произносится [ həx ]) это свободно распространяемый инструментарий для современных строго типизированных языков программирования высокого уровня, передовой быстродействующий кросс-компилятор, полная кросс-платформенная библиотека и способы доступа к родным средствам любых платформ.

Haxe включает в себя ряд обычных функциональностей, который поддерживаются всеми платформами, такие как численные типы данных, текст, массивы, бинарные и другие распространенные типы файлов[1][2]. Haxe также содержит специфичный API для Adobe Flash, C++, PHP и других языков[1][3].

Код, написанный на языке Haxe, может быть в чистом виде перекомпилирован в код ActionScript 3, программы JavaScript, Java, C#, C++, Python, PHP, Apache CGI, and серверных приложений Node.js[1][2][4]

Организация Haxe

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

Целям организации являются:

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

Инструментарий

Инструментарий Haxe это мощный свободно доступный инструментарий, который поможет перенести ваши разработки на новый уровень. Вместо того, чтобы развивать отдельные оптимизированные версии вашего приложения, ПО, игры или фреймворка для каждой отдельной платформы, вы можете позволить Haxe скомпилировать ваш проект на вашем целевом языке или платформе.

Позволяя вам сконцентрироваться на самых популярных платформах, Haxe не только добавляет гибкости процессу разработки, но и экономить ценное время и ресурсы.

Для этого инструментарий содержит в себе три основные компоненты:

  • язык Haxe - современные строго типизированный язык программирования высокого уровня
  • библиотека Haxe - полная кросс-платформенная стандартная библиотека
  • компилятор Haxe - невероятно быстрый кросс-компилятор

Кроме этого инструментарий Haxe предоставляет ряд дополнительных инструментов, которые позволят вам использовать Haxe еще эффективней.

Язык программирования

Язык программирования Haxe это очень современный язык высокого уровня. Он строго типизирован и легок в изучении, если вы уже знакомы с Java, C++, PHP, AS3 или любым другим похожим объектно-ориентированным языком[6]

Так как язык Haxe был разработан специально для инструментария Haxe, было уделено большое внимание его гибкости[7][8]. Например, язык легко адаптируется к поведению различных платформ, на которые вы нацелены в своей разработке. Это позволяет чрезвычайно эффективну. кросс-платформенную разработку, максимально сокращающую время и ресурсы.

Hello World

Язык программирования Haxe был спроектирован простым, но мощным. Его синтаксис в основном соответствует стандарту ECMAScript, но отклоняется, где необходимо. Следующая программа представляет "Hello World" на Haxe:

class HelloWorld {
    static public function main() {
        trace("Hello World");
    }
}

При установленном Haxe сохраненную в файле "HelloWorld.hx" программу можно скомпилировать их командной строки, например в JavaScript:

haxe -main HelloWorld -js HelloWorld.js

или в Java:

haxe -main HelloWorld -java path/to/java/out

Большая часть кода Haxe организована в классы и функции, что делает Haxe объектно-ориентированным языком, напоминающим Java, ActionScript 3 и C#. Однако Haxe довольно выразительный, мощный, с легко читаемым синтаксисом.

Особенности

  • Абстрактные типы

Абстрактные типы это конструкции времени компиляции, которая представляется в различном виде во время выполнения. Это позволяет придать абсолютно новое значение всем существующим типам.

  • Анонимные структуры

Данные легко могут быть сгруппированы в анонимные структуры, уменьшая потребность в классах небольших данных.

var point = { x: 0, y: 10 };
point.x += 10;
  • Массивы

Быстро создавайте и заполняйте массивы, используя циклы и логику.

var evenNumbers = [ for (i in 0...100) if (i%2 == 0) i ];
  • Классы, интерфейсы и наследование

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

  • Условная компиляция

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

#if js
    js.Lib.alert("Hello");
#elseif sys
    Sys.println("Hello");
#end
  • Алгебраические типы данных

Структуры могут быть выражены алгебраическими типами данных, которые известны как enums в языке Haxe. Более того Haxe поддерживает их обобщенный тип (GADT).

enum Result {
    Success(data:Array<Int>);
    UserError(msg:String);
    SystemError(msg:String, position:PosInfos);
}
  • Вызов макроса

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

  • Итераторы

Итерирование во множестве значений, например элементах массива, очень легкое в Haxe с использованием итераторов. Пользовательские классы могут быстро реализовать функциональность итераторов.

for (i in [1, 2, 3]) {
    trace(i);
}
  • Локальные функции и замыкание

Функции в Haxe не ограничены классами и могут быть объявлены в выражениях, что позволяет мощные замыкания.

var buffer = "";
function append(s:String) {
    buffer += s;
}
append("foo");
append("bar");
trace(buffer); // foobar
  • Метаданные

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

class MyClass {
    @range(1, 8) var value:Int;
}
trace(haxe.rtti.Meta.getFields(MyClass).value.range); // [1,8]
  • Статические расширения

Существующие классы и остальные типы могут быть пополнены дополнительной функциональность через статические расширения.

using StringTools;
"  Me &amp; You    ".trim().htmlEscape();
  • Строковая интерполяция

Строки, объявленные в одинарных кавычках, могут получать доступ к переменным в текущем контексте.

trace('My name is $name and I work in ${job.industry}');
  • Частичное выполнение функций

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

var map = new haxe.ds.IntMap();
var setToTwelve = map.set.bind(_, 12);
setToTwelve(1);
setToTwelve(2);
  • Паттерны

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

var a = { foo: 12 };
switch (a) {
    case { foo: i }: trace(i);
    default:
}
  • Свойства

Вариантные поля класса могут быть построены как свойства с использованием обычного доступа чтения/записи, что позволяет избирательный контроль.

public var color(get,set);
function get_color() {
    return element.style.backgroundColor;
}
function set_color(c:String) {
    trace('Setting background of element to $c');
    return element.style.backgroundColor = c;
}
  • Параметры типов, ограничения, неоднозначность

Типы могут быть параметризированы, тогда могут быть использованы типизированные ограничители и другие сложные структуры данных. Параметры типов также могут быть ограничены конкретными типами и правилами.

class Main<A> {
    static function main() {
        new Main<String>("foo");
        new Main(12); // use type inference
    }

    function new(a:A) { }
}

Стандартная библиотека

Стандартная библиотека Haxe предоставляет инструменты для общих целей, не содержит избыточных коллекций структур данных и алгоритмов. Распространение Haxe происходит через директорию std, содержащую библиотеку Haxe. Ее содержимое можно описать следующим образом:

  • Основная цель: Директория std сама по себе содержит некоторые высокоуровневые классные, как Array, Map, String, которые могут быть использованы с любой целью. Поддиректория Haxe содержит дополнительные структуры данных, API ввода/вывода и многие другие инструменты.
  • Система: Поддиректория sys содержит API, относящийся к файловым системам и базам данных. Дополнительно высокоуровневый класс Sys позволяет различные взаимодействия с ОС. К ним можно получить доступ только во время компиляции проекта в категории sys (C++, C#, Java, Neko, PHP)
  • Спецификация проекта: каждый проект имеет отдельную поддиректорию, содержащую специальный API. Доступ к нему может быть получен только при компиляции проекта.

API общего назначения

Доступен для всех проектов.

Высокоуровневый:

  • Array: Типизированная коллекция, которая определяется несколькими операциями, скомпилированными ECMA
  • Date, DateTools: Операции, относящиеся к датам и временным меткам
  • EReg: Регулярные выражения
  • Lambda: Операции над итерациями
  • Map: Соответствие ключ-значение в структуре данных
  • Math: Математические функции, скомпилированные ECMA
  • Reflect: Отображения областей
  • Std: Проверка типов во время выполнения; числовой анализ; конвертизация в числа и строки
  • String: Базовые операции над строками
  • StringBuf: Оптимизирован для построения строк
  • StringTools: Различные расширения для строк
  • Type: Отображения типов
  • Xml: Кросс-платформенный XML

Пакет Haxe:

  • haxe.Http: HTTP запросы
  • haxe.Json: Шифрование и расшифрование JSON
  • haxe.Resource: Работа с ресурсами Haxe
  • haxe.Serializer: Сериализация случайных объектов как строк
  • haxe.Template: Простая система шаблонов
  • haxe.Timer: Повторяющееся/отложенное выполнение; замеры
  • haxe.Unserializer: Дополнение к haxe.Serializer
  • haxe.Utf8: кросс-платформенные UTF8 строки
  • haxe.crypto: Различные алгоритмы шифрования
  • haxe.macro: Типы для работы с макросами Haxe
  • haxe.remoting: Различия между типами клиента и сервера
  • haxe.rtti: Информация типа выполнения
  • haxe.unit: Основной фреймворк для модульных тестов
  • haxe.web: Отображение URL в операции
  • haxe.xml: Дополнительные инструменты XML
  • haxe.zip: Поддержка формата ZIP

Пакет haxe.ds:

  • haxe.ds.ArraySort: Устойчивая кросс-платформенная сортировка массивов
  • haxe.ds.BalancedTree: Структура сбалансированного дерева
  • haxe.ds.EnumValueMap: Тип соответствий. поддерживающий печень значимых ключей
  • haxe.ds.GenericStack: Структура данных стэк
  • haxe.ds.IntMap: Тип соответствий, поддерживающий числовые ключи
  • haxe.ds.ObjectMap: Тип соответствий, поддерживающий объектные ключи
  • haxe.ds.StringMap: Тип соответствий, поддерживающий строковые ключи
  • haxe.ds.Vector: Структура данных фиксированного размера

Пакет haxe.io:

  • haxe.io.Bytes: Байтовые операции над родными представлениями
  • haxe.io.BytesBuffer: Оптимизирован для построения байтов
  • haxe.io.Path: Операции над строками путей

Системный API

Доступен на C++, C#, Java, Neko и PHP.

  • Sys: Выполняет родные команды; взаимодействует с stdin, stdout и stderr; различает остальные родные операции
  • sys.FileSystem: Считает и редактирует директории: получает информацию о файлах и директориях
  • sys.db: API для работы с базами данных MySQL и SQLite
  • sys.io.File: Чтение и запись содержимого файла; копирование файлов
  • sys.io.Process: Использует обычные процессы === Специфические API ===
  • cpp:
    • cpp.Lib: Низкоуровневые взаимодействия
    • cpp.net: Инструменты для взаимодействия с сетями и запуска серверов
    • cpp.vm: API потоков, отладчик, профайлер и т.д.
    • cpp.zip: API для работы с zip сжатием
  • cs: API для C#
  • flash:
    • flash: Внешние файлы для Flash API
    • flash.Lib: Базовые взаимодействия с Flash платформой
    • flash.Memory: Внешние файлы для API Flash памяти
    • flash.Vector: Внешние файлы для Flash векторов
  • flash8:
    • flash8 Внешние файлы для Flash 8 API
  • java: API для Java
  • js:
    • js.Browser: Быстрые вызовы для обычных функций браузера
    • js.Cookie: Помощь в взаимодействии с HTTP куки в браузере
    • js.JQuery: Внешние класс и документация для jQuery
    • js.Lib: Быстрые вызовы для alert(), eval() и отладчика
    • js.html: Внешние файлы для взаимодействия с DOM браузера
  • neko:
    • neko.Lib: Низкоуровневое взаимодействие с платформой neko
    • neko.Web: Работа с запросами и ответами HTTP
    • neko.net: Инструментарий для взаимодействия с сетями и запускном сервером
    • neko.vm: API для мультипоточных программ
    • neko.zip: API для работы со сжатием zip
  • php:
    • php.Lib: Низкоуровневое взаимодействие с платформой PHP
    • php.Session: Работа с родными сессиями PHP
    • php.Web: Работа с запросами и ответами HTTP
    • php.db.PDO: Дополнительный PDO драйвер для взаимодействия с базой данных

Кросс-компилятор

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

Основное применение

Компилятор Haxe обычно вызывается с командной строки с несколькими аргументами, которые должны ответить на два вопроса:

  • Что должно быть скомпилировано?
  • Что следует быть на выходе?

Чтобы ответить на первый вопрос, обычно достаточно указать пусть к классу, использовав аргумент -cp, который должен быть скомпилирован вместе с аргументом -main dot_path. Компилятор разделяем основной файл класса и начинает компиляцию.

Второй вопрос обычно сводится к указанию аргумента, специфицирующего желаемую платформу. Каждой из них выделен переключатель, например js file_name для JavaScript и -php directory для PHP. В зависимости от природы платформы значение аргумента это имя файла (для -js, -swf, -neko и -python) или путь к каталогу.

Базовые аргументы

  • Ввод:
    • -cp path Добавляет путь к классу, где найдены исходники .hx или пакеты.
    • -lib library_name Добавляет библиотеку Haxelib.
    • -main dot_path Устанавливает класс main.
  • Вывод:
    • -js file_name Генерирует исходный код JavaScript в специальном файле.
    • -as3 directory Генерирует исходный код ActionScript 3 в директории.
    • -swf file_name Генерирует специальный файл как Flash .swf.
    • -neko file_name Генерирует бинарный файл Neko как специальный файл.
    • -php directory Генерирует исходный код PHP source code в директории.
    • -cpp directory Генерирует исходный код C++ source code в директории и компилирует его с использованием родного компилятора C++.
    • -cs directory Генерирует исходный код C# source code в директории.
    • -java directory Генерирует исходный код Java в директории и компилирует его с использованием компилятор Java.
    • -python file_name Генерирует исходный код Python в специальном файле.

Особенности

  • Встроенные метаданные компилятора

Начиная с версии 3.0, вы можете получить список установленных компилятором метаданных, запустив --help-metas

Метаданные Описание Платформа
@:abi Функция соглашения ABI/вызова cpp
@:abstract Устанавливает основную реализацию класс как абстрактный тип cs java
@:access (Target path) Обеспечивает приватный доступ с типу пакета или полю all
@:allow (Target path) Разрешает приватный доступ из типа пакета или поля all
@:analyzer Используется для конфигурации статического анализатора all
@:annotation Аннотация (@interface) определений в -java-lib, импорт будет аннотирован этими метаданными. не оказывается эффекта на типы, скомпилированные Haxe java
@:arrayAccess Позволяет доступ к Array как к абстракции all
@:autoBuild (Build macro call) Расширяет метаданные @:build до всех реализованных классов all
@:bind Перегрузка декларации класса Swf flash
@:bitmap (Bitmap file path) Вставляет данные битовой карты в класс flash
@:bridgeProperties Создает родные мосты свойств для всех свойств Haxe в классе cs
@:build (Build macro call) Создает класс или перечисление для макроса all
@:buildXml Специфицирует данные xml для внедрения в Build.xml cpp
@:callable Абстрактный предварительный вызов для основного типа all
@:classCode Использовался для внедрения родного кода платформы в класс cs java
@:commutative Объявляется абстрактный оператор коммутативным all
@:compilerGenerated Помечает поля как сгенерированные компилятором. Не следует быть использованным конечным пользователем cs java
@:coreApi Идентифицирует класс как внутренний класс API all
@:coreType Идентифицирует абстрактный класс как внутренний тип, который, следовательно, не требует реализации all
@:cppFileCode Код, внедряемый в созданный файл cpp cpp
@:cppInclude Файл, который должен быть включен в созданный файл cpp cpp
@:cppNamespaceCode cpp
@:dce Обеспечивает исключение мертвого кода, даже если указано -dce full all
@:debug Обеспечивает создание отладочной информации в Swf даже без указания -debug flash
@:decl cpp
@:defParam all
@:delegate Автоматически добавляется к делегатам в -net-lib cs
@:depend cpp
@:deprecated Автоматически добавляется к полям класса, аннотированные @Deprecated, в -java-lib. Не влияет на типы, скомпилированные Haxe java
@:event Автоматически добавляется к событиям в -net-lib. Не влияет на типы, скомпилированные Haxe cs
@:enum Определяет множества конечных значений в абстрактном определении all
@:expose (?Name=Class path) Делает доступным класс в окне объекта или экспорте для node.js js
@:extern Помечает поля как внешние, которые, следовательно, не создаются all
@:fakeEnum (Type name) Обрабатывает перечисляемый тип как коллекцию значений специального типа all
@:file(File path) Включает данный бинарный файл в Swf и ассоциирует его с классом flash
@:final Предотвращает, что класс окажется внешним all
@:font (TTF path Range String) Включает данный шрифт TrueType в класс flash
@:forward (List of field names) Предопределяет доступ поля к основному типу all
@:from Специфицирует, что все поля абстрактного класса это операции приведения типов к определенным в функции all
@:functionCode cpp
@:functionTailCode cpp
@:generic Помечает класс или поле класса как основной, поэтому любой комбинация параметров типа создает свой тип/поле all
@:genericBuild Создает экземпляр типа, используя специальный макрос all
@:getter (Class field name) Создает родную функцию get в данном поле flash
@:hack Позволяет расширение классов, помеченных @:final all
@:headerClassCode Код, внедряемый в заголовочный файл созданного класса cpp
@:headerCode Код, внедряемые в созданный заголовочный файл cpp
@:headerNamespaceCode cpp
@:hxGen Аннотирует, что внешний класс был создан в Haxe cs java
@:ifFeature (Feature name) Обуславливает поле быть принятым DCE, если данное свойство является частью компиляции all
@:include cpp
@:initPackage all
@:internal Создает аннотированное поле/класс с внутренним доступом cs java
@:isVar Обеспечивает создание физического поля для свойств, которые не понадобятся all
@:javaCanonical (Output type package,Output type name) Использовалось в Java для аннотации канонического пути к файлу java
@:jsRequire Создает модуль на javascript js
@:keep Обуславливает поле быть принятым DCE all
@:keepInit Обуславливает поле быть принятым DCE, даже если оно удалено all
@:keepSub Расширяет метаданные @:keep до реализованных и внешний классов all
@:macro (устарело) all
@:mergeBlock Соединяет аннотированный блок в текущий диапазон all
@:meta Использовался для пометки поля класса как поле метаданных all
@:multiType (Relevant type parameters) Специфицирует, что все абстракция выбирает тип this из функций @:to all
@:native (Output type path) Переписывает пути классов или перечислений в течение генерации all
@:nativeChildren Аннотирует, что все дети данного типа должны быть обработаны, там, где было внешнее определение- в соответствии с платформой cs java
@:nativeGen Аннотирует, что тип должен быть обработан там, где было внешнее определение- в соответствии с платформой java
@:nativeProperty Использует родные свойства, которые будут исполнены с динамическом режиме cpp
@:noCompletion Предотвращает компилятор от предложения завершения в поле all
@:noDebug Не генерирует отладочную информацию в Swf, даже если указан -debug flash
@:noDoc Предотвращает, что тип не будет включен в создание документации all
@:noImportGlobal Предотвращает, что статическое поле будет импортировано с импортом Class.* all
@:noPrivateAccess Запрещает приватный доступ ко всему для аннотированного выражения all
@:noStack cpp
@:noUsing Предотвращает, что поле будет использовано с using all
@:nonVirtual Объявляет функции как не virtual cpp
@:notNull Объявляет абстрактные типы как не принимающие нулевые значения all
@:ns Использовался генератором Swf для управления пространствами имен flash
@:op (The operation) объявляет абстрактное поле как перегрузку оператора all
@:optional Помечает поле структуры как необязательное all
@:overload (Function specification) Позволяет полю быть вызванным с различными типами аргументов. Спецификация функции не может быть выражением all
@:privateAccess Позволяет аннотированным выражениям полный приватный доступ all
@:property Помечает свойства поле, как поле, которое должно быть скомпилировано как родное свойство C# cs
@:protected Помечает поле класса как защищенное all
@:public Помечает поле класса публичным all
@:publicFields Обеспечивает, что все поля наследованного класса буду публичными all
@:pythonImport Генерирует импорт python для внешних классов python
@:readOnly Генерирует поле с ключевым словом readonly cs
@:remove Удаляет интерфейс из реализованных классов до генерации all
@:require (Compiler flag to check) Позволяет доступ к полю только если установлен флаг компилятора all
@:rtti Добавляет информацию о выполнении all
@:runtime all
@:runtimeValue Помечает абстракцию как значение хода выполнения all
@:selfCall Переводит вызовы методов напрямую в вызов объекта js
@:setter (Class field name) Создает родной метод set для данного поля flash
@:sound (File path) Включает данный .wav или .mp3 файл в Swf и ассоциирует их с классом flash
@:sourceFile Имя файла исходного кода для внешнего класса cpp
@:strict Использовался для объявления родного атрибута C# или родных метаданных Java. Обеспечена проверка типов cs java
@:struct помечает определение класса как структуру cs
@:structAccess Помечает внешний класс, используя доступ к структуре ('.'), а не указатель ('->') cpp
@:suppressWarnings Добавляет аннотацию SuppressWarnings для созданного класса Java java
@:throws (Type as String) Добавляет вбрасываемую декларацию в созданную функцию java
@:to Специфицирует, что поле абстракции является операцией приведения типов, идентифицированной в функции all
@:transient Добавляет флаг перехода полю класса java
@:unbound Внутреннее средство компилятора для различия непривязанных глобальных переменных all
@:unifyMinDynamic Позволяет унифицировать коллекцию типов в Dynamic all
@:unreflective cpp
@:unsafe Объявляет класс или метод с небезопасным флагом C# cs
@:usage all
@:value Использовался для хранения значений по умолчанию для полей и аргументов функций all
@:void Использует родной возвращаемый тип 'void' в Cpp cpp
@:volatile cs java
  • Исключение мертвого кода

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

В DCE существует три режима, которые устанавливаются через командную строку:

  1. -dce std: DCE проверяет только классы из стандартной библиотеки Haxe (по умолчанию).
  2. -dce no: DCE не используется.
  3. -dce full: DCE применяется ко всем классам.

Алгоритм DCE хорошо работает с написанным кодом, но могут быть сбои, когда задействована динамика и отражение. Это может потребовать пометки полей или классов, как использованных следующими метаданным:

  1. @:keep: Применимо к классу - класс не подвергается DCE. Если к полю - аналогично.
  2. @:keepSub: Применимо к классу - работает аналогично @:keep с аннотированным классом также как и с подклассами.
  3. @:keepInit: Обычно класс, в котором все поля удалены DCE (или изначально пустой) удаляется из вывода. С использованием этих метаданных- такие классы не удаляются.

Если необходимо пометить класс @:keep из командной строки вместо того, чтобы изменять исходный код, то для этого доступны макросы компилятора: --macro keep('type dot path'). Пакет будет помечен, модуль или подтип будут сохранены DCE и включены в компиляцию.

Компилятор автоматически определяет флаг DCE значениями "std", "no" или "full" в зависимости от активного режима. Это может быть использовано в условной компиляции.

  • Замыкание

Богатая система типов в компиляторе Haxe затрудняет точное замыкание информации для IDE и редакторов. Среди определений типов и макросов это может потребовать достаточное количество работы по репликации процесса. Поэтому компилятор поставляется с встроенным режимом замыканий для ПО третьей стороны.

Все замыкания включаются с использованием аргумента --display file@position[@mode]. Требуемые аргументы:

  1. file: Файл для проверки замыканием. Это должен быть полный или сокращенный путь к .hx файлу. Не соблюдает пути к классам или библиотекам.
  2. position: Позиция байта, где необходимо проверить замыкание в данном файле.
  3. mode: Используемый режим (см. ниже).
  4. Field access: Предоставляет список полей, которые могут быть доступны в данном типе.
  5. Call argument: Сообщает тип функции, которая была вызвана.
  6. Type path: Список пакетов, подтипов и статических полей.
  7. Usage: Список всех вхождений данного типа, поля или переменной во всех скомпилированных файлах (режим: "usage").
  8. Position: Сообщает позицию, где данный тип, поле или переменная определена (режим: "position").
  9. Top-level: Предоставляет список всех идентификаторов, которые доступны в данной позиции (режим: "toplevel").

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

  • Ресурсы

Haxe предоставляет простые ресурсы внедрения системы, которые могут быть использованы при внедрении файлов напрямо в компилируемое приложение.

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

  • Внедрение ресурсов

Внешние файлы включаются с использованием аргумента -resource:

-resource hello_message.txt@welcome

Строка после символа @ является идентификатором ресурса, который используется в коде для поиска ресурса. Если он опущен (вместе с @), тогда имя файла станет этим идентификатором.

  • Получение текстовых ресурсов

Чтобы найти содержимое внедряемого ресурса мы используем статический метод getString из haxe.Resource, передавая ему идентификатор ресурса:

class Main {
  static function main() {
    trace(haxe.Resource.getString("welcome"));
  }
}

Код выше покажет содержимое файла hello_message.txt, которые был заранее включен с идентификатором "welcome".

  • Получение бинарных ресурсов

В то время как не рекомендовано внедрять большие бинарные файлы в приложение, это иногда может быть полезно. Бинарное представление подключаемого ресурса может быть получено через статический метод getBytes из haxe.Resource:

class Main {
  static function main() {
    var bytes = haxe.Resource.getBytes("welcome");
    trace(bytes.readString(0, bytes.length));
  }
}

Возвращаемый тип функции getBytes - haxe.io.Bytes, который является объектом, представляющим доступ к отдельным байтам данных.

  • Детали реализации

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

  1. Ресурсы Flash вставлены как определения ByteArray
  2. Ресурсы C# включены в сборку
  3. Ресурсы Java упакованы в результирующий JAR файл
  4. Ресурсы C++ хранятся в глобальной константе - массиве байт
  5. Ресурсы JavaScript сериализованы в Haxe формате сериализации и хранятся в статическом поле в классе haxe.Resource.
  6. Ресурсы Neko хранятся в виде строк в статическом поле класса haxe.Resource.
  • Информация выполнения

Компилятор Haxe генерирует информацию выполнения (RTTI) для классов, которые аннотированы, или расширенных классов, аннотированные метаданными :rtti. Эта информация хранится как XML строка в специальном статическом поле __rtti и может быть обработано через haxe.rtti.XmlParser. Результирующая структура описана в структуре RTTI.

Тип haxe.rtti.Rtti был введен с версии 3.2.0 для облегчения работы с RTTI. Получение этой информации сейчас очень легкое:

@:rtti
class Main {
  var x:String;
  static function main() {
    var rtti = haxe.rtti.Rtti.getRtti(Main);
    trace(rtti);
  }
}

Примечания

  1. 1,0 1,1 1,2 Ponticelli, Franco (2008-02-11). Professional haXe and Neko. Wiley. ISBN 0470122137.
  2. 2,0 2,1 "Haxe Docs"
  3. "Haxe Docs"
  4. "GameHaxe website"
  5. [1]
  6. Grden, John; Mineault, Patrick; Balkan, Aral; Hughes, Marc; Arnold, Wade (2008-07-16). The Essential Guide to Open Source Flash Development. Apress. p. Chapter 9 (Using Haxe). ISBN 1430209941.
  7. [2]
  8. Fisher, Matt (2013-01-01). HTML5 for Flash Developers. Packt Publishing Ltd. ISBN 1849693331.