JPHP – это альтернативная реализация языка php, от автора DevelNext. Проект jphp был начат еще в октябре 2013 года, целью проекта было написать компилятор в байткод (аля машинный код) Java, который затем бы выполнялся на виртуальной машине Java (да это и язык и виртуальная машина, название одинаковое). Виртуальная машина (JVM если коротко), способна выполнять этот “машинный код” очень быстро, применять технику JIT там где необходимо и даже оптимизировать полученный код, все для того, чтобы код выполнялся быстрее.
Первый результат
И это удалось сделать, уже в середине 2014 года, JPHP поддерживал все языковые возможности из php 5.5, а осенью были реализованы фичи из php 5.6. На тот момент никакой речи о PHP 7 почти не было и JPHP обгонял по скорости оригинальный движок в среднем в 2-3 раза на многих тестах. Это было стимулом разработки.
JPHP изначально проектировался так, чтобы избавиться от некоторых проблем оригинального движка php, которые, кстати, стали одной из причин кончины проекта DevelStudio. Так вот, это:
- Многопоточность + потокобезопастный движок.
- Настоящие юникодные строки, которые не смогли реализовать в php 7.
- JIT и скорость выполнения (конечно с php 7 это уже не так актуально, движок по скорости почти одинаковый).
- Возможность использовать богатый набор Java библиотек и фреймворков (а их больше чем в php).
- Свои стандартные библиотеки взамен уродливых и несогласованных функций из оригинального php, об этом ниже.
И все это удалось воплотить и реализовать примерно за 1 год активно разработки.
Появление “первого” DevelNext
JPHP к осени 2014 года уже был разработан, правились баги, дорабатывалось что-то по мелочи. Не было ни малейших планов начинать разработку DevelNext. Началось все с попытки создать профессиональную среду именно для jphp, не для начинающих, не для любителей, а для самых обычных программистов, которые кодят на php. Хотелось быть похожим на PhpStorm и все в таком духе. Разработка среды началась с помощью JPHP и библиотеки Swing для написания UI. Сохранился даже старый репозиторий с исходниками https://github.com/develnext/develnext. Исходный код среды разрабатывался на php с помощью движка JPHP.
В ide было дерево проекта с файлами и простая система редакторов, без визуального редактора для UI, чистый код. Swing для UI был не очень удобен и устаревшим, если на чистоту. Разработка вяло продолжалась несколько месяцев и подошла к концу в марте 2015 года. Пришло осознание, что проект в таком виде будет никому не нужен, а уж jphp и подавно. Это все давило и было решено приостановить разработку до конкретных сроков, до середины 2015 года…
Появление “второго” DevelNext
Всем пользователям было обещано, что разработка DevelNext возобновится в июле 2015 года. Если честно, не хотелось говорить, что проект закрыт и делать его дальше нет сил и смысла, поэтому просто было дано обещание, что через 5 месяцев, если произойдет чудо, то что-то будет. И чудо произошло. Пришла идея того, что надо ориентироваться на ту аудиторию, что была у DevelStudio, на начинающих, на любителей и это даст новый толчок проекту. Концепция полностью изменилась – если раньше это профессиональный инструмент, то теперь это инструмент для всех, с дружественным интерфейсом, с понятными мастерами и помощниками. Что-то вроде Game Maker, Construct или Unity.
Было также решено написать расширение jphp для JavaFX, молодой библиотеки для построения десктопных приложений. И не зря, это было самым удачным шагом. JavaFX во многом превосходил устаревшую технологию Swing, он поддерживал скинизацию и CSS стили, а в последствии появился проект, который позволил запускать JavaFX приложения на Android и iOS платформах.
Поэтому, пришлось полностью переписать проект с нуля, выкинув все старое. Все это удалось начать еще в июне 2015 года, а в июле показать первый примитивный прототип пользователям.
Параллельное развитие JPHP
После начала разработки DevelNext, началась активная разработка jphp в плане новых расширений и модулей. Многое писалось на скорую руку, т.к. было необходимо самой среде. JPHP обрастал новым функционалом, появилось много стандартных функций и классов, которых еще до DevelNext не было. Было также принято идеологическое решение – не использовать родные функции php, по типу str_replace() или strpos(), в кодовой базе.
Да да, практически весь DevelNext на 99% написан только с помощью классов, которые есть только в jphp, но которых нет в оригинальном. Вот некоторые из них:
- Классы php\lang\fs для файловой системы, php\lang\arr для массивов, php\lang\str для строк.
- Классы Stream (FileStream, MemoryStream, ResourceStream и другие)
- Классы Thread и ThreadPool для многопоточности (DevelNext очень активно их использует в отличии от DevelStudio).
- Класс Regex для регулярных выражений.
- И многие другие…
К тому же, в jphp практически нет своих уникальных функций, все новое АПИ основано на ООП и классах.
Итоги на сегодняшний день
JPHP обзавелся поддержкой почти всех функций из стандарта php 7.0 и 7.1 (последних версий), на нем написан сам DevelNext, поэтому если вдруг, в jphp будет допущена ошибка или что-то сломает обратную совместимость, это сильно отразится на DevelNext, он банально может не запуститься. Проект содержит в себе много тысяч строк кода на php, движок jphp очень стабилен и имеет минимум багов, раз способен запускать такой огромный проект. Это все позволяет одновременно развивать DevelNext и тестировать сам JPHP.
DevelNext не может работать без JPHP, а вот JPHP легко может работать сам по себе, движок полностью независимый, его можно встроить в любое Java приложение и исполнять код php. Можно даже собрать исполняемый Jar и запаковать его в exe, например.
Движок JPHP состоит из двух основных модулей:
- Runtime – стандартная библиотека.
- Core – сам компилятор в байткод JVM.
Компилятор отделен от Runtime библиотеки, сделано это для того, чтобы если захочется, можно было бы переориентировать компилятор под другую платформу, сделать компиляцию, например, в JS код или под платформу .NET. Но пока в этом нет необходимости. Также, это сделано и для того, чтобы скомпилированные исходники JPHP могли запускаться и без компилятора, а это уже очень необходимо при разработке под мобильные платформы.