1. PHP / Говнокод #26674

    +2

    1. 1
    2. 2
    https://habr.com/ru/post/501798/
    > C++/Qt: пора валить?.

    Выбор небогат – это PHP. Да, я сказал PHP. И мне не стыдно.

    Ещё раз напомню, о каком типе приложений идёт речь: о тех, где сложная логика, требующая вычислительной производительности, реализована на C/C++, а к ним в пару нам нужен как можно более простой открытый язык/экосистема для общения с внешним миром и связи компонентов между собой. А если будет C-подобный синтаксис – вообще хорошо. И тут мы ставим галочки напротив каждого пункта наших требований.

    Главное – PHP прост. При том круге задач, которые он (и экосистема) может решать — он божественно прост. И дело не только в когнитивной нагрузке при кодинге и переключении контекста. Простота ещё и в развёртывании, администрировании и минимальном количестве вариантов, которыми можно решить одну задачу.
    PHP медленно, без резких движений, ползёт в правильную сторону, от увеличения производительности в 3 раза, до строгой типизации, решая задачи простым способом. И обрастая по пути крутыми штуками типа Swoole.
    PHP реализовал офигенский FFI (foreign function interface) к C. Офигенский в том контексте, о котором идёт речь — сочетании простоты и возможностей. Вы только наберите в гугле «PHP: Basic FFI usage».
    В PHP кругом $, а кто по нынешнему курсу их не любит...
    PHP быстрый. Да. Могу по слогам: бы-стрый. Для своей простоты и задач он божественно быстрый.

    Запостил: j123123, 20 Мая 2020

    Комментарии (83) RSS

    • Так толсто, что даже тонко.

      Почему не питон, почему не Lua, почему не какое-нибудь еще скриптоговно? Кстати в Qt встроить JS уже додумались. Только PHP там еще не хватало.
      Ответить
      • https://govnokod.ru/25327 - веб-сервер в Qt кстати уже встроили. Дело за малым.

        Можно ж еще сделать браузер, который чтоб помимо JS кода мог исполнять PHP код, и тогда все похапешники станут фуллстек-девелоперами, прямо как жабаскриптушки со своей ноде.жс
        Ответить
        • Я давно уже говорю, что надо сделать языки взаимно заменяемыми.
          Ответить
        • > исполнять PHP код

          Сейчас в моде конпеляция в жс. Странно, если для PHP такой транслятор ещё не сделали.
          Ответить
          • https://asmblah.github.io/uniter/ - такое сделали, оно не весь пыхпых поддерживает

            Вообще, можно ж еще сам пыхоинтерпретатор откомпилировать в WASM и потом ему пыхоскрипты скармливать.
            Ответить
            • И так много всякой скриптушни добавить можно. Т.е. на WASM к браузеру портировать интерпретаторы всякого говна, сделать там хуйню чтоб с DOM работать можно было через это, а потом этому говну скармливать скриптоговно. Можно так на каком-нибудь Ruby скрипты к браузерам писать.
              Ответить
              • Тормоза будут.

                Раньше можно было написать нативный плагин для ActiveX (для IE) или для NPAPI (для остальных браузеров). Теперь браузеры отказываются от плагинов. В белом списке новых браузеров только плагины PDF и Flash, да и то может оказаться, что ненадолго. Единственный движок, не отказывающийся от плагинов, это Goanna («Pale Moon», «Basilisk», «Borealis», «K-Meleon»), но у этих браузеров пользователей полтора человека.
                Ответить
              • В Ди это уже есть заботами LLVM https://wiki.dlang.org/Generating_WebAssembly_with_LDC
                Надо будет пирфоманс померить.
                Ответить
          • https://locutus.io/php/ - о переписывании каких-то похопэ функций на жабоскрип

            All your standard libraries will be assimilated into our JavaScript collective. Resistance is futile.
            Ответить
            • Таких проектов много. Люди пишут функции-переходники с «PHP» на «JS» и с «JS» на «PHP», чтобы можно было писать универсальный код.

              Вот реальный пример кода, который исполняется и на «PHP», и на «JS»:
              https://govnokod.ru/18109

              Удобно, на фронтенде и на бекенде можно использовать одни и те же сниппеты.
              Ответить
              • Лучше всё это говно выкинули нахуй, оставив только WASM с доступом к DOM, и чтоб любое говно (не только скриптоговно) в этот WASM компилировать можно было. А от намертво встроенного жопаскрипта вообще отказаться нахуй, как и от любого другого подобного интегрированного говна, кроме WASM и какого-нибудь WebGL
                Ответить
    • >Главное – PHP прост.
      Человек, для которого lua и python сложны, как-то не вызывает желания читать дальше.

      > И дело не только в когнитивной нагрузке при кодинге
      Это он про помойку в стандартной библиотеке, где у двух похожих функций разный порядок аргументов?
      Или это он вербозный синтаксис (более вербозный, чем даже джава)?

      >до строгой типизации
      Дурак не знает, что строгая типизация у нас в питоне?

      Или дурак опять путает строгую и статическую?
      Так статическая типизация в пыхе тоже говно: что-то проверяется, что-то нет.

      >Swoole
      Это как asyncio в питоне, корутины в lua и asynс с футурами в js?
      Причем всё в стандартной либе

      >PHP реализовал офигенский FFI (foreign function interface)
      Куда уж ему до LUA, который р0вно для этого и делался.

      >PHP быстрый. Да. Могу по слогам: бы-стрый
      куда уж ему до Node с её JIT, который выпидарасен до блеска.

      А напомните до речи, как там у PHP с профилировркой? Есть инструменты уровня хотя бы instruments или yourkit?
      Ответить
      • Лингвистический вопрос: это Вы специально для ГК так написали, в Ваших краях говорят на суржике или просто есть некоторые общеупотребляемые заимствованные слова?
        Ответить
      • >> Так статическая типизация в пыхе тоже говно: что-то проверяется, что-то нет.

        В пыхе нет статической типизации. В пых добавили только ассерты для аргументов функций. Т. е. через 10 лет работы программа может упасть с сообщением «вы передали в функцию строку вместо числа», причём это сообщение будет выведено прямо на страницу пользователю.
        Ответить
      • > Swoole

        А там хорошо, https://www.swoole.co.uk/

        $http = new Swoole\Coroutine\Http\Client('127.0.0.1', 80);
        $http->get('/index.php');
        echo $http->body;
        $http->close();


        берем клиент, отправляем запрос, берем боди из клиента што блядь?
        Ответить
    • > Первый конь – скрипт на PHP, выводящий шаблон страницы, на которой показывается значение из базы данных на основе параметра, переданного в запросе. Тормоза – для трусов Для простоты, ошибки не обрабатываем, и вообще не паримся. Но чтобы ещё хоть что-то происходило, для параметра из запроса ещё хэш sha256 посчитаем.

      > Второй конь – то же самое, но выводится с использованием QtWebApp.

      > Вот такая пара, потому что эта заметка о замене Qt. Если кому-то хочется вспомнить что-то типа node.js, тогда вспоминайте в паре с чем-то типа Swoole, и в отдельной статье, пожалуйста, потому что здесь не про асинхронщину, а про простоту, к тому же Swoole порвёт ваш node.js как Тузик грелку это будет оффтопиком.

      > Фрагмент на PHP
      <?php
      
      $horse_name = htmlspecialchars($_GET['horse_name'], ENT_QUOTES, 'UTF-8');
      $horse_hash = hash('sha256', $horse_name);
      
      $database = new PDO("mysql:dbname=vacuum;host=127.0.0.1", 'user', 'password');
      $database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      
      $query = "SELECT `horse_color` FROM `horses` WHERE `horse_hash`=:horse_hash";
      $statement = $database->prepare($query);
      $statement->bindParam('horse_hash', $horse_hash);
      $statement->execute();
      $result = $statement->fetch(PDO::FETCH_ASSOC);
      
      if ($result)
        $horse_color = $result['horse_color'];
      else
        $horse_color = 'unknown';
      
      ?>
      <!DOCTYPE html>
      <html lang="en">
      
      <head>
        <meta charset="utf-8">
        <title>Horse Color</title>
      </head>
      
      <body>
        <p><?= $horse_name ?> color is <?= $horse_color ?>.</p>
      </body>
      
      </html>
      Ответить
      • > Фрагмент с QtWebApp
        void HorseHandler::service(HttpRequest& request, HttpResponse& response)
        {
            QSqlDatabase database = QSqlDatabase::addDatabase(
                "QMYSQL", QString::number(
                              reinterpret_cast<uint64_t>(QThread::currentThreadId())));
        
            database.setHostName("127.0.0.1");
            database.setPort(3306);
            database.setDatabaseName("vacuum");
            database.setUserName("user");
            database.setPassword("password");
            database.open();
        
            QString horseName =
                QString(request.getParameter("horse_name")).toHtmlEscaped();
            QByteArray horseHash =
                QCryptographicHash::hash(horseName.toUtf8(), QCryptographicHash::Sha256)
                    .toHex();
        
            QString queryString(
                "SELECT `horse_color` FROM `horses` WHERE `horse_hash`=:horse_hash");
            QSqlQuery query(database);
            query.prepare(queryString);
            query.bindValue(":horse_hash", horseHash);
            query.exec();
        
            QString horseColor;
            if (query.next())
                horseColor = query.value("horse_color").toString();
            else
                horseColor = "unknown";
        
            QString templateString(R"RAW(<!DOCTYPE html>
        <html lang="en">
        
        <head>
          <meta charset="utf-8">
          <title>Horse Color</title>
        </head>
        
        <body>
          <p>{horse_name} color is {horse_color}.</p>
        </body>
        
        </html>)RAW");
        
            Template horseColorTemplate(templateString, "horseColor");
            horseColorTemplate.setVariable("horse_name", horseName);
            horseColorTemplate.setVariable("horse_color", horseColor);
        
            response.setHeader("Content-Type", "text/html; charset=UTF-8");
            response.write(horseColorTemplate.toUtf8(), true);
        }


        > В итоге получили, что PHP выдаёт абстрактную фигню страницу даже в полтора раза быстрее.

        Какой багор)))
        Ответить
        • Питузы используют реляционную субд на каждый звапрос, и воюют за перформанс? серьезно?! Вроде не первое апреля уже.

          Алсо, код получается поддерживаемый, тестируемый, и читаемый очень.
          Напомниает язык парсер
          Ответить
        • QSqlDatabase::mysql_real_escape
          Ответить
        • В «MySQL» подготовленные выражения тормозят. Поэтому «PDO» по умолчанию эмулирует подготовленные выражения, самостоятельно клея запрос. Именно поэтому реальный пример на «PHP» может работать быстрее, чем на «C++» с «Qt».
          Ответить
          • Всегда клеил SQL-запросы на плюсах. Чем это хуже PHP?
            Ответить
            • Ничем.

              Кстати, QSqlQuery использует настоящие «prepared statements» или может клеить?
              Ответить
              • SQL запросы, передаваемые в какую-то хуйню в виде текста это анскильный оверхед, настоящие Цари в компилтайме транслируют заедушные текстовые запросы в прямые вызовы соответствующих функций СУБД.
                Ответить
                • Или можно еще представить это как скомпилированную хранимую процедуру, которую можно еще чуть-чуть специализировать, добавив параметров.
                  Ответить
                • https://public.commandprompt.com/documents/5

                  > PL/php is a procedural language with hooks into the PostgreSQL database sytem, intended to allow writing of PHP functions for use as functions inside the PostgreSQL database. It was written by Command Prompt, Inc. and has since been open sourced and licensed under the PHP and PostgreSQL (BSD) licenses.

                  Какую только хуйню не придумают
                  Ответить
                  • Надо сделать PHP/MySQL операционную систему. Чтоб файловой системой была MySQL, весь ввод-вывод осуществлялся через SQL запросы к устройствам ввода/вывода, и например чтоб вывести картинку на монитор, нужно было послать картинку через SQL запрос в какую-нибудь специальную ячейку.
                    Ответить
                    • И выдавать 404 Not Found и 403 Forbidden вместо пейджфолта и сегфолта.
                      Ответить
                      • а как тебе такое?
                        https://docs.microsoft.com/en-us/sql/xquery/xquery-language-reference-sql-server?view=sql-server-ver15
                        Ответить
                        • можно целые куски html выдавать, на клиенте DOM собирать
                          Ответить
                        • Какое-то говно слепили.
                          Ответить
                          • там даже цикл for можно в запросах использовать
                            Ответить
                          • WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)  
                            SELECT ProductModelID, CatalogDescription.query('  
                                  <Prod>  
                                     { /pd:ProductDescription/@ProductModelID }  
                                     { /pd:ProductDescription/pd:Summary }  
                                  </Prod>  
                             ') as Result  
                            FROM Production.ProductModel  
                            where CatalogDescription.exist('  
                               /pd:ProductDescription/pd:Summary//text()  
                                [contains(., "Aerodynamic")]') = 1



                            Если бы это был мускуль с джэйсоном, то все бы текли

                            а MS и XML принято ненавидеть
                            Ответить
                            • Мне не нравится, что слишком много всего слепили. Это примерно как конародовская портянка, в которой PHP+HTML+JS+SQL.

                              Хотя если посмотреть внимательно, то всё логично. Синтаксис вполне SQL. Вставки на XML оформлены как строковые литералы.
                              Ответить
                              • Ну вот представь себе, что тебе нужно хранить дерево в SQL.
                                Как это лучше сделать?

                                XML со встроенным в SQL xpath выглядит как очень хорошее решение, нет?
                                Ответить
                    • А ещё можно будет делать GET и POST на всякие /dev/usb/5/ep/81. Именно поэтому я за http.
                      Ответить
                    • Вообще не пойму, над чем тут смеяться. С тем же успехом программиста может веселить показаный палец, FILE*, std::ostream, /dev/urandom, SSH, или просто функции.

                      Вот потеха-то: эмуляция, интерфейсы и абстракции.
                      Ответить
                      • Это всё анскильная абсрактушня. Настоящие Цари работают напрямую с железом, и для записи на НЖМД пишут напрямую SATA/ATA/SCSI команды.

                        Или же вообще управляют самой механикой жесткого диска напрямую, в явном виде указывая поворот коромысла последовательностью специальных инструкций.
                        Ответить
                        • > SATA/ATA/SCSI
                          Это все анскильная прокладка.

                          Работать надо напрямую с SSDшным контроллером в PCI-E. См nvme
                          Ответить
                          • Анскильная прокладка. Настоящие цари работают напрямую с флеш-чипами, зачем им лишний контроллер, да ещё и на какой-то шине?
                            Ответить
                            • NAND чипы лучше сразу впаивать в on die, чтобы не использовать всякую ненужную прокладку типа root complex.
                              Ответить
                              • Да, жаль кстати что nand и современный проц на одном кристалле не совместить. Только микроконтроллеры могут себе такое позволить т.к. у них техпроцесс покрупнее.
                                Ответить
                                • То-есть техпроцесс nand настолько крупнее x86, что их физически нельзя на один чип?
                                  А рядом можно?

                                  Хочу, чтобы мимокрод CPU хранился на NAND. Тогда мне не пришлось бы грузить его каждый раз из ОС. Чертов initrd бы выкинул наконец
                                  Ответить
                                  • > из ОС

                                    Напиши свой загрузчик, который засовывает микрокод в проц перед стартом ОС.
                                    Ответить
                                    • Не важно, всё равно придется делать это каждый раз при загрузке
                                      Ответить
                                      • Да может оно и к лучшему... По крайней мере проц нельзя убить неудачным апдейтом или навсегда засадить в него трояна.
                                        Ответить
                                        • Думаю, Поттеринг и с этим сможет справиться.
                                          Ответить
                        • Я вот думаю о том, что если такую ОС можно попытаться какими-нибудь средствами свернуть до тонкой прослойки и запускать на всяких хостингах, то будет удобно. 1 сайт = 1 PHP-VM.

                          Можно будет установить просто на ПК, тогда там добавится куча питушни для возни с устройствами, а можно под хостинговое окружение.
                          Ответить
                          • Почти как докер же)
                            Ответить
                            • Да, пока писал, тоже в голову пришло, что похоже на докерушню.
                              Может быть, подсознание как раз на этой основе придумало.
                              Ответить
                              • В наше время все хотят делать такое приложение, чтобы оно не зависело от окружения. Отсюда go с его стат. линковкой.
                                Отсюда же и докер. Причем докер компост вообще про то, чтобы создать кучу сервисов (базу, мемкеш, веб сервер, пых или питон итд) одним файлом.

                                Никто не хочет пол недели настраивать окружение чтобы запустить приложение.

                                У AWS вообще есть fargate: там ты грузишь Dockerfile, и он запускается "где-то в облаке". То-есть у тебя даже нету виртуального сервера. Все твое приложение это Dockerfile.
                                Ответить
                              • Это потому что принципиальной разницы между докером и пихушней нет
                                Ответить
                  • Ну вот, теперь пхпшники даже как DBA могут работать. Фуллстек во все поля.
                    Ответить
                • В «MySQL» есть плагин «HANDLER», который позволяет читать строки из таблицы напрямую без SELECT:
                  https://dev.mysql.com/doc/refman/8.0/en/handler.html
                  https://mariadb.com/kb/en/handler/

                  Есть ещё «HandlerSocket», он позволяет обойтись вообще без «SQL»:
                  https://mariadb.com/kb/en/handlersocket/
                  Ответить
                  • Кстати, а зачем они и мускуль и машку пилят? По лицензии с ораклом пересрались?
                    Ответить
                    • Да, именно по лицензии были разногласия. Я удивлю: перкону до сих пор пилят, хотя она по сути от мускуля и от машки ничем не отличается.

                      https://www.percona.com/blog/category/mysql/
                      Ответить
                      • Зайцев и его друзья когда-то делали гораздо более мощную хуйню чем сраный мускуль. Неужели оно теперь ничем не отличается от него?

                        Кстати, на всякий случай напомню, что перкона, mariadb и mysql не нужны
                        Ответить
                        • Авторы этих веток периодически заимствуют новые фишки друг у друга, но не буквально копируя код, а реализуя по-своему. Т. е. внешне всё похоже, а под капотом может быть по-разному, и в определённых условиях пирфоманс будет разный.
                          Ответить
                        • > Зайцев и его друзья когда-то делали гораздо более мощную хуйню чем сраный мускуль.

                          чтобы потом публично обсираться с "кокококо да не может нашаsql-распределенка данные проебывать"
                          Ответить
      • Игого!
        Ответить
    • > Swoole
      Schwule
      Ответить
    • Я давно говорил, что кресты мертворожденный язык. Земля ему пухом.

      Именно поэтому я за "Java Script"
      Ответить

    Добавить комментарий