Pull to refresh

Comments 108

Занятно! А во время реализации возникала проблема с тем что сам по себе PHP — язык не строгой типизации, а Java — строгой или на уровне байт-кода никакой разницы нет?
Вы не могли бы отдельной заметкой рассказать процесс создания JPHP? Я думаю многим было бы интересно.
С типизацией проблем не было вообще никаких. Проблема в другой магии, например вызов динамичных методов статичным способом, система классов java не позволяет делать такое. Я хотел написать о процессе создания, но понял что все это не влезет в одну статью. Напишу потом отдельную статью.
вызов динамичных методов статичным способом

invokedynamic? Оно позволяет во время выполнения определять, какой код будет вызван, с произвольным механизмом разрешения целевого метода.
Да, но он не поддерживается в Java 6, а она еще очень распространена.
Когда создаёте столь специфичное решение, вы в праве требовать специфичного окружения и не париться.
Не хочу обидеть, но наболело. В частности, именно из-за такой логики древнее г-но типа Java 6 до сих пор и используется. Шестой джаве уже шесть лет, седьмой — почти четыре года, только что восьмая вышла. Если цепляться за эти древности, то на свежие версии никогда перехода не будет. А это очень печально :(

Посмотрите на Ceylon — авторы языка явно требуют Java 7. А этот язык гораздо ближе к джаве, чем ваш. Полностью поддерживаю igordata.
PHP 5.3 вышел в 2009 году, ему тоже 6 лет, однако многие его еще поддерживают. JRuby и Jython поддерживают Java 6. С моей стороны переход на Java 7 ничего особенного кроме invokedynamic не дает. Скажу честно, без него прекрасно можно обходиться, но это технические детали, если вкратце, то порой вызов метода рефлексией бывает быстрее, чем через invokedynamic, только в Java 8 они это поправили.
Всеми известная и любимая Scala поддерживает еще JDK 1.6
Кстати, интересно, как на ней на уровне JVM реализованы «функции как первоклассные объекты» — через синглетоны типа как анонимные классы в Java?
Да так и есть, если я не ошибаюсь. По сути анонимных классов в байткоде JVM не существует, они превращаются в именованные классы и название у них = «имя класса в котором находится анонимный класс» + "$" + «index + 1».
На каждый чих (а в идеале можно все циклы заменить ленивыми списками ;-) ) по классу в PermGenSpace. Весёленько…
Вы выпускаете рантайм, которые если и будет использоваться (уж извините за пессимизм, но он уж очень специфичен, и в сравнении с HHVM пользоваться им будут не так часто), то поставить нужную версию JDK/Java не составит проблем. То есть вы вправе делать все даже уже и под 8-ую версию.
Поддержу. Требования к обратной совместимости отсутствуют.
Если я хочу в дальнейшем реализовать поддержку/порт под Android, то мне нужна поддержка Java 6, т.к. Google только недавно реализовал поддержку Java 7.
У меня сейчас не получилось найти ссылку на запись выступления Алексея Шипилева, где он рассказывает __какие__ баги были пофиксены в jdk седьмой версии (куча багов с concurrency, например). При этом фиксы не были включены в шестую jdk.
Поэтому, юзайте jdk6 на свой страх и риск. :)
Это же не значит, раз я поддерживаю jdk6, то использую ее. Запускайте jphp хоть на jdk7, хоть на jdk8, эти проблемы будут решены, о которых вы пишите. Но для андроида нужен jdk6. Кстати на 1.7 jphp работает быстрее, а на 1.8 еще более быстрее.
Пожалуйста, выбросьте поддержку Java 6.
JPHP компилирует PHP-код в сборку, совместимую с другими java-приложениями, или же выполняет код в рантайме? Есть ли возможность кросс-взаимодействия, например импортировать в php-скрипт некий внешний java-тип?
Он компилирует в байткод JVM, который можно сохранить в файл и загрузить его заново. Однако, чтобы вызвать код php из java, например метод класса, нужно использовать апи движка, уж сильно большие различия в ооп, да и еще динамическая типизация не позволяет сделать это просто. Можно писать расширения на Java.
Класс! Кстати, вы не смотрели на реализацию компилятора PHP под .NET? Устройство виртуальных машин довольно схожее, возможно удастся что-то почерпнуть. Правда, я давно не слежу за проектом — не знаю, насколько он совместим с последними возможностями языка.
Нет только в общих чертах. Они заявляют о поддержке php5.4+. В основном я смотрел реализацию quercus.caucho.com/, но это транслятор в java код, а не компилятор в jvm байткод.

Думаю .NET байткод еще более продвинутый.
Такой странный вопрос: почему JVM, а не LLVM? Рассматривался ли LLVM вообще?
Потому что я программирую на Java в основном, опыта работы с С++ у меня вообще нет. Я даже не знаю, есть ли в LLVM свой сборщик мусора? Были предложения написать php2js, но это показалось мне более сложным и бесполезным делом.
LLVM это вообще не виртуальная машина, LLVM — это не аббревиатура.
Если верить вики, то это как раз таки аббревиатура: Low Level Virtual Machine (LLVM)
Прошу заметить, первую часть я не отрицал.
Там есть кое-какая поддержка для GC, но писать его надо самостоятельно. И естественно там нету свинга и вообще ничего, зато есть JIT компиляция в native code.
По крайней мере цели «увеличение производительности» и «писать не только под Web» это бы выполнило, но не было бы доступа к мощи библиотек Java. Так что неизвестно еще что лучше.
Если у автора была цель — интероперабельность с Java-библиотеками, Swing, Android, то при чем тут LLVM?
И все мертво. Такие проекты обычно возникают как попытки, но в силу того что один два разработчика не могут выпустить рантайм, который можно использовать в продакшене, толку от этого мало.

Есть шанс что к php6 перепишут рантайм с использованием JIT, оптимизируют сборщик мусора и еще много чего интересного, но… если нужна производительность, то проще взять либо HHVM+Hack либо вообще штуки типа golang…
То есть по своей сути Ваша разработка это… как же выразиться правильно… это возможность писать на Java'e (иметь доступ к набору привычных классов), используя синтаксис PHP? Или все же возможность программировать на PHP с привычными для PHP средствами, но крутиться это все будет на JVM? Второй случай больше похож на JRuby, но по примерам больше похоже на первый вариант…
Что-то среднее. Я написал, что не в силах реализовать рантайм библиотеки, хотя в самом начале хотел. В JPHP и правда, через рефлексию Java можно работать с библиотеками написанными на Java (кстати и на Scala, jvm языки возможно).
UFO just landed and posted this here
Это не религиозное убеждение, просто лень, будущем реализую, а break, continue поддерживают многоуровневый выход.
Понимаю)) Удачи. Смотрю на реализацию php методов, и мне чтото это напоминает) Спасибо за проект, будет время — разберу на кирпичики)
Честно говоря, сделать такое за 4 месяца в свободное от работы время — это прямо подвиг! Сколько примерно времени в день вы выделяли?
очень любопытно посмотреть на простенькие бенчмарки (что сильнее ускоряется, что нет) и потребление памяти.

p.s. промазал веткой.
Будет отдельная статья про бенчмарки. По потреблению памяти примерно также как в PHP. zval структура в zend движке примерно столько же занимает в памяти сколько и объекты Memory (через которые jphp сохраняет значения).
У меня огромный опыт в написании различных компиляторов, трансляторов, парсеров, писал несколько раз свою VM, прочитал много книжек о построении компиляторов. Начал я этим увлекаться 4 года назад. Этот проект весь мой опыт, который я накопил за такое время. Я прекрасно знал как его надо написать.

В 2011 году у меня была первая попытка написать движок php — http://www.freepascal.ru/forum/viewforum.php?f=4 (исходники есть в моем репозитарии). До этого писал скриптовые языки, писал препроцессоры для css.
О, я помню его анонс на винграде.
Все равно кажется невероятно. По заголовку показалось, что какая-нибудь соцсеть снова шаманит, ускоряется. «Я… в одиночку… за 4 месяца» раза 3 перечитал. Невероятно :)
Когда-то я уже писал, что у известных JVM языков всего 1-3 мейнтейнера, а не целая команда разработчиков. Вы можете поглядеть статистику коммитов у Groovy, JRuby или Scala.
если не секрет, Вы этим занимаетесь по работе или это хобби?
Жить ведь на что то надо, семью кормить а такие проекты требуют уйму времени. Всегда было интересно как некоторым удаётся совместить безумно интересное занятие и не умереть при этом с голоду. Поделитесь как Вам это удаётся.
На работе я занимаюсь разработкой backend серверов на Java для мобильных приложений, пишу различные REST api и т.п. А этот проект естественно хобби. Но разрабатывая такой перспективный проект, я работаю на свое светлое будущее, поэтому оно стоило того, чтобы месяц два вести очень активную разработку. Тем более за последние полгода у меня появилось больше свободного времени.

И детьми и семьей еще не успел обзавестись, молодой еще)
Простите, а в чем «перспективность» проекта? Производительность рантайма будет относительно слабенькой, так как не будет поддержки всех фич Zend engine, большая часть либ и фреймворков прост не заведутся, и никто собственно что-то серьезное под web делать с ним не будут. Использование java библиотек… тоже сомнительный плюс… Возможность писать расширения на PHP — для этого было бы логичнее воспользоваться подходами, используемыми в PyPy (ограниченное подмножество языка с добавлением статической типизации), собственно как это сделано в Hack и Зефире. Тогда можно будет получить худо бедно приличную производительность этих самых расширений. Возможность писать GUI приложения — тоже сомнительно.

Время покажет конечно, но с учетом того что вы занимаетесь проектом в свободное время и в одиночку, без наличия какого-либо сообщества, проекту такого плана просто не выжить, или же он будет намного слабее конкурентов.
А фреймворки и не нужны, я последую примеру node.js, когда все завертелось буквально с нуля. Сообщество появляется уже, как только я впервые опубликовал информацию о проекте. Со временем появятся и фреймворки.

Использование Java библиотек это не сомнительный плюс, это огромный плюс. Т.к. JVM инфраструктура развита очень сильно, огромное количество стабильно развивающихся библиотек, которые пишутся на Java, Scala, Groovy и других jvm языках. PHP такое и не снилось.
>Такой сервер довольно быстро отдает контент, я тестировал через утилиту ab и результаты впечатляют.

у меня вопрос: если к вам придёт 16к клиентов с gprs и будут мееедленно, по байту в минуту читать ответ, что станет с вашим сервером?
глядя на $service = ExecutorService::newFixedThreadPool(5); возникает стойкое ощущение, что на первых пяти клиентах всё и закончится.
Это просто пример, есть разные политики для пула потоков. Если нужен асинхронный сервер, то можно попробовать интегрировать vert,x.
Еще более простой вариант — неблокирующее IO. Это полностью решит проблему и 5 потоками.
>Еще более простой вариант — неблокирующее IO. Это полностью решит проблему и 5 потоками.

до того момента, пока вам не надо читать с диска.
При отдачи контента с диска читать не нужно, JPHP может кешировать загруженные классы и не обращаться за исходниками через файловую систему. Остальное на совести программиста. Эту проблему должен решать уже программист.
я к тому, что неблокирующего чтения с диска не бывает.
Процессор опрашивает контроллер диска в цикле для каждого байта?
причем тут контроллер диска? это может быть какой-нибудь iscsi/fcoe/aoe, ситуация не меняется.
то, что вы открыли файл с O_NONBLOCK ровным счётом ничего не решает и если данных нет в vfs cache, ваш процесс/тред «залипнет».

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

ну ок, 64/128/256k клиентов. вы же тредов не напасетесь.

>Если нужен асинхронный сервер, то можно попробовать интегрировать vert.x

вокруг этой штуки слишком много хайпа. ну и «A verticle instance is strictly single threaded.» доставляет. код внутри вертикля должен исполнятся очень быстро и никого не ждать(например, бд).
Если вам нужно так много клиентов, то используйте Erlang например.
почему не scala/java + netty?
Netty предоставляет только асинхронный IO.
а зачем какой-то еще? и не путаете ли вы асинхронный и неблокирующий i/o?

ваш труд достоен уважения и всяческих похвал, но целевая аудитория непонятна.
писать гуи на пхп — ок, допустим.

писать веб-сервера? — зачем? в cpu они никогда не упираются и основная проблема там — дисковый i/o.
а горячий кусок кода проще реализовать как c-extension или внешний процесс.
Не проще реализовать из-за того что с-extension нужно писать на сложном си или с++. Архитектура работы JPHP позволит реализовать htttp сервер и фреймворк по типу Phalcon на самом php, без всяких расширений.

>Не проще реализовать из-за того что с-extension нужно писать на сложном си или с++.

не надо переписывать всё. переписать надо лишь небольшой кусок. и задача особенно упрощается наличием трансляторов в C/C++

>Архитектура работы JPHP позволит реализовать htttp сервер и фреймворк по типу Phalcon на самом php, без всяких расширений.

а вы можете показать пример с отдачей файла, лежащего на диске? для тех же 16к коннектов?
Я еще не занимался этими вопросами и пока это лишь тестовые примеры. Все таки такого добиться на Zend PHP будет намного сложнее.
Все что умеет Java сможет и JPHP, поэтому я за такие технические детали не переживаю. Расширение по ссылке имеет версию 0.0.1dev.
Есть такой проект, как resin + php, можно чуть подробнее — отличия/достоинства? Ну так, в двух словах.
Еще хочется больше бенчей, не только совсем синтетических.
Как я писал в презентации — это транслятор в Java код. Поэтому для его работы требуется весь JDK и компилятор Java (javac). JPHP сам является компилятором и конечный результат это байткод JVM. Querqus делает так PHP -> Java -> javac -> байткод, а jphp: PHP -> байткод. Поэтому достаточно установленного JRE. Возможно лицензия GPL (querqus) не всем понравится из-за невозможности использовать проект в закрытых системах. К тому же байткод получается более оптимизированным, чем сгенерированный код Java.

Авторы этого проекта заявляют у себя на сайте, что их система работает с такой же скорость как PHP + кешер. Они ориентируются только на веб и на полную обратную совместимость и с библиотеками тоже.
Возможно ли использовать апи без use, т.е. \name\class?

Может и глупый вопрос, но у вас это больше похоже на import из java
Это стандарт языка php. В PHP группе были когда-то обсуждения, чтобы перевести все core функции и классы в отдельный namespace — php. IDE позволяет не заботится об этом. В любом современном проекте, фреймворке, библиотеке используются namespaces и вам все равно придется использовать их.
Я правильно понимаю что JPHP можно использовать в вебе (сайтах) и обращатся к JAVA функциями?
Тоже интересует этот вопрос, но я так понял, для разработки под web этот проект не годится, верно?
Проект разноплановый, будут библиотеки для более удобного создания http сервера, как например в node.js, соответственно и под веб можно будет писать.
А отладка кода возможна?
Будет возможно, вместе с JVM поставляется штатный отладчик, который легко можно будет интегрировать (я уже думал об этом). Поэтому это вопрос времени.
А какие выгоды привносит эта технология? Почему нельзя взять средство которое уже создано для «этого» и научится ему? Становится ли решение задачь, которые изначально стояли перед PHP, более простым/эффективным/добавить_свое?
UFO just landed and posted this here
Насколько я понимаю, функции не могут быть immutable, однако они могут быть чистыми.
* не изменяют внешнее окружение, это функции для работы со строками, с числами и то что я описывал в статье.
Поиск в гугле «PHP immutable function» ничего не дал. Интересно, откуда у вас этот термин? Думаю, название "константные" подошло бы больше… Хотя могу ошибаться, м.б. это уже устоявшийся термин…
Ну этот термин вроде пришел из функциональных языков. Функция, которая ни на что не влияет, самодостаточна, при одном наборе переданных ей значений возвращает всегда один и тот же результат.
А, точно, без «PHP» и в кавычках выдаёт почти исключительно доки по PostgreSQL. Если исключить PostgreSQL — искать «"immutable function" -postgresql», то из результатов с первой страницы особенно хорошо разъяснено, например, здесь.
"Чистая функция", как говорит нам Википедия, — это практически то же самое… Но, в общем, благодарю вас за знакомство с новым термином, оспаривать его применимость в данном контексте не намерен;-).
Как я понял, имеются в виду два подвида чистых — функции, возвращающие константу, и чистые функции с константными параметрами в местах вызова.
А есть мысли расширить синтаксис PHP и ввести, например, статическую типизацию? Может это дать существенный выигрыш в процессоре/памяти без сильного изменения движка? Или, как вариант, автоматический вывод типов, там где это возможно.
Это риск и большой труд, для расширенного синтаксиса необходимо писать поддержку под различные IDE. Тем более пока есть пространство для других оптимизаций в рамках текущего синтаксиса.
В общем-то да, статически типизированный язык для полного раскрытия своих возможностей требует IDE. Что фактически умножает в разы усилия по его созданию…
Работа отличная, я даже не представляю, как такое чудо можно сотворить за 4 месяца!
Но вот поддержка битовых операторов реализована не до конца:
error_reporting( E_ALL & ~E_NOTICE );

Вызывает parse error.
Есть подозрение, что расширения для PHP доступны в виде С-исходников, а также есть надежда, что должно быть нечто вроде компилятора С для JVM, которым эти исходники можно было бы (после небольшого настраиваемого автоматического преобразования) скомпилировать под него…

Накрайняк — можно пойти по нативному пути и сделать «обёртки», позволяющие скомилировать эти исходники как часть нативных библиотек для JVM…
Обертки для вызова кода из си библиотек есть для JVM, но это создает зависимость от платформы и рушит всю идеологию Java. В общем если найдутся добровольцы и сделают такое в виде расширения (типа обратная совместимость с zend), то я не против.
А что на счет модуля для совместимости на уровне стандартной библиотеки оригинального php? В частности, те же filesystem функции, о которых я писал на гитхабе вам.
Это не первостепенная задача, как я написал, сам я реализовывать расширения zend не буду, нет желания, времени и возможностей. Легче реализовать альтернативный более качественный рантайм, согласованный (причем это будет намного быстрее). В крайнем случае для этого рантайма можно написать аналог на самом zend php, чтобы переход был более плавным.
Мы в одном проекте используем Quercus, решили попробовать заменить на jPHP. Как-то грустно без документации. Не получилось загрузить из Java переменные в Environment и выполнить скрипт. Скрипт выполняется, а данные передать «в скрипт» не можем. Есть ли такая возможность вообще? Можно свои переменные из Java в PHP передать?
Да это возможно, например через глобальные переменные, документации пока нет, но когда появится сайт постепенно появится и документация. Заменять quercus бесмысленно в том случае если вы хотите обратной совместимости с php на уровне расширений.

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

А вообще есть такая вещь как ModuleEntity в jphp ядре, это грубо говоря подключенный php скрипт, у этого объекта есть метод include, есть вариант куда можно передать список переменных через параметр ArrayMemory — это массив пхп.
До ModuleEntity и Memory по==докопался, а вот то, что через Include можно передать данные — не сообразил. Вобщем ждем немного больше информации, каких-нибудь примеров. Из тестов набралось не достаточно информации.
В общем-то передавать информацию различными способами можно и через объект environment, или вызвать какую-нибудь функцию/метод.

Стало интересно на счет использования пхп в качестве шаблонизатора в java проектах, интересно, каков был мотив и причины?
Своя платформа для онлайн магазинов с поддержкой шаблонов от одного из PHP'ных движков
Но спасибо за проявленный интерес к проекту =)
Крутая идея! Не знаю как реализация в проекте но идея будет двигать остальных создать или по крайней мере рискнуть создать что то подобное, соберите сообщество или попросите сделать это кого то из друзей или коллег! Если будете продолжать сами вы быстро загнетесь, проект до нового года не доживет без поддержки и постоянных релизов в виде фич и обновлений от сторонних разработчиков!
Удачи в проекте, я буду следить за данным проектом, надеюсь прислушаетесь :)
Заодно присоединяйтесь к тестированию, отправке пулл-реквестов, написанию предложений! ;)
Можно ли использовать это для использования php кода из джава? Типа как груви
Можно, но пока проблема в том, что большая часть оригинальных PHP функций не реализована, ибо есть своя библиотека обернутая в ООП с более качественными реализациями. Потому дабы ваш код работал, надо будет его переписать именно под JPHP.
Sign up to leave a comment.

Articles