Опубликован первый тестовый выпуск реализации языка программирования PXP, расширяющего PHP поддержкой новых синтаксических конструкций и расширенных возможностей runtime-библиотеки. Написанный на PXP код транслируется в обычные PHP-скрипты, выполняемые при помощи штатного интерпретатора PHP. Так как PXP лишь дополняет PHP, он совместим со всеми существующим PHP-кодом. Из особенностей PXP отмечается расширения системы типов PHP для лучшего представления данных и применения статического анализа, а также поставка расширенной библиотеки классов для упрощения написания безопасного кода...Подробнее: https://www.opennet.me/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 до степени смешения далеко.