Pull to refresh

Comments 45

Довольно круто.
Жаль, отказались от реализации стандартной библиотеки, это было бы интересное направление развития.
Все равно же часть пришлось реализовать для Zend тестов, нет?
Я реализовал часть функций для работы со строками, с массивами и с файлами, но затем выделил это в отдельный модуль-расширение zend-ext. Проект открытый, если кто-нибудь решится сам реализовывать некоторые расширения zend для JPHP то я не против. Просто я не вижу смысла в конкуренции с facebook hhvm.

Для тестов эти функции практически не нужны.
PHP поистине магический язык, я точно не уверен, но в каком еще языке во время выполнения можно обращаться к переменной по названию из строки?
Да в куче интерпретируемых языков так можно. Навскидку — JS, Python, Perl, Bash.
Примеры в студию пожалуйста, я до сих пор не знаю как это делается, ну например в JS:
$var = 'asd';
$name = 'var';
echo $$name; // покажет asd, потому что: $$name == $var == 'asd'
В JS обращение по имени из строки возможно только к глобальным переменным. На счет остальных не знаю.
Неглобальные тоже доступны через eval():
var name1 = 345;
var myvar = 'name1'
alert( eval(myvar) ) ; //345
Не знал про такой хак, удивили)
Да, про эвалы я вообще не подумал, снимаю шляпу.
Зачем же сразу eval?
var a = 1; var varname = "a"; this[varname];
К сожалению, не всегда. В контексте функций this это window. Потому что переменная window['myfunc'] относится к «верхнему» слою windows, не к конкретному объекту.
function myfunc(){

var a = 1; var varname = "a"; 
alert(this[varname]);
}
myfunc();
//undefined
Да, eval — это, конечно же, то же самое, что и $$var…
А причём тут $$var? В цитате было написано «в каком еще языке во время выполнения можно обращаться к переменной по названию из строки»?
Притом что eval это совсем не то, хоть и предоставляет такую возможность.
eval делает ровно то, что написано в цитате.
А магия всякого рода __get(), __call() работает?
Да работает вся магия волшенбных методов из ООП.
Интересная вещь, основанная на Quercus, о котором я упоминал выше. Более подробно я не смотрел, но идея интегрировать JPHP с vert.x у меня была.
не планируете ли поддержку vert.x и расширений zend (curl и др.)? тогда стеком vert.x можно будет заменить достаточно популярные сейчас apache+mod_php и nginx+php-fpmd
Человек же написал, что сам скорее всего расширениями zend заниматься не будет — неблагодарное дело. Вообще, то что он сделал уже потрясающе.

Так то да, я сам не откажусь от поддержки расширений.
возможно я не совсем ясно выразился — это добавление врапперов для того чтобы расширения могли работать по модульной структуре, например таким образом реализованы модули в платформе vert.x
Про модули vert.x я не знал, пока все просто — расширения для jphp это обычные jar библиотеки + maven репозиторий, gradle, ivy или maven умеют управлять зависимостями. Что сделано в vert.x я пока не читал.
Если в итоге отказываетесь от рантайма Zend, то можно было реализовать и не PHP вовсе?
Примеров таких проектов (не пхп) я знаю много, отход в сторону своего языка это дорога в ад =) Я уже как-то говорил, что это очень сложно, но писать еще поддержку для IDE, более подробную документацию и объяснять зачем миру еще один язык программирования.
Кстати, встроенные функции можно и на PHP реализовать. Тогда весь «рантайм» будет работать и расширять его можно будет быстро и эффективно.
Хорошая идея, я еще думал что рантайм jphp можно реализовать и на zend php для более легкого перехода.
Начнёте реализовывать, дайте знать, я выберу себе какой-нибудь модуль на реализацию :)
Допустим, я хочу реализовать функцию Date на php. Что из PHP-функций мне доступно?
Я написал выше, что на данный момент есть своего в рантайме, что будет после пока не решено. Скорее всего для поддержки дат и времени будет отдельная библиотека.
есть JRE, соответственно эти классы можно использовать за основу
Я имел в виду писать на php.
Не трогая JRE, на чистом php написать свой functions.php, который на основе того, что есть, написать то, чего нет.
А потом в проектах просто include('functions.php'); Например, тем, кто java не знает совсем.
Кстати, а что насчет отхода от возможностей php и имплементации своих «расширений языка»? Например, опциональный тайпхинтнг для членов класса ([visibility] [typehint] $(name)), а так же, тайпхинтинг для примитивов (function f(int $arg)).

Так же, очень хотелось бы результатов бенчмарков для сравнения с оригинальных php, а не голословное «в 2-10 раза быстрее». :)
Пока есть нереализованные вещи из стандарта языка php, я даже не задумываюсь о таком. Тут еще необходимо реализовать очень сложную штуку — генераторы.
Пытался реализовать генераторы в своем языке под .NET, но на тот момент не получилось в существующей архитектуре совместить генераторы и замыкания. Пришлось отложить фичу до момента, когда перепишется значительная часть ядра.
Есть идеи как их надо реализовать, но это будет очень затратная на время задача, однако хорошо, что я уже придумал как это реализовать в существующем движке.
А файлы «zend/ext/serialize/001.php» доступны?
Да вот он: github.com/dim-s/jphp/blob/master/jphp-zend-ext/src/main/tests/resources/zend/ext/serialize/001.php. Я перенес тесты zend в папку модуля zend-ext.

Серилизация в jphp не умеет обрабатывать циклические ссылки и выдает предупреждение, когда встречает их.
Желаю Вашему проекту создания устойчивой комьюнити! Мне кажется, что у него есть очень хороший потенциал для попадания в мейнстрим. И вообще, это очень-очень круто, снимаю шляпу :)
Автор, Вы монстр! В хорошем смысле этого слова. Удачи Вам и Вашему проекту!

А вот как у Вас строки реализованы? С юникодом, как в Яве, али без, как в PHP?
С юникодом как в Java, строки хранятся почти как обычные java.lang.String объекты. Для однобайтовых строк есть специальный внутренний тип binary.
Автор, спасибо за статью, с интересом прочитал.
А не было желания/идеи добавить в вашу реализацию, чего-то своего, чего не хватает в PHP, например нативной мультипоточности? Либо сделать это проблемно?
Они же добавлены уже. Что вы понимаете под «нативной мультипоточностью»?

php\lang\Thread, php\lang\ThreadGroup — классы для работы с мультипоточностью. В языке из коробки должны идти средства для работы с потоками, и на данный момент они не ограничиваются 2 классами.


Это полноценные потоки. К тому же можно запускать код не просто в отдельном потоке, а например в одном пространстве.
php\lang\Environment изолированные окружения для выполнения кода, поддерживают опции: HOT_RELOAD для горячей замены кода и CONCURRENT для использования одного и того же окружения в нескольких потоках.
А какой синтаксический анализатор использовали? Или свой писали?
Я написал свой. На это не ушло много времени, максимум 1 неделя. Всего 3 стадии: лексер -> анализатор -> компилятор в байткод (с небольшим оптимизатором).
Sign up to leave a comment.

Articles