Опубликован первый тестовый выпуск реализации языка программирования PXP, расширяющего PHP поддержкой новых синтаксических конструкций и расширенных возможностей runtime-библиотеки. Написанный на PXP код транслируется в обычные PHP-скрипты, выполняемые при помощи штатного интерпретатора PHP. Так как PXP лишь дополняет PHP, он совместим со всеми существующим PHP-кодом. Из особенностей PXP отмечается расширения системы типов PHP для лучшего представления данных и применения статического анализа, а также поставка расширенной библиотеки классов для упрощения написания безопасного кода...Подробнее: https://www.opennet.dev/opennews/art.shtml?num=59142
PHP никогда не умрет!)
Будет гнить под грудой бесконечно добавляемого сахара.
Пока что пыхохейтеры сгнивают раньше, чем их нелюбимый пых
> и перегрузка оператороввот с этого начинается всё плюсоподобное зло
Зло - это писать гoвнeцo вида `multiply_complex(add_complex(c1, c2), c3)` вместо `(c1 + c2) * c3`, и только перегрузкой операторов оно и решается.
А другие примеры есть? Если целью является поддержка математических библиотек, то можно разрешить перегрузку путём написания плагинов к компилятору. Благо их будет раз два и обчёлся. А давать доступ к перегрузке произвольному стороннему коду - страшное зло.
И получить lock на конкретный компилятор.
Дак там всего несколько кейсов придумали, на скидку: with overflow (zig), и более типичные matrix и vector (на манер glsl)
> А другие примеры есть? Если целью является поддержка математических библиотек, то можно разрешить перегрузку путём написания плагинов к компиляторуКаких ещё нахрен плагинов, к какому нахрен компилятору? Это обязано быть в стандарте языка.
> Благо их будет раз два и обчёлся. А давать доступ к перегрузке произвольному стороннему коду - страшное зло.
Нет, это базовая и абсолютно обязательная вещь, с которой начинается любой ЯВУ.
а оно уже есть. GMP как раз так и умеет
Почему тогда в C++ нельзя просто делать [1] + [2], а надо воеичий push_back писать? Ну правиславно.И на процессоре как это выглядит? Вот +-/* на процессоре есть, а твоего поделия - нет.
А потому что непонятно. Что ты имел ввиду? Конкатенацию? Поэлементное сложение? Сумму всех элементов?Перегрузка применима и необходима там, где действие оператора очевидно и понятно. Иначе начинаются всякие приколы из жабаскрипта и петухона.
Явное всегда лучше не явного
Именно поэтому в питоне есть перегрузка операторов
Макаки вроде тебя только о комплексных числах и вспоминают при "перегрузке операторов"! Что говорит само за себя - перегрузка попросту не нужна.
Ну реально. Вот видишь ты a + b и поди скажи что это такое, то ли строки конкатенируем, то от ин-ты складываем, то ли делаем rm -rf , потому что операторы можно перегружать.
В перле не началось.
я бы сказал не поперло.
>> и перегрузка операторов
> вот с этого начинается всё плюсоподобное злоВроде удобно для себя. Всеобщее понимание этих операторов достигнуть трудно.
уже есть тайпскрипт/яваскрипт, в котором нет бредового апи в стиле пыха, в котором json_parse("null") и json_parse("ну че как дела лол") оба возвращают null, а за ошибкой парсера надо лезть в какое-то стороннее место в стиле сишного errno. Не то, чтобы я критиковал си, но от высокоуровневого-то языка ожидаешь большего.
function json_parse(string $json,
?bool $associative = null,
int $depth = 512,
int $flags = 0) {
return json_decode($json, $associative, $depth, $flags | JSON_THROW_ON_ERROR);
}
Начиная с 8 версии исключение стало по умолчанию при ошибке парсинга
это в каком году случилось? вернее так: на сколько десятилетий (!) они отстали от парсеров стд-библиотек других языков?
Не примерно 300 миллионов лет.
Световых лет
Интересна история неуспеха, почему у них не получилось написать парсер на rust-е?
Давай начнём с того что ты скажешь какие есть ещё версии кроме одной очевидной причины.
Потому что PHP уже умеет парсить сам себя, а на rust это всё надо писать и поддерживать.
Не умеет, по ссылке какой-то костыль с гитхаба, написанный на пыхе.
Все эти "костыли" предоставляют более удобные API к результату встроенной функции https://www.php.net/manual/en/function.token-get-all.php
И даже даже такое естьhttps://www.php.net/manual/en/phptoken.tokenize.php
(PHP лет 5 не трогал, не в курсе, что там в 8)
в смысле не умеет? лол https://github.com/nikic/PHP-Parser
А что, самая очевидная причина тебе почему-то не подходит? (что раст - полное _г_вно)
Слава mojo покоя не даёт?
Mojo пока что топчик. Ничего лучше программистская языкологогия пока что не смогла придумать.
Ну когда введут операторы складывания эмодзи (например человечек + конь = кентавр) ... модным молодёжным это зайдёт.
ЧатЖПТ кстати умеет складывать эмодзи если что. Но его надо правильно попросить.
ну позязя?
> первый прототипы пытались разрабатывать на Rust, но потом отказались от этой идеи... и написали на уже знакомом им php))
Бедняги, не осилили строго типизированный язык.
Тут злые языки поговаривают, что на расте только фронтендщики, ака js-ники или пыхеры пишут.
А тут оно вот как оказалось
парсер написать в принципе непростая задача
а на ЯП с уродливостью синтаксиса уровня раста - и вовсе попахивает наказанием за грехи при жизниПросто посоны вовремя вспомнили что не грешили и ели кашу. И вообще, ещё живы.
В общем, тема с парсером на расте откладывается. Пока что.
Это в треде про пыху пишут что раст уродливый, серьезно?
Что вообще может быть отвратительнее синтаксиса пыхи?
Перл?
Может вы его с перл перепутали?
Rust.
Питон с хрустом.
Синтаксис пыхи, за некоторыми вычетами, сильно си-подобен в целом.
define('LARAVEL_START', microtime(true));Хотели писать на расте, в итоге переписали на ларавель с симфони, как обычно.
Я конечно слышал о вэб-фреймворке на ассемблере через CGI, но блин... Зачем для вэбни раст?
Там X или Х по центру?
PXP = P² . Пых квадрат.
Куда дальше расширять пыху??? Она итак сложнее джавы стала.
Я бы хотел ОС на компилируемом php. И скрипты там на php.
И чем же тебе таким KPHP не угодил, от Пашкета?
> И чем же тебе таким KPHP не угодил, от Пашкета?А в принципе да. Но там скорее всего не будет некоторых возможностей для создания ОС и ассемблерных вставок, например. :) Может рантайм не к месту.
Но kphp может быть лучшим вариантом для создания ОС на диалекте PHP.
Оно сильно захочет обычную ОС?
> Написанный на PXP код транслируется в обычные PHP-скрипты, выполняемые при помощи штатного интерпретатора PHP.Тогда вообще непонятно зачем было изобретать велосипед, просто сделали бы транслятор из JS или Python в PHP.
Я написал транспилер с Питона, но похоже всем все равно. Или ее никто не видит потому что это форк.
Запилите новость, увидите, что всё равно. 500 экспертов будут писать три дня и три ночи, как им это всё безразлично.
Это интересно. Но если не опубликуешь свой проект хоть где-нибудь, то о нем никто и не узнает, логично же. Сейчас реальность такова, что нужно приложить хотя бы какие-то усилия по промоушену своего проекта. Напиши на хабре или для начала обсуди здесь на форуме.
Зачем это ?)Я слышал, что php-шники массово на Go переходят, когда не хватает возможностей
Так на го от безнадеги переходят, иначе бы переходили на Карбон и Мойо
Я не перехожу, и мои коллеги не переходят и подобный бред слышу впервые!
Ну значит вы не во что (пока) не упёрлись, вестимо.Читаем внимательно:
> когда не хватает возможностей
Я же не говорю что PHP плохой %)
У меня недавно возникла проблема в том, что php многопоточность возможна только через вызов exec('... &'), после которой процесс живёт своей жизнью и не то что его судьба, его pid мне не известен!
Проблема возникла в отслеживании запущенных процессов и пробивания их при необходимости.
Решил передачей в exec уникального или определённого аргумента, по которому, в савокупности со всей командной строкой вызываю killall через exec() при необходимости (для снятия блокировки, которая долго весит).
А если нужно чтобы процесс, с такими же аргумертами не дублировался, можно в начале скрипта, который будет вызываться через exec('... &') такое прописать, и он не запустит новый процесс если старый выполняется.#!/usr/bin/php
<?php
if(empty($_SERVER['argv'][3]))
{
echo 'No arg1, arg2 and arg3 parameters passed!', "\n";
exit(1);
}
elseif(exec('pgrep -cf '.escapeshellarg(implode(' ', $_SERVER['argv']))) > 1)
exit(0);Проблема хоть и кастыльно, через внешние вызовы, но решена.
Как с эти в пайтоне дела обстоят?
И как это в го решается и не возникнет ли там других проблем?
Го с nginx вообще можно использовать?Если бы меня припёрло, я бы первым делом попробовал бы написать Си-расширение, но ни как не что-то на го.
> Как с эти в пайтоне дела обстоят?Хоть я Golangdev, но отправной точкой может быть https://docs.python.org/3/library/threading.html
> И как это в го решается
С помощью горутин(если упростить донельзя, то можно считать за поток).
> вызываю killall через exec() при необходимости
для "убийства" горутины в Go используют контекст и cancel https://www.sohamkamani.com/golang/context-cancellation-and-.../ (привет, культура кэнселинга %) )
> Го с nginx вообще можно использовать?
можно, но в отличие от PHP на Go в самом рантайме есть полноценный HTTP-сервак, так что нгинкс, строго говоря, не особо нужен
> не возникнет ли там других проблем?
Конечно же возникнут. Другой вопрос, насколько в перспективе пользы принесёт переезд на Go по ставнению с остальными решениями (костыли, Си-расширения, и проч). Судя по популярности Go, можно считать что он окупается.
В linux есть flock для защиты от повторного запуска комманды...> php многопоточность возможна только через вызов exec('... &')
Я как мигрировавший с пыхи голанг раб скажу что в пыхе есть для многопоточки файберы...
Так же у вас упадёт сервер если вы запустити 100500 комманд через `exec`, тогда как гошечка отработает их и даже не заметит.
Файберы - это таки не нормальная многопоточка с разнесением по тредам, а просто возможность прыгать между корутинами в пределах одного процесса/треда, самая-самая базовая. Впрочем, обвязка над таковой делается легко и ненавязчиво - и появляется достаточно удобная асинхронность. Но это таки не многопоточность. Есть какой-то навесной костыль для трединга, даже местами работает, но в продакшн такое страшно.
> В linux есть flock для защиты от повторного запуска комманды...И толку от этого?
Мне нужно ограничить не повторный запуск всего скрипта, а ограничить запуск скрипта с точно такими же аргументами, и никак не ограничивать запуск этого скрипта, но с другими аргументами, при условии что они уже НЕ запущены.
pgrep -cf для этого подходит идеально!>> php многопоточность возможна только через вызов exec('... &')
> Я как мигрировавший с пыхи голанг раб скажу что в пыхе есть
> для многопоточки файберы...Файберы появились недавно, в php 8.1 и на момент появления было не понятно как ими пользоваться.
https://www.php.net/manual/ru/language.fibers.php
https://habr.com/ru/companies/vk/articles/551240/
Судя по этой статье Файберы - это лютые костыли, которые даже не могут выполнятся одновременно, но при этом хорошо управляемы.
Мне метод с exec('... &>>/path/to/log/or/dev/null &'); гораздо больше нравится, тут управляемость костыльная, но я получаю реальный многопоток!> Так же у вас упадёт сервер если вы запустити 100500 комманд через
> `exec`, тогда как гошечка отработает их и даже не заметит.Во первых cli-скрипты и не предназначены чтобы их 100500 штук запускали, для этого есть php-fpm и он должен обрабатывать основную нагрузку, а cli-скрипты выполнять какие-то служебные действия. Если у вас не так, то у вас (были) проблема в архитектуре приложения.
Если всё-таки зачем-то и нужно запускать 100500 cli-скриптов, то нужно их самостоятельно ставить в очередь и обрабатывать порциями, в зависимости от ресурсов сервака.
> вызываю killall через exec()Поправляюсь, killall НЕ умеет работать с полным именем процесса (командой запуска), так что нужно использовать связку 'pgrep -f ...' + 'kill -9 ...'.
unset($pids, $exit);
exec('pgrep -f '.escapeshellarg('...'), $pids, $exit);
if($exit == 0 && count($pids))
{
foreach($pids as $pid)
{
if(is_int($pid))
{
unset($out, $exit);
exec('kill -9 '.$pid, $out, $exit);
if($exit == 0)
error_log(date_now().' - Процесс '.$pid.' завершён.'."\n", 3, LOG);
}
}
}
> так что нужно использовать связку 'pgrep -f ...' + 'kill -9 ...'Вроде там где есть pgrep - есть и pkill, так что связка обычно не нужна.
Благодарю, да в этом примере 'pkill -9 -f ...' достаточно, не знал про него.
В реальном примере упростил, используя связку 'pgrep -cf ...' + 'pkill -9 -f ...', так как мне нужно знать есть ли вообще эти процессы или нет.
> так как мне нужно знать есть ли вообще эти процессы или нет.Если нужно знать - _были_ или нет, то можно проверять код возврата pkill. А для более сложной логики - да, нужна ваша связка.
> У меня недавно возникла проблема в том, что php многопоточность возможна только через вызов exec('... &'),pcntl_fork чем не устроил?
> после которой процесс живёт своей жизнью и не то что его судьба, его pid мне не известен!
php -r '$res=proc_open("php -r \"sleep(5);\" >/dev/null 2>&1 &", array(["pipe","r"], ["pipe","w"], ["pipe","w"]), $p); echo implode("\n",proc_get_status($res)), "\n";'
Т.е. даже вот так:
php -r '$res=proc_open("php -r \"sleep(15);\"", array(["pipe","r"], ["pipe","w"], ["pipe","w"]), $p); echo implode("\n",proc_get_status($res)), "\n";'А то рефлекторно лишнего написал.
>> У меня недавно возникла проблема в том, что php многопоточность возможна только через вызов exec('... &'),
> pcntl_fork чем не устроил?https://www.php.net/manual/ru/function.pcntl-fork.php
Я не понял как это использовать и что мне это даёт.
Мне нужно чтобы скрипт выполняя какие-то синхронные действия, запустил несколько, в зависимости от условий, асинхронных процессов, затем продолжил свою синхронную работу и по окончании или завершился сразу, не завершая при этом асинхронные процессы или дождался завершения последнего асинхронного процесса и завершился.
Как это сделать с pcntl_fork() я не понял.> Т.е. даже вот так:
> php -r '$res=proc_open("php -r \"sleep(15);\"", array(["pipe","r"], ["pipe","w"], ["pipe","w"]), $p); echo implode("\n",proc_get_status($res)), "\n";'https://www.php.net/manual/ru/function.proc-open.php
С proc_open() не разобрался показалось слишком сложной и не понятно что такое pipe-ы и как с ними работать, если я предполагаю что процесс сам будет побочные действия выполнять и мне в него ничего передавать кроме аргументов вызова не нужно, а получить я от него хочу только pid или код возврата, когда он и подобные ему процессы завершаются. Но как это реализовать не совсем понял.
С proc_get_status($res) мне в конце скрипта в бесконечном цикле с секундной задержкой каждый запущенный процесс опрашивать что ли нужно перед выходом, чтобы получить код возврата?
Иначе $res я потеряю же после выхода?
> https://www.php.net/manual/ru/function.pcntl-fork.php
> Я не понял как это использовать и что мне это даёт.У вас была жалоба на отсутствие многопоточности в пхп, ну так это оно и есть. А нужно оно вам или нет - мне-то откуда знать? Вроде ещё треды есть, но там совсем как-то сложно, имхо.
> и по окончании или завершился сразу, не завершая при этом асинхронные процессы
С таким описанием вам нужен просто exec. Только зачем вам тогда pgrep, kill и всё остальное?...
> С proc_open() не разобрался показалось слишком сложной и не понятно что такое pipe-ы
Пайпы - это потоки STDIN, STDOUT и STDERR для запущенного процесса.
> и как с ними работать, если я предполагаю что процесс сам будет побочные действия выполнять и мне в него ничего передавать кроме аргументов вызова не нужно,
Если вам не нужно общаться с этим процессом, то и не работайте с этими пайпами, просто закройте их перед вызовом proc_close. Или вместо пайпов передайте константы [STDIN, STDOUT, STDOUT] - тогда и закрывать ничего не нужно будет. По вашей ссылке все примеры есть.
> а получить я от него хочу только pid или код возврата,
Ну вот тот же PID и можно получить через пайп:
php -r '$res=proc_open("php -r \"echo getmypid(), \\\"\n\\\"; sleep(15);\"", array(["pipe","r"], ["pipe","w"], ["pipe","w"]), $p); echo implode("\n",proc_get_status($res)), "\n\n"; echo fread($p[1], 10);';
> С proc_get_status($res) мне в конце скрипта в бесконечном цикле с секундной задержкой каждый запущенный процесс опрашивать что ли нужно перед выходом, чтобы получить код возврата?
А как вы это сейчас делаете с pgrep? Да, только так. Если через форк делать, то есть ещё pcntl_wait. Но судя по вашему 'kill -9' - дочерние процессы вам нужно прибивать принудительно, а значит wait вам не подойдёт.
> Иначе $res я потеряю же после выхода?
После выхода чего? При завершении родительского процесса? - Да, потеряете. Но тогда это уже и не мультипоточность, а просто запускалка процессов. Тогда вам опять же нужен exec, а не вот это вот всё.
Благодарю за разъяснения!Если я правильно понял эти ф-ии предназначены для web-сервиса, который запускается через systemd, запускает несколько процессов и потом не закрывая их общается с ними передавая им новые задачи и получая от них новые результаты.
А пытался я это применить на cli-скрипт который запускается ежеминутно кроном и котороый, при необходимости, запускает параллельные асинхронные процессы, и понятно почему у меня не получилось.Теперь немного больше понял как в принципе устроена многопоточность и понимаю что в php это работает, по крайней мере ф-ии для этого есть.
> поддержка многострочных замыканий:и приводится пример, который может быть записан в одну строку. Никаких \.
> как сокращённые и блочные варианты выражения "match"
if let из rust не дает покоя?
> неизменяемые переменные
опять же косит в сторону rust
Что вообще за многострочные замыкания? В пхп же всегда были анонимные функции и они всегда были многострочные
Блин ! fork php нужен ! иначе реально его угробят "сахаром" :(
дык ещё четыре версии назад =)
зачем его вообще куда-то развивать? php4 вроде последняя версия котороя выполняла то для чего он задумывался
о! два стакана балтийского чаю сему сударю!
Сделали транспайлер пхп в пхп с 1 фичей. Гениально! Шедевр!
Смотри на наших глазах JS переизобретают. Вот если снять $ с переменных,
то в чем разница?
А как поживает хип-хоп от запрещённой соц сети, у них же тоже был свой нескучный пых?
Все эти любители хип-хоп пошли на Хак.
> Все эти любители хип-хоп пошли на Хак.Хак-хак и в продакшен
Сделали PHP-проект на фреймворке Laravel и обозвали его новым языком программирования, совместимым и расширяющим PHP. И название такое, что теперь "Пэ-Ха-Пэ", будет подразумевать "старый" PHP, и новомодный PXP.https://github.com/pxp-lang/pxp/blob/main/pxp
https://github.com/pxp-lang/pxp/blob/main/composer.json
В целом сразу понятна ЦА, потому что в большинстве стран PHP и PXP до степени смешения далеко.