Comments 108
Занятно! А во время реализации возникала проблема с тем что сам по себе PHP — язык не строгой типизации, а Java — строгой или на уровне байт-кода никакой разницы нет?
Вы не могли бы отдельной заметкой рассказать процесс создания JPHP? Я думаю многим было бы интересно.
Вы не могли бы отдельной заметкой рассказать процесс создания JPHP? Я думаю многим было бы интересно.
+6
С типизацией проблем не было вообще никаких. Проблема в другой магии, например вызов динамичных методов статичным способом, система классов java не позволяет делать такое. Я хотел написать о процессе создания, но понял что все это не влезет в одну статью. Напишу потом отдельную статью.
+2
вызов динамичных методов статичным способом
invokedynamic
? Оно позволяет во время выполнения определять, какой код будет вызван, с произвольным механизмом разрешения целевого метода.0
Да, но он не поддерживается в Java 6, а она еще очень распространена.
+2
Когда создаёте столь специфичное решение, вы в праве требовать специфичного окружения и не париться.
+33
Не хочу обидеть, но наболело. В частности, именно из-за такой логики древнее г-но типа Java 6 до сих пор и используется. Шестой джаве уже шесть лет, седьмой — почти четыре года, только что восьмая вышла. Если цепляться за эти древности, то на свежие версии никогда перехода не будет. А это очень печально :(
Посмотрите на Ceylon — авторы языка явно требуют Java 7. А этот язык гораздо ближе к джаве, чем ваш. Полностью поддерживаю igordata.
Посмотрите на Ceylon — авторы языка явно требуют Java 7. А этот язык гораздо ближе к джаве, чем ваш. Полностью поддерживаю igordata.
+3
PHP 5.3 вышел в 2009 году, ему тоже 6 лет, однако многие его еще поддерживают. JRuby и Jython поддерживают Java 6. С моей стороны переход на Java 7 ничего особенного кроме invokedynamic не дает. Скажу честно, без него прекрасно можно обходиться, но это технические детали, если вкратце, то порой вызов метода рефлексией бывает быстрее, чем через invokedynamic, только в Java 8 они это поправили.
+3
Всеми известная и любимая Scala поддерживает еще JDK 1.6
+3
Кстати, интересно, как на ней на уровне JVM реализованы «функции как первоклассные объекты» — через синглетоны типа как анонимные классы в Java?
0
Да так и есть, если я не ошибаюсь. По сути анонимных классов в байткоде JVM не существует, они превращаются в именованные классы и название у них = «имя класса в котором находится анонимный класс» + "$" + «index + 1».
0
Вы выпускаете рантайм, которые если и будет использоваться (уж извините за пессимизм, но он уж очень специфичен, и в сравнении с HHVM пользоваться им будут не так часто), то поставить нужную версию JDK/Java не составит проблем. То есть вы вправе делать все даже уже и под 8-ую версию.
+3
У меня сейчас не получилось найти ссылку на запись выступления Алексея Шипилева, где он рассказывает __какие__ баги были пофиксены в jdk седьмой версии (куча багов с concurrency, например). При этом фиксы не были включены в шестую jdk.
Поэтому, юзайте jdk6 на свой страх и риск. :)
Поэтому, юзайте jdk6 на свой страх и риск. :)
0
Пожалуйста, выбросьте поддержку Java 6.
+2
JPHP компилирует PHP-код в сборку, совместимую с другими java-приложениями, или же выполняет код в рантайме? Есть ли возможность кросс-взаимодействия, например импортировать в php-скрипт некий внешний java-тип?
+2
Он компилирует в байткод JVM, который можно сохранить в файл и загрузить его заново. Однако, чтобы вызвать код php из java, например метод класса, нужно использовать апи движка, уж сильно большие различия в ооп, да и еще динамическая типизация не позволяет сделать это просто. Можно писать расширения на Java.
+4
Класс! Кстати, вы не смотрели на реализацию компилятора PHP под .NET? Устройство виртуальных машин довольно схожее, возможно удастся что-то почерпнуть. Правда, я давно не слежу за проектом — не знаю, насколько он совместим с последними возможностями языка.
0
Нет только в общих чертах. Они заявляют о поддержке php5.4+. В основном я смотрел реализацию quercus.caucho.com/, но это транслятор в java код, а не компилятор в jvm байткод.
Думаю .NET байткод еще более продвинутый.
Думаю .NET байткод еще более продвинутый.
+2
Такой странный вопрос: почему JVM, а не LLVM? Рассматривался ли LLVM вообще?
+1
Потому что я программирую на Java в основном, опыта работы с С++ у меня вообще нет. Я даже не знаю, есть ли в LLVM свой сборщик мусора? Были предложения написать php2js, но это показалось мне более сложным и бесполезным делом.
+4
LLVM это вообще не виртуальная машина, LLVM — это не аббревиатура.
-6
Если верить вики, то это как раз таки аббревиатура: Low Level Virtual Machine (LLVM)
+2
Все несколько сложнее. Рекомендую ознакомиться.
+1
Там есть кое-какая поддержка для GC, но писать его надо самостоятельно. И естественно там нету свинга и вообще ничего, зато есть JIT компиляция в native code.
По крайней мере цели «увеличение производительности» и «писать не только под Web» это бы выполнило, но не было бы доступа к мощи библиотек Java. Так что неизвестно еще что лучше.
По крайней мере цели «увеличение производительности» и «писать не только под Web» это бы выполнило, но не было бы доступа к мощи библиотек Java. Так что неизвестно еще что лучше.
+1
Если у автора была цель — интероперабельность с Java-библиотеками, Swing, Android, то при чем тут LLVM?
+5
такого вроде как много: github.com/preillyme/llvm или gitorious.org/php-llvm,
+1
И все мертво. Такие проекты обычно возникают как попытки, но в силу того что один два разработчика не могут выпустить рантайм, который можно использовать в продакшене, толку от этого мало.
Есть шанс что к php6 перепишут рантайм с использованием JIT, оптимизируют сборщик мусора и еще много чего интересного, но… если нужна производительность, то проще взять либо HHVM+Hack либо вообще штуки типа golang…
Есть шанс что к php6 перепишут рантайм с использованием JIT, оптимизируют сборщик мусора и еще много чего интересного, но… если нужна производительность, то проще взять либо HHVM+Hack либо вообще штуки типа golang…
+2
Здорово. Еще один язык для Vert.X
+1
То есть по своей сути Ваша разработка это… как же выразиться правильно… это возможность писать на Java'e (иметь доступ к набору привычных классов), используя синтаксис PHP? Или все же возможность программировать на PHP с привычными для PHP средствами, но крутиться это все будет на JVM? Второй случай больше похож на JRuby, но по примерам больше похоже на первый вариант…
-1
UFO just landed and posted this here
А в чем проблема с goto?
0
Честно говоря, сделать такое за 4 месяца в свободное от работы время — это прямо подвиг! Сколько примерно времени в день вы выделяли?
+16
очень любопытно посмотреть на простенькие бенчмарки (что сильнее ускоряется, что нет) и потребление памяти.
p.s. промазал веткой.
p.s. промазал веткой.
+2
У меня огромный опыт в написании различных компиляторов, трансляторов, парсеров, писал несколько раз свою VM, прочитал много книжек о построении компиляторов. Начал я этим увлекаться 4 года назад. Этот проект весь мой опыт, который я накопил за такое время. Я прекрасно знал как его надо написать.
В 2011 году у меня была первая попытка написать движок php — http://www.freepascal.ru/forum/viewforum.php?f=4 (исходники есть в моем репозитарии). До этого писал скриптовые языки, писал препроцессоры для css.
В 2011 году у меня была первая попытка написать движок php — http://www.freepascal.ru/forum/viewforum.php?f=4 (исходники есть в моем репозитарии). До этого писал скриптовые языки, писал препроцессоры для css.
+5
Не правильную ссылку дал: www.freepascal.ru/forum/viewforum.php?f=42
+3
Все равно кажется невероятно. По заголовку показалось, что какая-нибудь соцсеть снова шаманит, ускоряется. «Я… в одиночку… за 4 месяца» раза 3 перечитал. Невероятно :)
-1
если не секрет, Вы этим занимаетесь по работе или это хобби?
Жить ведь на что то надо, семью кормить а такие проекты требуют уйму времени. Всегда было интересно как некоторым удаётся совместить безумно интересное занятие и не умереть при этом с голоду. Поделитесь как Вам это удаётся.
Жить ведь на что то надо, семью кормить а такие проекты требуют уйму времени. Всегда было интересно как некоторым удаётся совместить безумно интересное занятие и не умереть при этом с голоду. Поделитесь как Вам это удаётся.
+3
На работе я занимаюсь разработкой backend серверов на Java для мобильных приложений, пишу различные REST api и т.п. А этот проект естественно хобби. Но разрабатывая такой перспективный проект, я работаю на свое светлое будущее, поэтому оно стоило того, чтобы месяц два вести очень активную разработку. Тем более за последние полгода у меня появилось больше свободного времени.
И детьми и семьей еще не успел обзавестись, молодой еще)
И детьми и семьей еще не успел обзавестись, молодой еще)
+3
Простите, а в чем «перспективность» проекта? Производительность рантайма будет относительно слабенькой, так как не будет поддержки всех фич Zend engine, большая часть либ и фреймворков прост не заведутся, и никто собственно что-то серьезное под web делать с ним не будут. Использование java библиотек… тоже сомнительный плюс… Возможность писать расширения на PHP — для этого было бы логичнее воспользоваться подходами, используемыми в PyPy (ограниченное подмножество языка с добавлением статической типизации), собственно как это сделано в Hack и Зефире. Тогда можно будет получить худо бедно приличную производительность этих самых расширений. Возможность писать GUI приложения — тоже сомнительно.
Время покажет конечно, но с учетом того что вы занимаетесь проектом в свободное время и в одиночку, без наличия какого-либо сообщества, проекту такого плана просто не выжить, или же он будет намного слабее конкурентов.
Время покажет конечно, но с учетом того что вы занимаетесь проектом в свободное время и в одиночку, без наличия какого-либо сообщества, проекту такого плана просто не выжить, или же он будет намного слабее конкурентов.
0
А фреймворки и не нужны, я последую примеру node.js, когда все завертелось буквально с нуля. Сообщество появляется уже, как только я впервые опубликовал информацию о проекте. Со временем появятся и фреймворки.
Использование Java библиотек это не сомнительный плюс, это огромный плюс. Т.к. JVM инфраструктура развита очень сильно, огромное количество стабильно развивающихся библиотек, которые пишутся на Java, Scala, Groovy и других jvm языках. PHP такое и не снилось.
Использование Java библиотек это не сомнительный плюс, это огромный плюс. Т.к. JVM инфраструктура развита очень сильно, огромное количество стабильно развивающихся библиотек, которые пишутся на Java, Scala, Groovy и других jvm языках. PHP такое и не снилось.
+7
>Такой сервер довольно быстро отдает контент, я тестировал через утилиту ab и результаты впечатляют.
у меня вопрос: если к вам придёт 16к клиентов с gprs и будут мееедленно, по байту в минуту читать ответ, что станет с вашим сервером?
глядя на $service = ExecutorService::newFixedThreadPool(5); возникает стойкое ощущение, что на первых пяти клиентах всё и закончится.
у меня вопрос: если к вам придёт 16к клиентов с gprs и будут мееедленно, по байту в минуту читать ответ, что станет с вашим сервером?
глядя на $service = ExecutorService::newFixedThreadPool(5); возникает стойкое ощущение, что на первых пяти клиентах всё и закончится.
+2
Еще более простой вариант — неблокирующее IO. Это полностью решит проблему и 5 потоками.
+2
>Еще более простой вариант — неблокирующее IO. Это полностью решит проблему и 5 потоками.
до того момента, пока вам не надо читать с диска.
до того момента, пока вам не надо читать с диска.
-1
При отдачи контента с диска читать не нужно, JPHP может кешировать загруженные классы и не обращаться за исходниками через файловую систему. Остальное на совести программиста. Эту проблему должен решать уже программист.
+1
я к тому, что неблокирующего чтения с диска не бывает.
-4
Процессор опрашивает контроллер диска в цикле для каждого байта?
+1
граждане минусующие, может поясните свою позицию?
0
>Это просто пример, есть разные политики для пула потоков.
ну ок, 64/128/256k клиентов. вы же тредов не напасетесь.
>Если нужен асинхронный сервер, то можно попробовать интегрировать vert.x
вокруг этой штуки слишком много хайпа. ну и «A verticle instance is strictly single threaded.» доставляет. код внутри вертикля должен исполнятся очень быстро и никого не ждать(например, бд).
ну ок, 64/128/256k клиентов. вы же тредов не напасетесь.
>Если нужен асинхронный сервер, то можно попробовать интегрировать vert.x
вокруг этой штуки слишком много хайпа. ну и «A verticle instance is strictly single threaded.» доставляет. код внутри вертикля должен исполнятся очень быстро и никого не ждать(например, бд).
0
Если вам нужно так много клиентов, то используйте Erlang например.
+3
почему не scala/java + netty?
0
Netty предоставляет только асинхронный IO.
+2
а зачем какой-то еще? и не путаете ли вы асинхронный и неблокирующий i/o?
ваш труд достоен уважения и всяческих похвал, но целевая аудитория непонятна.
писать гуи на пхп — ок, допустим.
писать веб-сервера? — зачем? в cpu они никогда не упираются и основная проблема там — дисковый i/o.
а горячий кусок кода проще реализовать как c-extension или внешний процесс.
ваш труд достоен уважения и всяческих похвал, но целевая аудитория непонятна.
писать гуи на пхп — ок, допустим.
писать веб-сервера? — зачем? в cpu они никогда не упираются и основная проблема там — дисковый i/o.
а горячий кусок кода проще реализовать как c-extension или внешний процесс.
0
Не проще реализовать из-за того что с-extension нужно писать на сложном си или с++. Архитектура работы JPHP позволит реализовать htttp сервер и фреймворк по типу Phalcon на самом php, без всяких расширений.
+3
>Не проще реализовать из-за того что с-extension нужно писать на сложном си или с++.
не надо переписывать всё. переписать надо лишь небольшой кусок. и задача особенно упрощается наличием трансляторов в C/C++
>Архитектура работы JPHP позволит реализовать htttp сервер и фреймворк по типу Phalcon на самом php, без всяких расширений.
а вы можете показать пример с отдачей файла, лежащего на диске? для тех же 16к коннектов?
не надо переписывать всё. переписать надо лишь небольшой кусок. и задача особенно упрощается наличием трансляторов в C/C++
>Архитектура работы JPHP позволит реализовать htttp сервер и фреймворк по типу Phalcon на самом php, без всяких расширений.
а вы можете показать пример с отдачей файла, лежащего на диске? для тех же 16к коннектов?
-1
Я еще не занимался этими вопросами и пока это лишь тестовые примеры. Все таки такого добиться на Zend PHP будет намного сложнее.
+2
phpdaemon + www.php.net/manual/en/function.eio-sendfile.php?
0
Есть такой проект, как resin + php, можно чуть подробнее — отличия/достоинства? Ну так, в двух словах.
Еще хочется больше бенчей, не только совсем синтетических.
Еще хочется больше бенчей, не только совсем синтетических.
0
Как я писал в презентации — это транслятор в Java код. Поэтому для его работы требуется весь JDK и компилятор Java (javac). JPHP сам является компилятором и конечный результат это байткод JVM. Querqus делает так PHP -> Java -> javac -> байткод, а jphp: PHP -> байткод. Поэтому достаточно установленного JRE. Возможно лицензия GPL (querqus) не всем понравится из-за невозможности использовать проект в закрытых системах. К тому же байткод получается более оптимизированным, чем сгенерированный код Java.
Авторы этого проекта заявляют у себя на сайте, что их система работает с такой же скорость как PHP + кешер. Они ориентируются только на веб и на полную обратную совместимость и с библиотеками тоже.
Авторы этого проекта заявляют у себя на сайте, что их система работает с такой же скорость как PHP + кешер. Они ориентируются только на веб и на полную обратную совместимость и с библиотеками тоже.
+6
Возможно ли использовать апи без use, т.е. \name\class?
Может и глупый вопрос, но у вас это больше похоже на import из java
Может и глупый вопрос, но у вас это больше похоже на import из java
0
Я правильно понимаю что JPHP можно использовать в вебе (сайтах) и обращатся к JAVA функциями?
0
Тоже интересует этот вопрос, но я так понял, для разработки под web этот проект не годится, верно?
0
Проект разноплановый, будут библиотеки для более удобного создания http сервера, как например в node.js, соответственно и под веб можно будет писать.
+2
А отладка кода возможна?
0
Будет возможно, вместе с JVM поставляется штатный отладчик, который легко можно будет интегрировать (я уже думал об этом). Поэтому это вопрос времени.
+1
UFO just landed and posted this here
Насколько я понимаю, функции не могут быть immutable, однако они могут быть чистыми.
0
* не изменяют внешнее окружение, это функции для работы со строками, с числами и то что я описывал в статье.
+2
Поиск в гугле «PHP immutable function» ничего не дал. Интересно, откуда у вас этот термин? Думаю, название "константные" подошло бы больше… Хотя могу ошибаться, м.б. это уже устоявшийся термин…
0
Ну этот термин вроде пришел из функциональных языков. Функция, которая ни на что не влияет, самодостаточна, при одном наборе переданных ей значений возвращает всегда один и тот же результат.
0
"Чистая функция", как говорит нам Википедия, — это практически то же самое… Но, в общем, благодарю вас за знакомство с новым термином, оспаривать его применимость в данном контексте не намерен;-).
0
Как я понял, имеются в виду два подвида чистых — функции, возвращающие константу, и чистые функции с константными параметрами в местах вызова.
0
А есть мысли расширить синтаксис PHP и ввести, например, статическую типизацию? Может это дать существенный выигрыш в процессоре/памяти без сильного изменения движка? Или, как вариант, автоматический вывод типов, там где это возможно.
0
Это риск и большой труд, для расширенного синтаксиса необходимо писать поддержку под различные IDE. Тем более пока есть пространство для других оптимизаций в рамках текущего синтаксиса.
+2
Работа отличная, я даже не представляю, как такое чудо можно сотворить за 4 месяца!
Но вот поддержка битовых операторов реализована не до конца:
Вызывает parse error.
Но вот поддержка битовых операторов реализована не до конца:
error_reporting( E_ALL & ~E_NOTICE );
Вызывает parse error.
0
Пожалуйста пишите о таких ошибках в трекер (это ошибка анализатора). github.com/dim-s/jphp/issues
+2
Есть подозрение, что расширения для PHP доступны в виде С-исходников, а также есть надежда, что должно быть нечто вроде компилятора С для JVM, которым эти исходники можно было бы (после небольшого настраиваемого автоматического преобразования) скомпилировать под него…
Накрайняк — можно пойти по нативному пути и сделать «обёртки», позволяющие скомилировать эти исходники как часть нативных библиотек для JVM…
Накрайняк — можно пойти по нативному пути и сделать «обёртки», позволяющие скомилировать эти исходники как часть нативных библиотек для JVM…
0
Обертки для вызова кода из си библиотек есть для JVM, но это создает зависимость от платформы и рушит всю идеологию Java. В общем если найдутся добровольцы и сделают такое в виде расширения (типа обратная совместимость с zend), то я не против.
0
А что на счет модуля для совместимости на уровне стандартной библиотеки оригинального php? В частности, те же filesystem функции, о которых я писал на гитхабе вам.
0
Это не первостепенная задача, как я написал, сам я реализовывать расширения zend не буду, нет желания, времени и возможностей. Легче реализовать альтернативный более качественный рантайм, согласованный (причем это будет намного быстрее). В крайнем случае для этого рантайма можно написать аналог на самом zend php, чтобы переход был более плавным.
0
Мы в одном проекте используем Quercus, решили попробовать заменить на jPHP. Как-то грустно без документации. Не получилось загрузить из Java переменные в Environment и выполнить скрипт. Скрипт выполняется, а данные передать «в скрипт» не можем. Есть ли такая возможность вообще? Можно свои переменные из Java в PHP передать?
0
Да это возможно, например через глобальные переменные, документации пока нет, но когда появится сайт постепенно появится и документация. Заменять quercus бесмысленно в том случае если вы хотите обратной совместимости с php на уровне расширений.
0
Расширения не используются, на PHP только шаблоны для страниц написаны, поэтому jPHP заинтересовал. Может попозже еще один заход сделаем и еще раз попробуем перейти.
0
Да пожалуйста не нужно его использовать на данном этапе в серьезных проектах, т.к. все в режиме активной разработки, что-то может быть не стабильным.
А вообще есть такая вещь как ModuleEntity в jphp ядре, это грубо говоря подключенный php скрипт, у этого объекта есть метод include, есть вариант куда можно передать список переменных через параметр ArrayMemory — это массив пхп.
А вообще есть такая вещь как ModuleEntity в jphp ядре, это грубо говоря подключенный php скрипт, у этого объекта есть метод include, есть вариант куда можно передать список переменных через параметр ArrayMemory — это массив пхп.
0
До ModuleEntity и Memory по==докопался, а вот то, что через Include можно передать данные — не сообразил. Вобщем ждем немного больше информации, каких-нибудь примеров. Из тестов набралось не достаточно информации.
0
В общем-то передавать информацию различными способами можно и через объект environment, или вызвать какую-нибудь функцию/метод.
Стало интересно на счет использования пхп в качестве шаблонизатора в java проектах, интересно, каков был мотив и причины?
Стало интересно на счет использования пхп в качестве шаблонизатора в java проектах, интересно, каков был мотив и причины?
0
Но спасибо за проявленный интерес к проекту =)
+1
Крутая идея! Не знаю как реализация в проекте но идея будет двигать остальных создать или по крайней мере рискнуть создать что то подобное, соберите сообщество или попросите сделать это кого то из друзей или коллег! Если будете продолжать сами вы быстро загнетесь, проект до нового года не доживет без поддержки и постоянных релизов в виде фич и обновлений от сторонних разработчиков!
Удачи в проекте, я буду следить за данным проектом, надеюсь прислушаетесь :)
Удачи в проекте, я буду следить за данным проектом, надеюсь прислушаетесь :)
0
Можно ли использовать это для использования php кода из джава? Типа как груви
0
Sign up to leave a comment.
JPHP — Новый движок php для Java VM + JIT