1. C++ / Говнокод #14173

    +13

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    auto write =    [&buf](future<int> size) -> future<bool>    { 
      return streamW.write(size.get(), buf).then(
        [](future<int> op){
          return op.get() > 0; });    };   
    auto flse = [](future<int> op){
     return future::make_ready_future(false);};  auto copy = do_while(
        [&buf]() -> future<bool>    {
         return streamR.read(512, buf)    .then(
           [](future<int> op){ return (op.get() > 0) ? write : flse;});    });  
    
    ///////////////////////////////////////////////////////////////////////////
    
    int cnt = 0;   
    do  {  
    cnt = await streamR.read(512, buf);   
    if ( cnt == 0 ) break;   
    cnt = await streamW.write(cnt, buf);   
    } while (cnt > 0);

    Первое и второе угадайте что? Правильно, С++. В компиляторе студии и первое и второе будет. Первое уже даже есть. Ни первое ни второе не приняли в стандарт на сколько мне известно и надеюсь лобисты Майкрософт во главе с Саттером пойдут на ... подальше от крестов.

    www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3722.pdf

    Запостил: LispGovno, 03 Декабря 2013

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

    • У Саттора C# 5.0 головного мозка.
      Ответить
    • так а какую это практическую проблему решает то?
      Ответить
      • На сколько я понимаю, это очень урезаный инструмент для програмного управления элементами управления программой. В этом случае нужное для отложенного выполнения каких-то действий.
        Сама по себе идея восходит к МакКарти и его запланированому, но никогда не реализованому языку Слону, флюент логике, Остину и его курсу лекций "о том как совершать действия с помощью слов". Другими словами, о том, как програмно описать такие понятия как "принять обязательство", "сделать предложение" и т.д.
        Тема вцелом интересная, и предлагающая очень нетрадиционный подход к написанию програм (полный отказ от описания структур данных - задача создания структур данных возлагалась бы на компилятор / интерпретатор, который бы исходя из ситуации сам подбирал бы нужную структуру, оперирование не предикатами / утверждениями а изьявлениями воли / пожеланиями).

        Но в полном объеме система никогда не была воплощена, да и не понятно, как даже подступиться, но некоторые элементы приобрели определенную популярност, вот "будущие", "обещания", "ожидания", "уступки" и т.п. - что-то что разные языки в разной степени переняли от этих идей.
        Ответить
        • Мне больше нравится направление развития как оно в ObjC++: попытатся сделать так что бы даже и последовательная логика работала эффективно. Потому что в конце концов, код пишется людьми и отклонения от последовательного исполнения обычные человеческие мозги переваривают плохо. Примеры: goto/flow-control, много-поточность, аспекты.
          Ответить
          • ХЗ. Мое предвзятое мнение такое, что Ц++ нельзя улучшить что-либо в него добавив. Единственный путь улучшения - это что-то убирать.
            Что до семантики многозадачности: мне еще нигде не попадалась хорошая :) да и по отзывам специалистов, не понятно, что бы из себя представляла така семантика, что в ней должно быть, и какие концепции нужно выражать / какие строительные блоки нужны. Но все прогрессивное человечество семимильными шагами устремилось, так что рано или поздно, что-то будет.
            Ответить
            • > мне еще нигде не попадалась хорошая :)

              это был всего лишь пример, но ты раскрыл тему: человеческой семантики прикрутить никто не может.

              Ada была и остается самой успешной попыткой которую я видел. Когда-то давно нагуглил:
              http://en.wikibooks.org/wiki/Ada_Programming/Tasking
              и все еще пользуюсь как справочником по шаблонам синхронизации. Как на микро так и на макро уровне.
              Ответить
              • А какие есть шаблоны синхронизации? До сих пор мне лично за глаза хватало синхронизированной очереди.
                Ответить
                • "До сих пор мне лично за глаза хватало синхронизированной очереди."

                  Очередь - это всего лишь деталь реализации. Причем достаточно низко-уровневая. И одной очередью дело редко заканчивается. Это почти RPC: содержимое очереди на высоком уровне можно описать как сериализованые вызовы функций.

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

                      Из высокоуровневого краем глаза видел akka. Ну и ФП, если его можно туда причислить.
                      Ответить
                  • А можете кинуть ссылку на что-нибудь по теме на русском языке или менее многословном английском?
                    Ответить
              • Я читал книжку Concurrent C. Задумка автора книжки в том, чтобы добавить в Си примитивы многопоточности, там, в том числе обсуждаются сходства и различия с Адой. На сколько я знаю, OpenMP реализует что-то похожее на то, что было описано в Concurrent C, но это решает очень мало, и скорее даже создает больше проблем.

                Например, в Си-подобных языках одна из фундаментальных вещей - это отсутствие абстракции памяти, т.е. управление памятью открыто для программитста и предполагает, на уровне языка, Фон Ноймановскую програму, т.е. программу которая должна выполнятся в одном потоке. Это позволяет, например, сильно оптимизировать массивы, т.как не нужно их передавать по значению, а достаточно передать указатель на массив. Более того, на уровне языка даже нет возможности передать массив произвольной длины по значению.

                Что делают в таких языках: начинают отчаяно отстаивать идею указателей, и придумывают всякие ухищения, как приготовить яйцо в микроволновке. Но я все это говорю не потому, что я знаю, как надо было бы сделать - я понятия не имею, а потому что так как оно сейчас, это совсем не хорошо.
                Ответить
                • >Фон Ноймановскую програму, т.е. программу которая должна выполнятся в одном потоке.
                  Никогда не слышал.

                  > Это позволяет, например, сильно оптимизировать массивы, т.как не нужно их передавать по значению, а достаточно передать указатель на массив.
                  А где массивы передаются по значению?
                  Ответить
                  • http://en.wikipedia.org/wiki/Von_Neumann_programming_languages
                    Ну вот тут более-менее описано.

                    Я не знаю, где массивы передаются по значению, я это говорю не потому, что где-то уже лучше сделано, а потому что это серьезное препядствие с которым сталкивается любая система пытающаяся описать общение между одновременно выполняющимися задачами.

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

                      Так нифига и не понял про ноймана, наверно не судьба.
                      Ответить
                      • Чет-та как-то я не просматриваю такую логику. Если антисидент - истина, то консеквент должен быть истиной, но если антисидент - ложь, то никаких требований к консеквенту как бы нет.
                        Другими словами: то что Си не может - это плохо, а то, что никто другой не может - это тоже плохо. Это ж открытая система, и хочется верить, что языки программирования, вообще не ограничатся только созданными за последние 60 лет. Скорее всего их будет больше и лучших.

                        Нойман описал компьютер как коробку с одним вводом и одним выводом (в то время как у параллельно выполняющейся системы есть много вводово и, возможно, выводов).
                        Ответить
                        • Я не очень понял претензии к си при том, что это очень низкоуровневый язык, когда то, о чем ты упоминаешь нету вообще нигде. OpenMP тоже вроде бы довольно низкоуровневый, умеет параллелить только цикл.
                          Ответить
                          • Нет никакой связи между низко/высокоуровневым языком и отсутствием возможности передать массив по значению. В этом смысле претензии к Си и к Сиквелу одинаковые.
                            OpenMP - это про другое. Это не для того, чтобы "параллелить циклы", это набор примитивов для написания програм, которые могут выполнять несколько задач одновременно. То, что там есть какая-то возможность сделать выполнение цикла, в некоторых случаях параллельным - это второстепенная деталь.
                            Ответить
                          • http://en.wikipedia.org/wiki/Dataflow_programming
                            Вот, что еще можно почитать по этому поводу (это одна из предполагаемых альтернатив).
                            Из всех языков, которые там перечислены, я пробовал (или вообще слышал раньше) только про Oz и VHDL. Исходя из чего могу судить, что остальные тоже, либо узко-специализированые, либо чисто академические языки.
                            Ответить
                          • Текущий грааль теоретиков - транзакционная память (STM). Правда, все текущие её реализации достаточно медленные и несовершенные.

                            Я лично хотел бы видеть в мейнстриме годную реализацию task-based concurrency.

                            В Go очень годно всё, в 1.2 вон сделали возможность вытеснения длинной вычислительной задачи на вызове функции. От длинных числодробильных циклов это, правда, не спасёт.
                            Ответить
    • они бы c++11 допилили
      Ответить
      • https://github.com/olk/boost-coroutine/blob/master/example/cpp11/await_emu.cpp
        и реализацию библиотеки, в отличии от кейворда, можно легко заменить
        Ответить
    • Зачем так наворочено?
      int cnt = 0; 
      do 
      { 
      cnt = await streamR.read(512, buf); 
      if ( cnt == 0 ) break; 
      cnt = await streamW.write(cnt, buf); 
      } while (cnt > 0);

      можно записать как
      int cnt = 0; 
      do 
      { 
      cnt = streamR.read(512, buf); 
      if ( cnt == 0 ) break; 
      cnt = streamW.write(cnt, buf); 
      } while (cnt > 0);
      Будет тоже самое. Они упоротые?
      Ответить
      • > Будет тоже самое.
        Ты уверен? Первое шедулится в юзерспейсе, второе в кернел-спейсе. Люди пишут ОС внутри ОС and we need to go deeper.
        Ответить
        • Да там наверняка над обертка файберами или над машиной состояний. Все это в юзермоде работает
          Ответить
          • Ты тугой? В первом варианте используются зеленые потоки, а во втором тупое пожирание ресурсов системы. Потоки - это ресурс. И второй вариант их блокирует на время IO операции, а первый переиспользует системные потки на другие задачи на время IO. Полезно, когда большая часть работы - это ожидание IO. Гугли overlapped IO, asynchronous IO, epoll, HDD DMA, Ethernet PCI DMA, GPU E-PCI DMA, Audio DMA.

            В данном коде это бесполезно, но если вокруг этого кода много другого асинхронного кода - это благое дело. И если ты думаешь что можно написать высоконагруженный сервер без асинхронного кода и если ты считаешь потоком меньше или больше неважно и ты их насоздаешь целый пул, сервер 128 гб RAM всё стерпит, то поздравляю: сам мудак. Сколько ты памяти сожрешь только на стек в каждом возможно неиспользуемым рационально сейчас потоке? Если ты правда Борманд - не обижайся.
            Ответить
            • Повесть о том, как поссорился Иван Иванович с Иваном НикифоровичемЛисп Говнович с Хаскелем Говновичем.
              Ответить
              • Ты просто завидуешь, что не знаешь так много как ваш покорный слуга.
                Ответить
          • >машиной состояний
            Конечный автомат, сука! Повторяй по буквам!
            Ответить

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