13 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Проекты по созданию компиляторов из Java в JavaScript и исполняемые файлы

Проекты по созданию компиляторов из Java в JavaScript и исполняемые файлы

Candellmans

В рамках проекта TeaVM развивается компилятор, позволяющий компилировать Java-байткод в JavaScript и WebAssembly для последующего выполнения в браузере. Ключевым отличием от проекта GWT (Google Web Toolkit) является то, что TeaVM выполняет трансляцию на уровне байткода (может компилировать файлы *.class или *.jar), без привязки к исходным текстам на языке Java, что позволяет компилировать проекты на языках Kotlin и Scala. Код TeaVM распространяется под лицензией Apache 2.0.

Основной целью TeaVM является предоставление средств по созданию web-приложений для разработчиков знакомых с Java, унификации платформы для разработки (фронтэнд на базе те же технологий, что и бэкенд) или при необходимости задействования в web-приложении уже имеющегося кода на Java. TeaVM по возможности сохраняет оригинальную структуру методов, выдавая читаемый и понятный JavaScript. Для разработки одностраничных web-приложений на Java, Kotlin или Scala предлагается web-фреймворк Flavour, похожий на Angular, но базирующийся на идиомах Java, а не JavaScript.

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

Также можно отметить фреймворк Substrate VM, позволяющий выполнить компиляцию Java-приложений в форму самодостаточных исполняемых файлов или разделяемых библиотек (ELF-64 или 64-bit Mach-O). В Substrate VM применяется полноценная AOT-компиляция (Ahead-of-Time) без симуляции через запуск байткода в виртуальной машине. Фреймворк распространяется под лицензией GPLv2 и развивается компанией Oracle в рамках проекта Graal по разработке нового JIT-компилятора и runtime для JVM.
OpenNews: Проекты по созданию компиляторов из Java в JavaScript и исполняемые файлы

Компиляция программы java в исполняемый файл [дубликат]

Я только что сделал простую программу с eclipse, и я хочу скомпилировать ее в исполняемый файл, но просто не могу понять, как это сделать. Пожалуйста помочь.

7 ответов

вы можете конвертировать .jar file to .exe на этих путях:

1 – JSmooth .exe обертка:
JSmooth-это исполняемая оболочка Java. Он создает собственные пусковые установки Windows (стандартные .exe) для ваших приложений java. Это делает развертывание java намного более плавным и удобным для пользователя, так как он может найти любую установленную Java VM сам по себе. Если виртуальная машина недоступна, оболочка может автоматически загрузить и установить подходящую JVM или просто отобразить сообщение или перенаправить пользователь веб-сайта.

JSmooth предоставляет различные обертки для вашего приложения java, каждый из которых имеет свое собственное поведение: выберите свой вкус!

Читать еще:  Как смотреть фильмы на телевизоре через wi-fi

2 – JarToExe 1.8
Jar2Exe-это инструмент для преобразования файлов jar в exe-файлы. Ниже приведены основные функции, описанные на их веб-сайте:

  • смогите произвести “консоль”, “GUI Windows”, ” Windows Сервис ” три типа exe файлов.
  • генерируемые exe-файлы могут Добавлять значки программ и информацию о версии.
  • генерируемые exe-файлы могут шифровать и защищать java-программы, при запуске программы временные файлы не генерируются.
  • генерируемые exe-файлы обеспечивают поддержку значков в системном трее.
  • генерируемые exe-файлы обеспечивают поддержку журнала событий системы записи.
  • генерируемые exe-файлы службы windows могут устанавливать / удалять себя, и Служба поддержки пауза / продолжить.
  • новый выпуск версии x64, может создавать 64-битных руководителей. (18 мая 2008)
  • поддерживается режим мастера и режим командной строки. (18 мая 2008)

3 – исполнитель
Упакуйте приложение Java как jar, и исполнитель превратит jar в файл Windows exe, неотличимый от родного приложение. Просто дважды щелкнув exe-файл, вы вызовете среду выполнения Java и запустите приложение.

EDIT: ссылка выше сломана, но вот страница (с рабочей загрузкой) из интернет-архива. http://web.archive.org/web/20090316092154/http://mpowers.net/executor/

4 – Расширенный Установщик
Расширенный установщик позволяет создание установки Windows MSI в считанные минуты. Это также поддерживает Windows Vista, а также помогает создавать пакеты MSI на других языках.
Скачать: http://www.advancedinstaller.com/ Дайте мне знать другие инструменты, которые вы использовали для преобразования JAR в EXE.

Я бы использовал GCJ (компилятор GNU для Java) в вашей ситуации. Это компилятор AOT (досрочно) для Java, так же как GCC для C. Вместо интерпретации кода или генерации промежуточного кода java, который будет запущен позже Java VM, он генерирует машинный код.

GCJ доступен практически в любой системе Linux через соответствующий менеджер пакетов (если таковой имеется). После установки компилятор GCJ должен быть добавлен в путь, чтобы его можно было вызвать через терминал. Если вы используете Windows, вы можете загрузить и установить GCJ через Cygwin или MinGW.

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

Скрипты, модули и библиотеки

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

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

Примеры в этой статье приводятся на JavaScript, но язык не принципиален. Все эти же особенности присущи и остальным динамическим языкам, например, таким как PHP, Python или Ruby.

Читать еще:  Jaxb (XJC) генерация классов из XML Schema (XSD) с описаниями классов и полей в виде аннотаций. XJC плагин

Модуль

Начнем с терминологии. Модуль это файл содержащий определения функций, классов и других сущностей (в зависимости от языка). В разных языках модули называют разными словами, но суть от этого не меняется. Ниже пример модуля содержащего класс User :

Сами по себе модули не являются законченными программами. Их нельзя (бессмысленно) выполнять напрямую, например, запустив в командной строке. Модули предназначены для использования другими модулями (или скриптами). Обычно в языках для этого есть либо механизм импортов, либо механизм автозагрузки, либо то и другое вместе. В JavaScript, чтобы получить доступ к определениям внутри какого-то модуля, его нужно импортировать:

Частая ошибка, которую совершают новички при создании модулей, – выполнение кода вне определений. Например, так:

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

В некоторых языках так написать просто невозможно, например, в Java. Компилятор это просто не пропустит. В других языках такой код запрещен стандартами кодирования. Например, линтер в PHP выводит следующее предупреждение:

A file SHOULD declare new symbols (classes, functions, constants, etc.) and cause no other side effects, or it SHOULD execute logic with side effects, but SHOULD NOT do both.

Почему? Главная причина в непредсказуемости поведения. Код, определенный на уровне модуля (вне других функций), вызывается во время автозагрузки или при импорте. Причём не всегда можно точно сказать, где это происходит и сколько раз. Обычно за загрузку кода отвечает какой-либо фреймворк.

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

Помимо указанных особенностей подобный код часто выполняет побочные эффекты, меняет внутреннее состояние программы, например, глобальные переменные. Это значит, что после загрузки такого модуля у вас вдруг внезапно программа начинает вести себя по-другому. Особенно этим грешат ruby и javascript.

Чтобы быть до конца справедливым, иногда это оправдано.

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

то такой файл будет невозможно загрузить в среду, где отсутствует document . И подмену тоже никак не сделать, так как модуль – это не функция, он не позволяет реализовать инверсию зависимостей.

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

Скрипт

Что такое скрипт? Скрипт – это любой файл, который предназначен для запуска из командной строки. Он может быть исполняемым, но в общем случае это не обязательно:

Этот скрипт содержит вызов функции, которая печатает на экран текущую дату:

Читать еще:  Определитель музыки для iphone

Сам скрипт запускается не напрямую, а через интерпретатор. Такой подход часто используется во время разработки.

Когда скрипт «выпускается» для использования другими людьми, то наличие интерпретатора скрывают, а сам скрипт делают исполняемым. В некоторых языках, дополнительно, из названия исполняемого файла удаляют расширение. Это связано с тем, что для пользователей этого скрипта становится неважно, на каком языке он написан. В JavaScript этого делать не нужно, потому что имя скрипта не связано с названием файла.

Запуск такого скрипта выглядит так:

Чтобы сделать наш файл date исполняемым, нужно выполнить две задачи:

    Добавить права на исполнение: chmod +x date .

Добавить шебанг в начало файла:

Такая запись внутри исполняемых файлов (скриптов) помогает командному интерпретатору, например, bash, подобрать правильный интерпретатор для запуска файла на исполнение.

Исполняемый файл предназначен только для прямого запуска. Это тупиковый файл. Его нельзя (технически можно, но нельзя) импортировать в другие модули. Он просто не предназначен для этого. Скрипты могут использовать модули, но модули не могут обращаться к скриптам.

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

Что насчет тестирования? Из-за своей природы скрипты крайне плохо тестируются. С ними нельзя работать, как с обычным кодом. В тестах придётся запускать их как обычную программу и смотреть, что она делает через, например, анализ STDOUT.

Из этого следует одно очень важное правило. Любой нетривиальный скрипт должен быть всего лишь способом запустить библиотечный код.

Библиотеки и утилиты командной строки

Такие пакеты, как eslint или babel, могут использоваться в двух режимах:

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

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

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

В свою очередь скрипт может иметь отдельную логику, которая не имеет отношения к библиотеке. К такой логике, например, относится парсинг аргументов командной строки: eslint —formatter json src . Эта часть приложения существует только тогда, когда с пакетом работают как с утилитой. Парсинг можно размещать напрямую в скриптах, либо выносить в отдельный модуль, который не связан напрямую с используемой библиотекой.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов: