Вы можете посмотреть видеоверсию интервью тут.
Часть ответов уже разлетелась по чатам в виде цитат («Я все языки не люблю, но меньше других — Rust», «Когда вcе заговорили о PHP++, я задумался о PHP+-»), а остальные яркие моменты мы решили сложить в этот пост.
Каждый подзаголовок — это кратко переформулированный вопрос. Местами ответы приведены в усеченном виде, но без потери смысла.
Про нативные enum’ы в PHP
Никита Попов: Надеюсь, они будут в PHP 8.1: по крайней мере, есть план, как это будет выглядеть, и люди, которые над этим работают. Изначально будут достаточно простые, стандартные enum, которые будут имплементированы как специальные объекты. Каждый член enum — это отдельный класс.
Дмитрий Стогов: Зачем для этого классы? Почему не взять enum как набор констант и объединить их в один тип?
Никита Попов: Классы — чтобы можно было их как-то типизировать. Если enum – это числа 1, 2 ,3, то нельзя отличить числа от членов enum. Думаю, возможность типизации это главное, если ее нет, то можно просто использовать класс с константами.
Мы хотели бы все-таки, чтобы тип проверялся. Например, есть какой-то enum параметр, ты туда посылаешь просто integer или string — и тогда получаешь ошибку.
А не сделать ли PHP компилируемым?
Дмитрий Стогов: Никто не мешает сделать компилируемым язык с динамической типизацией. Просто он будет работать точно так же, как интерпретатор: проверять, какой у нас тип, и иметь ветки кода для каждого возможного типа.
По сути, у нас есть режим function для JIT, который можно рассматривать как ahead of time компилятор. Если включите его, то все, что загружается, будет сразу компилироваться. Но большого смысла я не вижу: вам все равно потребуется вся виртуальная машина, все библиотеки. Хотя, можно как в GraalVM – cделать какой-то урезанный пак.
Но это большая работа, а увеличения производительности не будет. Tracing JIT показывает лучшие результаты, а он возможен только на этапе выполнения.
Если вы заинтересованы не в производительности, а хотите код скомпилировать и давать людям только бинарник, чтобы они код не видели, – это другая задача. Я не вижу смысла делать open source продукт для людей, которые будут зарабатывать деньги, скрывая свои сорцы.
Перспективы асинхронности в PHP
Дмитрий Стогов: Большого выигрыша от асинхронности для всех в PHP я не вижу: это сложность, это очень узкое применение для определенного круга задач.
Добавить async/await – нет никаких проблем, это синтаксический сахар. Добавить файберы и корутины? В принципе, думаю, не так уж сложно.
Вопрос — кто этим займется и доведет ли он это до ума.
Я готов помогать.
Никита Попов: Там как раз кто-то опять работает над этой темой. Но основная проблема в куче синхронного кода: это же причина того, почему в том же Китае так популярен Swoole, который заменяет PDO и так далее версией, которая работает асинхронно. Но я как-то не совсем знаю, хотим ли мы это иметь на уровне ядра. Потому что это точно сделает все более сложным.
Дмитрий Стогов: Вероятно, нам потребуется редизайнить stream layer. Если с ним разобраться, то все остальное будет проще. Анатоль Бельский пытался за это браться, но, потратив некоторое время, решил: «Ну его нафиг».
Есть уже планы, что добавить в 9-ку?
Никита Попов: Скорее, хотелось бы многое убрать. Например, reference если убрать, то все станет намного проще.
Дмитрий Стогов: Преобразование типов налету, сравнение строки с числом — вот от этого неплохо уйти уже в PHP 9, допустим.
Есть и мысли, что добавить. Например, вместо include’ов и require было бы хорошо сделать систему модулей настоящих, чтобы было понятно, какие классы и переменные откуда у нас приходят.
Это было бы очень круто, но это гигантская работа: просто понять, как все это должно выглядеть даже — в Jave модули выглядят ужасно, на мой взгляд. В Python… можно было бы сделать что-то такое, но с учетом, что у нас все динамично. Но может быть где-то есть что-то лучше.
Есть еще один момент, для меня достаточно интересный.
Если сейчас посмотреть на боттлнеки в PHP-парсере, например, это все обращения к массивам.В JavaScript можно встретить такое: единый тип массив, но в многих случаях он может работать более оптимально, если его представлять тем или иным способом. То есть это адаптивный массив. Например, если есть массив целых чисел, то его можно так и представлять. Но как только туда вставляется что-то другое, он должен преобразоваться во что-то другое.
Это поможет, если мы обрабатываем матрицу какую-то на PHP: она будет плоской, как в C это представлено. Соответственно, работать с ней будет намного быстрее, особенно если мы используем это в JIT. Ничего сложного в этом нет, все «закладки» для этого уже заложены.
Для пользователя при этом ничего не изменится, просто будет работать быстрее.
Сейчас много реализаций PSR-7. Может вам сделать что-то одно и затащить в ядро?
Никита Попов: Я считаю, что в ядро надо затаскивать вещи, которые важны для производительности. Это не тот случай.
Думаю, лучше, если вопросы request-response будут решаться в userland, — там можно соревноваться, делать какие-то изменения. Если мы загрузим это в ядро, тогда это навсегда: а если выяснится, что там что-то не то, сложно будет всем.
p.s. Спасибо Роману Пронскому за помощь в редактуре расшифровки. Читайте продолжение интервью, которое осталось за кадром стрима, в одном из следующих постов.
Bonio
Самая бесполезная вещь в том виде, в котором это предлагается. Ничем, по сути, от классов не отличается, только все усложняет.
freecoder_xx
Вы просто не понимаете зачем это надо, а это шаг в сторону реализации алгебраического типа данных. Если правильно сделают, то вы сами через некоторое время будете пользоваться этой фичей повсеместно (по крайней мере опыт Rust это демонстрирует).
chapuza
Я вот тоже совершенно не понимаю, зачем это надо. Мантры «шаг в сторону реализации алгебраического типа данных» («алгебраического типа данных» произносится шепотом и с придыханием) — тоже нифига не достаточно. Алгебраический тип данных сам по себе — как артефакт — никакой ценности не представляет.
Опыт
rust
— это лучше, чем ничего, но бесконечно мало, для того, чтобы делать такие заявления. Сопоставление с образцом для извлечения данных — это уже теплее, но алгебраические типы тут ни при чем (так умеет даже физический триод, и то, что алгебраические типы — тоже, пока не делает их лучше). Гошная кондовая проверка на ошибку — тоже сопоставление с образцом, в какой-то мере.switch
в js.Так что (если вы действительно понимаете, что в них хорошего) — было бы неплохо лицезреть пример — без баззвордов и апелляций к конкретным языкам. Потому что вот опыт лиспа говорит о другом, смолтолка — о третьем, а уж опыт эрланга (где вообще типов нет, и оттого все прямо прекрасно) — вообще об обратном.
freecoder_xx
Конечно речь об увеличении строгости типизации, в эту сторону двигается PHP.
Алгебраический тип данных — это довольно простая штука: у вас в языке обычно есть записи (то есть структуры или классы) — и это тип-произведения (типы в записи объединяются образуя новый тип и каждый объект данного типа содержит значения сразу всех объединенных типов). Если его дополнить тип-суммой — то есть вариантом, типом-перечислением других типов (среди которых могут быть опять типы-суммы или типы-произведения), когда объект типа-перечисления имеет значение одного из указанных типов, то получим АТД.
Вот предлагаемый
enum
и есть тип-сумма, то есть перечисление других типов:Аналог на Rust:
Смысл в том, что эти значения — это не константные значения, это — варианты типа. Их именно столько, сколько определено в конкретном типе, и переменная типа
Color
может принимать одно из этих значений, и никакие другие:Теперь, в качестве вариантов могут быть не только единичные типы (без полей), но и типы-произведения:
То есть, теперь вы цвет можете задать еще и покомпонентно:
Фактически вариант
Rgb
— это отдельная структура, и в Rust ее действительно можно отделить:Это чтобы было понятно, что имена вариантов — это просто метки типа
Color
вводимые для некоторых других типов, которые тип-перечисление в себе объединяет.Теперь, для типа
Color
можно создать общие методы, которые будут присутствовать во всех его вариантах:Как это применять? Существует огромное число случаев, в которых удобно использовать тип-сумму (перечисление) и АТД. Например, вместо булевых флагов для обозначения состояний (которых может быть больше двух). При этом еще в каждом состоянии могут храниться свои наборы данных особого типа. АТД привносит преимущества нестрогой типизации в строго-типизированные языки, не выходя за пределы строгой типизации.
chapuza
Ух. Я столько кода даже на ревью не осилю.
Неясно, почему это аксиоматично хорошо. Но допустим.
Я в курсе, что это такое, спасибо.
Как я уже заметил в том комментарии, на который вы отвечаете, ваши нужды конкретно в этом вопросе покрываются сравнением с образцом. Вы приписываете эти чудо-свойства АТД просто потому, что в АТД оно используется, но это не единственный (и не лучший) вариант его использования.
Это смешной аргумент. Есть миллиард ничуть не худших способов сделать то же самое. Фабрика и приватный конструктор в банальной джаве умеют это с 1996 года.
Так если у нестрогой типизации есть преимущества, может надо ее и использовать, а не тащить их повсюду?
Есть правильное решение описанной проблемы (зависимые типы). К сожалению, ни раст, ни хаскель его никогда не увидят, хотя надежда, конечно, умирает последней. Есть рабочее, типа протоколов в эликсире. А есть многословные, и неуклюжие алгебраические типы. Зачем втискивать их в языки, в которых и без них не протолкнешься от синтаксического избыточного многообразия — непонятно (точнее, понятно: по хайпу, но это так себе аргумент).
freecoder_xx
Это как? Сопоставление не может ограничить множество типов, которое может принимать переменная. Этим занимется тип-сумма.
напишите конкретную реализацию АТД с помощью фабрики, и я вам покажу, в чем ее проблема.
chapuza
Переменная? При чем тут вообще переменная? Переменных в языке может вообще не быть (если не рассматривать хаскелевский синтаксический сахар
let in
как переменную, конечно) — и в языках с нативными функциями высшего порядка их обычно и нет.Эка невидаль, это я и сам покажу. Моя мысль (и оратора, стартовавшего ветку) заключалась как раз в том, что АТД вообще не нужны. Ну хорошо, иногда нужны, но не такие, и не в PHP, и не просто ради того, чтобы они были, потому что нравятся трем с половиной людям.
AnthonyMikh
Опечатался в названии атома — и всё, актор уже не ловит нужные сообщения, потому что там-то код без опечатки. Очень удобно, да.
chapuza
У меня более, чем тридцатилетний опыт разработки, и я ни разу не видел в продакшене код, который сбоит из-за того, что кто-то где-то опечатался (даже в руби, где можно
object.send(:method)
). Есть миллиарды причин, по которым типы действительно могут в чем-то помочь, но вот этим бессмысленным аргументом с опечаткой неимоверно достали, если честно.AnthonyMikh
Я бы сказал, что логично, что не видели.
Maksclub
wiki.php.net/rfc/enumerations_and_adts