Кресты / Говнокод #22687 Ссылка на оригинал

0

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

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

Запостил: j123123 j123123, (Updated )

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

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

    А эти убогие плюсокостыли - говно
    Ответить
        • Многопоточная работа с AST программы на этапе компиляции надо, и чтоб с возможностью сохранить результат этого метакомпилирования(кодогенерации), т.е. инкрементарная метушня, которая повторно перегенерируется только тогда (и только те части), когда в код-генерирующий-код вносились изменения
          Ответить
  • Имо 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 тоже не добавил ничего нового. Метушня и без него метушилась.
          Ответить
          • constexpr добавил возможность писать метушню почти как обычный плюсокод в плюсоуебанском-функциональном стиле, до этого были только шаблоны, которые тоже позволяют делать метушню, но метушня через плюсошаблоны это еще большее уебанство.
            Ответить
            • Ну о чём я и говорю - сахарок, понижающий градус уебанства.
              Ответить
        • Как бы новое то, что он там хочет АЛЛОКАТОР в constexpr, ну чтоб не делать особый constexpr для vector, map, unordered_map, а просто присобачить constexpr аллокатор к имеющемуся говну в стандартной библиотеке, и чтоб оно потом все в компилтайме заработало. Вообще это довольно занятно, но я думаю что им надо начать с реализации компилтайм-malloc и уже поверх него пилить аллокатор, но вот только компилтайм-malloc работает с указателями, а constexpr-метушня долбиться в указатели насколько я знаю не может (поправьте если я ошибаюсь) и всякие там reinterpret_cast обосрутся
          Ответить
          • А потом можно собрать выжившие в compile-time куче объекты и перенести их в секцию с константами...

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

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

        К примеру, можно написать нормальный 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.
            Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8