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

    −124

    1. 1
    2. 2
    Открытая встреча Национальной рабочей группы по стандартизации C++.
    https://youtu.be/FcCymlVAtP8?t=3622

    Я тут вам немного ПОКУШАТЬ ПРИНЕС
    Они там с этими constespr похоже окончательно двинулись.
    Давайте мне constexpr-асмовставки cкорей, и чтоб с гомоиконностью

    Запостил: j123123, 28 Марта 2017

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

    • И вот вообще, представьте как было б заебись, если б был язык с s-expression синтаксисом, и чтоб значит было две точки входа, и одна из них запускается(скажем так, интерпретируется) на этапе компиляции и кодогенерирует, т.е. чтоб вот код как данные, можно было б там наанроллить какой-нибудь цикл, сделать специализацию некоторых функций. Вообще, можно было б так встраиваться в сам компилятор даже. Да и сам компилятор можно было б на этапе компиляции допиливать своими специализированными domain-specific оптимизациями, например вот работаете вы где-то с bigint-ами, и чтоб можно было б делать a^3 + b^3 = (a + b) * (a^2 - ab + b^2) оптимизации такие вот, ну и через бином ньютона чтоб с произвольными степенями так делать, вот короче компилятор дополнить системой символьных вычислений, и чтоб вот так с AST возиться можно было как угодно, и чтоб корованы можно было грабить со всем этим

      А эти убогие плюсокостыли - говно
      Ответить
    • показать все, что скрытоСам же рассказ про constexpr начался с https://youtu.be/FcCymlVAtP8?t=3486
      Ответить
    • показать все, что скрытоИмо constexpr-ness должна быть неявной. То есть чтобы при компиляции функции проверялись на возможность вычислить результат в compile-time, а потом вызывались везде, где используются с compile-time аргументами. constexpr c++ это конечно слишком
      Ответить
      • показать все, что скрытоа разве оптимизаторы так уже не делают когда указываеш -O3 ?
        Ответить
        • показать все, что скрытоДелают. А констэкспры сделали для метушни, а не для ололо перфоманса.
          Ответить
        • показать все, что скрытооптимизаторы то что угодно делают. Вот только они не гарантируют, что они так сделают. В отличие от constexpr - функций
          Ответить
          • показать все, что скрытонаколько я помню constexpr ваще ничего не гарантируют т.к. они просто не скомпилятся и компилер выдас ошибку если их нельзя просчитать во время компиляции.
            Ответить
            • неверно помните. constexpr гарантирует вычислимость функции на этапе компиляции, т.е. при константах времени компиляции в качестве входных аргументов функция будет гарантированно посчитана в compile-time.
              Ответить
              • показать все, что скрытоага. я практически никогда не юзал constexpr так что могу просто нести херню :)
                Ответить
              • показать все, что скрыто> constexpr гарантирует вычислимость функции на этапе компиляции

                Только если это не специализация шаблонной функции.
                For constexpr function templates and constexpr member functions of class templates, at least one specialization must satisfy the abovementioned requirements. Other specializations are still considered as constexpr, even though a call to such a function cannot appear in a constant expression.
                -- http://en.cppreference.com/w/cpp/language/constexpr
                Ответить
                • показать все, что скрытоЕсли я правильно понял, у runtime-only перегрузки всё равно не может быть указан constexpr; а правило по факту лишь говорит, что перегрузка может относиться к шаблону с отличающимся constexpr-ness.
                  Ответить
    • показать все, что скрытоconstexpr разве не с с++11 узается?
      Ответить
      • показать все, что скрытои что?
        Ответить
        • показать все, что скрытону как бэ ничего нового.
          Ответить
          • показать все, что скрытотам же совсем убогий, с ограничением в одно выражение и жуткими костылями для чего-то сложнее хелловорлда.
            Ответить
          • показать все, что скрытоты уж если не знаешь, то и не пезди
            Ответить
          • показать все, что скрыто> как бэ ничего нового
            Если на то пошло - то constexpr тоже не добавил ничего нового. Метушня и без него метушилась.
            Ответить
            • показать все, что скрытоconstexpr добавил возможность писать метушню почти как обычный плюсокод в плюсоуебанском-функциональном стиле, до этого были только шаблоны, которые тоже позволяют делать метушню, но метушня через плюсошаблоны это еще большее уебанство.
              Ответить
          • показать все, что скрытоКак бы новое то, что он там хочет АЛЛОКАТОР в constexpr, ну чтоб не делать особый constexpr для vector, map, unordered_map, а просто присобачить constexpr аллокатор к имеющемуся говну в стандартной библиотеке, и чтоб оно потом все в компилтайме заработало. Вообще это довольно занятно, но я думаю что им надо начать с реализации компилтайм-malloc и уже поверх него пилить аллокатор, но вот только компилтайм-malloc работает с указателями, а constexpr-метушня долбиться в указатели насколько я знаю не может (поправьте если я ошибаюсь) и всякие там reinterpret_cast обосрутся
            Ответить
            • показать все, что скрытоА потом можно собрать выжившие в compile-time куче объекты и перенести их в секцию с константами...

              З.Ы. Причём даже gc писать не надо - линкер справится сам.
              Ответить
              • показать все, что скрытоМожно какими-нибудь костылями сделать так, чтобы эти указатели-из-constexpr-которые-от-malloc потом были как статические массивы c т.з. нормального кода
                Ответить
              • показать все, что скрыто>З.Ы. Причём даже gc писать не надо - линкер справится сам.

                Ну это если повезет, и метушня в процессе метушения не выжрет всю память
                Ответить
    • показать все, что скрытоА я вот Type Driven Development with Idris читаю. Красиво, однако.
      Ответить
      • показать все, что скрытоМожно выжимку в пару абзацев? Любопытно, но времени никак не найду.
        Ответить
        • Занятный язык с зависимыми типами, в котором типы являются значениями, и могут зависеть от значений.
          Например, можно написать функцию, которая вычисляет тип из значения, и компилятор сможет вызывать её при во время тайпчекинга.

          К примеру, можно написать нормальный printf с компайл-тайм проверками в виде библиотеки, без необходимости вшивать их в компилятор, или проверять в компайл-тайме, что индексы в массивах не выходят за границы. Ещё есть totality checker, который умеет проверять, что функция определена для всех входов и производит конечное кол-во вычислений. Он работает на эвристиках, но в целом довольно умный.

          Из-за того, что типы являются значениями, сущностей становится меньше, синтаксис становится более однородным. К примеру, тайпдефы больше не нужны:
          Point : Type
          Point = (Double, Double)

          Автор языка утверждает, что язык создан для практического использования (к примеру, он энергичный), там починили некоторые хаскелевские фейлы (String = [Char]? really?), но, как всегда, добавили своих (map f (x :: xs) = f x :: map f xs в энергичном языке? srsly?). Из приятного: качество интеграции компилятора с редактором кода (Atom/Emacs) приятно удивила, не припомню такого со времён tuareg-mode для ocaml.

          До доказательства теорем в компайл-тайме я ещё не дочитал.

          Вот тут есть две бесплатные главы: https://www.manning.com/books/type-driven-development-with-idris
          Тут есть запись курса по идрису на русском, содержание по сути идентично тому, что содержится в книге http://compsciclub.ru/courses/idrisprogramming/2017-spring/ (смотреть рекомендую на скорости 1.5x, мужик как-то очень медленно говорит)

          Могу отправить MEAP-версию книжки в epub/pdf, если скажешь, куда.
          Ответить
          • 1. При умножении матрицы типа Matrix x y на матрицу типа Matrix y z получаем значение типа Matrix x z.
            2. При конкатенации Vect n elem и Vect m elem получаем Vect (n + m) elem.

            Вычисляемые типы? Да я этого джва года ждал.

            Кстати, как с этим можно сравнить темплейты и дженерики + вывод типов в C++/C#/Java?
            Ответить
            • > Кстати, как с этим можно сравнить темплейты и дженерики + вывод типов в C++/C#/Java?

              Жабьи дженерики даже рядом не лежали, они только типами параметризуются. В C# тоже только типами параметризовать можно.

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

              Ещё забыл: в плюсах компайл-тайм и рантайм это две разных вселенных, и компилятор может оперировать только тем, что известно в компайл-тайме.

              Допустим, мы хотим включить информацию о размере массива в его тип, чтобы проверять, что мы не выходим за границы этого массива. Это всё чудесно, пока тип массива содержит константу, а что если мы читаем массив с диска? В плюсах у нас нет вариантов, нужно выкинуть константу из типа и на этом успокоиться. Well, I've tried.

              В Idris есть зависимые пары — функция может возвращать значение, тип которого зависит от того, что случится в рантайме. Например:
              readArrayFromDisk : FileName -> IO (n ** Array n String)
              Тут написано, что функция читает файл с заданным именем и возвращает пару число + массив, размер которого равняется этому числу. Компилятор заставит нас проверять при доступе к массиву, что индекс меньше n.
              Ответить

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