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

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    https://www.quora.com/As-a-software-engineer-in-your-opinion-what-are-the-biggest-bottlenecks-and-or-inefficiencies-in-programming-today
    
    
    The key to overcoming this bottleneck, I believe, is live coding, whereby you can inspect and modify code and data while the program is running. Detect a bug? No problem. Immediately inspect the code and data to determine the cause. Make the appropriate changes. Continue execution. No need to save the code, compile the code and rerun the program from the beginning.

    оказывается то, что делали пхпшники начала нулевых, правя по FTP в Notepad++ файлы на живом сервере это т.н. "Live coding", и за этим будущее

    Запостил: gueest8, 06 Февраля 2019

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

    • seo: Peace door ball
      Ответить
    • Именно поэтому я за «PHP».
      Ответить
    • Это хуйея, вот в S" Forth" действительно S" Live coding" определения можно вводить и отлаживать интерактивно, и в форт-систему может быть даже встроен какой-нибудь редактор, жаль только, что редактор и способы сохранения системы не стандартизированы и везде разные.
      Ответить
    • да здравствует php 7.3 с поддержкой JIT compilation failed: no more memory
      Ответить
      • показать все, что скрытоvanished
        Ответить
        • Это шо? Итераторы?
          Ответить
          • <?php
            $array = ['a' => 1, 'b' => 2, 'c' => 3];
            
            $firstKey = array_key_first($array);
            
            var_dump($firstKey);//string(1) "a"
            ?>

            http://php.net/manual/en/function.array-key-first.php
            Ответить
          • array_key_first — Получает первый ключ массива
            array_key_last — Получает последний ключ массива

            Раньше можно было только получить значение первого или последнего элемента функциями reset и end соответственно. Правда, очевидные названия?

            Ну ещё для получения ключа первого элемента можно было использовать такую кобенацию:
            foreach($mosiv as $key=>value) {return $key;}

            С получением ключа последнего элемента (если массив разреженный) было хуже, потому что цикла в обратном направлении нет.
            Ответить
            • Понятно. Спасибо.
              Длинные какие-то названия. То ли дело «begin()» и «end()»! Именно по этому я за «C++».
              Ответить
              • То ли дело «Питон», где выражение a[-1] возвращает последний элемент массива. Можно даже предпоследний достать через a[-2]. И предпредпоследний...
                Ответить
                • А побитовое отрицание позволяет индексировать массив с конца:
                  >>> a = [1,2,3]        
                  >>> a[0], a[1], a[2]   
                  (1, 2, 3)              
                  >>> a[~0], a[~1], a[~2]
                  (3, 2, 1)
                  Ответить
                  • <?php
                    
                    class MyArray implements ArrayAccess  {
                      private $data = array ();
                      private function realOffset($offset) {
                        return $offset + count($this->data) * intval($offset < 0);
                      }
                      public function offsetGet ($offset) {
                        return $this->data[$this->realOffset($offset)];
                      }
                      public function offsetExists ($offset) {
                        return array_key_exists( $offset, $this->data) 
                            || array_key_exists(~$offset, $this->data);
                      }
                      public function offsetSet ($offset, $value) {
                        $this->data[$this->realOffset($offset)] = $value;
                      }
                      public function offsetUnset ($offset) {
                        unset($this->data[$this->realOffset($offset)]);
                      }
                      public function __construct() {
                        $this->data = func_get_args();
                      }
                     }
                    
                    $m = new MyArray(4, 5, 6);
                    echo sprintf("m[0] =%d, m[1] =%d, m[2] =%d\n", $m[0],  $m[1],  $m[2]);
                    echo sprintf("m[~0]=%d, m[~1]=%d, m[~2]=%d\n", $m[~0], $m[~1], $m[~2]);


                    https://ideone.com/viiqHn
                    Ответить
                  • Замечу что в 'J' нет побитовых операций, а значит сам язык не привязан к двоичным конпуктерам.
                    Ответить
                  • Гениально. Надо будет в жс в некоторых slice-подобных функциях такое попробовать.
                    Ответить
                  • Удваиваю 1024--. Тильда добавляет элегантности.

                    Обычно с её помощью -1 приводят к false.
                    if(~arr.indexOf(something)){
                    Ответить
                • То ли дело 'J', в котором есть встроенные глаголы для получения/отбрасывания первого/последнего элемента:
                  i.5
                  0 1 2 3 4
                     {.i.5
                  0
                     {:i.5
                  4
                     }.i.5
                  1 2 3 4
                     }:i.5
                  0 1 2 3
                     NB. ну и, конечно, отрицательные индексы тоже работают:
                     _1{i.5
                  4
                     _2{i.5
                  3
                  Ответить
                  • То ли дело «car» и «cdr»…

                    А есть в «J» бесконечные списки?
                    Ответить
                    • Нет, никаких бесконечностей и ленивостей я в нём не нашёл.
                      Ответить
                    • Но вообще 'J' умеет оптимизировать и не вычислять лишнего:
                      3 {. i.5000000
                      NB. работает значительно быстрее чем
                      i.5000000
                      Наверное первый вариант сокращается до i.3

                      Интересно, (-@*:) сделает джва прохода по массиву или сунет эти операции в один цикл. К сожалению исходники плохо поддаются онализу:(
                      Ответить
                      • Но на limit error всё равно можно нарваться.
                        Ответить
                      • Простите, я напиздел, оно тормозило из-за вывода, a =: i.5000000 работает быстро.
                        Ответить
                        • 20-летняя студентка Аруши Дуа из Индии написала письмо Марку Цукербергу, в котором попросила его добавить в фейсбуке кнопку On my period («У меня менструация»).
                          Ответить
                          • Почему бы просто в статусе об этом не написать?
                            Ответить
                          • Это не я.
                            Ответить
                          • Предлагаю добавить кнопки "У меня геморрой", " У меня понос", "Дрочу", "Ссу/сру".
                            Ответить
                            • показать все, что скрытоvanished
                              Ответить
                              • У петухов клоака, поэтому помёт с мочой смешивается.
                                Ответить
                              • memcpy/memccy
                                Ответить
                                • CCY - compare copy? Что-то типа compare exchange?
                                  Ответить
                                  • Может "C" —– это "CHAR"? Типа как в S" Forth" есть ' MOVE ( перемещает адресуемые элементы ) и есть ' CMOVE ( перемещает символы ).

                                    ЗЫ. в сях есть аналог ' CMOVE> ( перемешает от наибольших адресов к наименьшим )?
                                    Ответить
                                    • В сях есть memcpy() с неопределённым поведением если буфера пересеклись и memmove(), который выбирает направление чтобы сделать заебись (как-будто через временный буфер).

                                      Явно направление задать нельзя. А надо ли?
                                      Ответить
                                      • > memcpy() с неопределённым поведением если буфера пересеклись

                                        В S" Forth" ' CMOVE и ' CMOVE> с фиксированным направлением , а ' MOVE сам выбирает направление, никакого UB в этом случае. Именно поэтому я за S" Forth".

                                        > А надо ли?
                                        Ну, может быть заранее известно пересекаются ли буферы и как, например когда сдвигаешь массив.
                                        Ответить
                                      • Проверил. memcpy() обычно начинает с младших адресов, но в некоторых реализациях копирует не по одному байту, а пачками сразу по несколько, поэтому совсем коротенькие строки (короче машинного слова) не портит. Так что потестировав мелкие примеры, можно сразу ошибку в программе не заметить.

                                        В общем, действительно, положение неопределённое.
                                        Ответить
                                        • >Проверил. memcpy() обычно начинает с младших адресов, но в некоторых реализациях копирует не по одному байту, а пачками сразу по несколько, поэтому совсем коротенькие строки (короче машинного слова) не портит.

                                          По этому поводу был забавный срач флешепидоров и libcщников, где-то в году 2013. libc копировало задом наперёд, потому пересекающиеся буфера работали нормально.

                                          Однажды они memcpy оптимизировали, то ли штеуд быстрый rep mov завёз, то ли ещё по каким причинам стало удобнее копировать память вперёд. Но тут во флеш-шшш-шееее сломался звук.

                                          По этому поводу даже Линус отписывался, мол почините, чтобы юзеры не страдали. На что libcшники говорят — нахуй нам это чинить, когда overlapped memcpy это UB?

                                          И это правильно. Пользователи Адобе должны страдать.
                                          Ответить
                                          • >> нахуй нам это чинить

                                            Тем более, что чинилось это заменой в интерпретаторе «Флеша» вызова memcpy на вызов memmove. Так что библиотеку и вправду трогать не надо было.
                                            Ответить
                                          • показать все, что скрытоvanished
                                            Ответить
                                            • >но Лин сказал, что пользователей это ебсти не должно

                                              Потому что кернеловцы НЕ ЛОМАЮТ ЮЗЕРСПЕЙС!!!

                                              Mauro, SHUT THE FUCK UP!

                                              It's a bug alright - in the kernel. How long have you been a
                                              maintainer? And you *still* haven't learnt the first rule of kernel
                                              maintenance?

                                              If a change results in user programs breaking, it's a bug in the
                                              kernel. We never EVER blame the user programs. How hard can this be to
                                              understand?
                                              [...]
                                              > So, on a first glance, this doesn't sound like a regression

                                              Shut up, Mauro. And I don't _ever_ want to hear that kind of obvious
                                              garbage and idiocy from a kernel maintainer again. Seriously.
                                              [...]

                                              WE DO NOT BREAK USERSPACE!
                                              Ответить
                                      • >> Явно направление задать нельзя. А надо ли?

                                        В случае MMIO или ещё каких-нибудь побочных эффектов направление может оказаться важным.
                                        Ответить
                                        • показать все, что скрытоvanished
                                          Ответить
                                        • > MMIO
                                          В MMIO области вообще страшно без volatile писать. А аргумент memcpy() не volatile.

                                          З.Ы. На stm32f4 прикольно сделана mmio зона для usb. Она несколько килобайт, но оффсет внутри неё ни на что не влияет - твои данные тупо падают в очередь на отправку.
                                          Ответить
                                          • показать все, что скрытоvanished
                                            Ответить
                                            • Чтобы мемсру в неё удобно было делать, видимо.

                                              А насчёт зашкваривания памяти адресного пространства там и повеселее фишки есть. Например область адресного пространства, в которой ты видишь все биты оперативки как dword'ы.
                                              Ответить
                                              • показать все, что скрытоvanished
                                                Ответить
                                                • > в один адрес

                                                  Да, в других очередях (uart, spi) там надо в один регистр сувать по очереди.

                                                  > удобнее делать AND

                                                  Ну да, просто у ARM'ов нету операций над памятью в отличие от интела. Там только LD да ST к памяти обращаются. Поэтому такой костыль немного тактов экономит. Ну и неосиляторам битовой магии чуть легче живётся.
                                                  Ответить
    • {kokoko
      Ответить
    • kokoko}kokoko
      Ответить

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