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

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    // https://habr.com/ru/post/490222/
    
    Почему мы должны сломать ABI
    
    Прежде всего, есть несколько полезных изменений в реализации стандартной библиотеки, которые можно внедрить, если нарушить текущий ABI:
    
    ...
    
    * Ускорить работу std::regex (На данный момент быстрее запустить PHP и выполнить на нем поиск по регулярному выражению, чем использовать стандартный std::regex)

    Какой багор! Именно поэтому я за PHP

    Запостил: j123123, 28 Февраля 2020

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

    • > Во время разработки модулей для C++23 мы снова столкнемся с проблемами ABI, потому что все не-экспортируемые символы должны будут оставаться в глобальной части модуля, чтобы не сломать ABI. Этот факт в принципе уничтожает весь смысл модулей как таковых

      Блядь, как всё сложно. Модули-хуёдули, ABI какие-то. Взять бы всё, и на ассемблер переписать.
      Ответить
      • >std::unique_ptr мог бы храниться в регистре с помощью некоторых модификаций в языке, что сделало бы его zero-overhead по сравнению с обычным указателем

        C этого момента поподробней.
        Ответить
        • Пардон, но ведь std::unique_ptr — это и есть zero-overhead по сравнению с обычным указателем. По памяти в том числе.
          Ответить
          • >std::unique_ptr — это и есть zero-overhead по сравнению с обычным указателем

            Как оказалось не совсем.

            Крестушачие конструкторы/деструкторы всё портят.
            https://youtu.be/MWBfmmg8-Yo?t=484
            Ответить
            • Какой анскилл (((
              Ответить
              • Он там дальше рассказывает что в кресты хотят завезти move-семантику моей мечты: схлопывать new+delete в memcopy в случае НЕтривиальности конструкторов/деструкторов.
                Ответить
                • Ещё чуть-чуть и прямо в рай ССЫЛОЧНАЯ ПРОЗРАЧНОСТЬ вместо ссылочной призрачности.
                  Ответить
      • Вы чаи пьёте да им про разные ABI говорите. Им надо чтоб их ёбом крыли с утра до вечера тогда они мож немного одумаются. А вы всё обратной совместимостью да модулями. Ассемблером им а не модулями надо. Вот как.
        Ответить
    • > Предполагаемая потеря в производительности библиотеки из-за нашего нежелания нарушать ABI оценивается в 5-10%. Это число будет только расти со временем. Давайте посмотрим на примерах:

      > Если вы разработчик встраиваемых систем, то эти 5% могут стать гранью между работающим продуктом и необходимостью купить более дорогой и мощный чип, а он может стоить миллионы

      А не пойти бы вам нахуй? Никакой гранью это не станет, это просто приведет к выкидыванию нахуй этой вашей триждыблядской крестоговняной стдлибы (возможно даже вместе с самим крестоговном и переходом на Си)
      Ответить
      • 5-10% - вообще питушня. Большего можно добиться хардварной эволюцией, некоторыми оптимизациями, или же вовсе перепостановкой задачи на более адекватную железу.
        Ответить
        • Это только для анскильных жаваскриптушков "5-10% - питушня". Для каких-нибудь датацентров, если какая-то питушня считается на 5-10% быстрее - это огромная экономия электроэнергии и вычислительных ресурсов
          Ответить
          • Так он же прав.
            А вы выдрали из контекста кусочек, и опровергли. И я плюсанул не глядя.

            >Большего можно добиться некоторыми оптимизациями
            Главное-то здесь!
            Лучшие алгоритмы дают ускорение НА ПОРЯДКИ.

            Не какая-то заумная хрень. А простой отказ от алгоритмов маляра Шлемиэля.

            Ассемблерные вставки в нужных местах дают ускорение В РАЗЫ.

            "5-10% - питушня", по сравнению с профитами проистекающими от других отпимизаций.
            Ответить
            • >> Большего можно добиться некоторыми оптимизациями
              > Главное-то здесь!
              > Лучшие алгоритмы дают ускорение НА ПОРЯДКИ.

              > Ассемблерные вставки в нужных местах дают ускорение В РАЗЫ.


              Бывает так, что алгоритм и так самый лучший. Но при этом улучшать еще есть куда, и это оправдано. И кстати, можно взять самый лучший алгоритм, реализовать его на какой-нибудь скриптушне, например напитоне и на ассемблере - там тоже ускорение от ассемблера может быть на порядки из-за некоторых говноособенностей скриптушни
              Ответить
    • > «Ускорить работу std::regex (На данный момент быстрее запустить PHP и выполнить на нем поиск по регулярному выражению, чем использовать стандартный std::regex)» — основное что тормозит в std::regex, это локали. Убрать локали — это изменение API а не ABI.

      В ассемблере никаких локалей нет. Именно поэтому я за ассемблер
      Ответить
      • >На данный момент быстрее запустить PHP и выполнить на нем поиск по регулярному выражению, чем использовать стандартный std::regex

        В ассемблере никаких regexов нет. Именно поэтому за «PHP».
        Ответить
    • >Return type of push_back could be improved with an ABI break

      Зачем? Зачем?
      Просто сделайте новый метод.
      Ответить
      • > Добавление новых имен

        > Это первое и очевидное решение. Если мы не можем поменять std::unordered_map, может нам просто добавить std::fast_map? Есть несколько причин, почему так делать плохо. Добавление типов в стандартную библиотеку обходится дорого как с точки зрения расходов на поддержку, так и с точки зрения образования. После введения нового класса неизбежно появятся тысячи статей, в которых объясняется, какой контейнер стоит использовать. К примеру, мне следует использовать std::scoped_lock или std::lock_guard? А я понятия не имею! Мне нужно каждый раз гуглить.
        Ответить
        • Что будет делать программист с языком программирования, стандарт которого занимает две страницы, прекрасно работает, и не требует изобретения новых стандартов? Правильно! Он забудет говностандартизаторов навсегда. Он не будет звонить в комитет по стандартизации, он не услышит там о новых версиях и пропозалах, ему не надо будет учиться на специально организованных курсах за свои деньги в течении трех лет. А вот если он потратил туеву хучу времени и денег на изучение монстра, ему подарили красивый диплом с вензелями и золотым обрезом, назвали Сертифицированным-Супер-Профессионалом-По-Крестоговну-Категории-Z-Неимоверной-Крутизны-С-Правом-Ковырять-В-Носу-В-Присутствии-Августейшего, если он почувствует эту неимоверную крутизну в кругу таких же дураков, преисполнится благодарности, и никогда не перейдет к другим языкам программирования. Как по моральным, так и по материальным причинам.
          Ответить
          • Поиграется с этим калькулятором и забьёт. Язык то может и хороший, но стандартной либы у него явно нет.
            Ответить
            • Именно поэтому я за «PHP».
              Ответить
              • показать все, что скрытоvanished
                Ответить
                • И то верно.

                  А у «Оберона» спецификация чуть ли не на одной странице. Вру, одна страница на синтаксис, 20 страниц — полное описание. Стандартная либа состоит из питушни вроде Texts.Scan и Texts.WriteString. Реальный пример:
                  PROCEDURE Gcd*;
                  VAR x, y: INTEGER; S: Texts.Scanner;
                  BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos);
                  Texts.Scan(S); x := S.i; Texts.WriteString(W, " x ="); Texts.WriteInt(W, x, 6);
                  Texts.Scan(S); y := S.i; Texts.WriteString(W, " y ="); Texts.WriteInt(W, y, 6);
                  WHILE x # y DO
                  IF x > y THEN x := x-y ELSE y := y-x END
                  END;
                  Texts.WriteString(W, " gcd ="); Texts.WriteInt(W, x, 6); Texts.WriteLn(W);
                  Texts.Append(Oberon.Log, W.buf)
                  END Gcd;
                  Ответить
            • Стандартная либа может быть отдельным стандартом стандартизирована.
              А сколько страниц займет стандарт крестов, если из него выбросить стандартную либу? Я думаю что тоже очень и очень дохуя.
              Ответить
          • Предлагаю придумать идеальный язык и написать к нему стандарт на двух страницах А4. Ну так, чтобы он поддерживал x32 и x64 рахитектуры, все эти бигэндианы, машины с троичными байтами, разные модели памяти.

            Сишку, кстати, можно в две страницы формального описания уместить?
            Ответить
            • У сишки листов 200 сам язык. Не сильно проще крестов, я бы сказал.
              Ответить
            • Ну в пару страниц только forth да tcl впишутся, если описания слов/функций оставить за кадром.
              Ответить
            • Джава влезет
              Ответить
              • Нет, не влезет. Там одно только простое описание опкодов «JVM» в пару страниц с очень большим скрипом (и мелким шрифтом) влезет, и то не факт. А уж стандартная библиотека (тоже, между прочим, важная часть языка) — тут, как говорится, без комментариев.
                Ответить
              • Хуй там.

                Рекомедую попробовать ужать хотя бы JLS хотя бы на десяток A4.
                Ответить
                • JLS (акроним Jack the Lad Swing) — британский бой-бэнд, состоявший из 4-х участников:
                  Астона Мэрриголда, Оришея Уильямса, Джонатана Бенджамина и Марвина Хьюмса.

                  Да, четырёх человек в десяток листов A4 вряд ли получится сжать.
                  Ответить
                  • откуда ты знаеш про бойбенды?
                    Ты что, 15-ти летняя девочка?
                    Ответить
                  • >четырёх человек в десяток листов A4 вряд ли получится сжать

                    А что если использовать «принцимп мухи»?
                    Ответить
                    • Можно попробовать зожать олгоритмом «YETM».
                      Ответить
                      • Что это?
                        Ответить
                        • https://govnokod.ru/21312#comment354390
                          Ответить
                          • Так вот кто писал с «huesto».
                            Ответить
                            • Опровергаю.
                              Ответить
                              • Если бы не уебанское джвухпробельное форматирование «YETM», я бы не писал зелёным.

                                Если спамерство ещё можно простить, то двухпробельным говном срут только больные ублюдки.
                                Ответить
                            • Да. И кто тут любит пописать скриптики на «Питоне».
                              Ответить
              • Да нет, JLS и JMM достаточно большие, ну и либа стандартная, как правильно сказал гост.

                TLC принципиально другой: если выкинуть команду expr и её синтаксис (по сути это язык в языке), то он вообще на пол страницы влезет. Правда, тогда придется потерять условные выражения, и он кажестя станет не ТП.
                Ответить
        • Да, я прочёл статью. В оригинале.

          Альтернатива, которую они предлагают: сломать нахуй всё, ради глупой питушни. Питушни, которую в будущем они ещё несколько раз поменяют.

          Это свидетельство анскильности комитета, который сперва бездумно принимает всякую хуйню. А когда она пошла в прод, пытается переделать её.

          >Ускорить работу std::regex (На данный момент быстрее запустить PHP и выполнить на нем поиск по регулярному выражению...)
          А нужно было просто сделать std::php::regex
          Ответить
          • > Это свидетельство анскильности комитета, который сперва бездумно принимает всякую хуйню.

            Именно поэтому я за Си - там комитет почти нихуя не меняет
            Ответить
            • Если в языкe за 10 лет практически ничего не меняется, значит он уже близок к совершенству.
              Ответить
              • По этому я за lua
                По этому я за поссаль
                Ответить
                • По этому я за Аклоголь-68.
                  Ответить
                • В пасраль много завезли.

                  Деструкторы, женерики, неймспейсы, динамические массивы.

                  Очень много.
                  https://wiki.freepascal.org/FPC_New_Features_3.0.0
                  https://wiki.freepascal.org/FPC_New_Features_3.2.0
                  Ответить
                  • В «Standard Pascal» (ISO, ANSI) ничего из этого нет. Всё это есть в «Object Pascal» — по сути в новом языке, который придумали в «Борланде», а остальные подхватили.

                    «Object Pascal» от «Standard Pascal» отличается примерно как «C++» или «Objective C» от «Plain C».
                    Ответить
                    • Есть ещё ISO 10206:1990 для «Extended Pascal».
                      http://pascal-central.com/docs/iso10206.pdf

                      Но речь даже не о багланде, а об fpc. И туда регулярно завозят новые фичи.
                      Ответить
                      • Про «Extended Pascal» я в курсе. Но он не такой. Реализаций у него полторы штуки и они мало кому известны. Его пытались реализовать в «gpc», но потом на «gpc» положили болт.

                        «fpc», как и «Delphi», реализует «Object Pascal». Сейчас они немного разошлись: в «fpc» завезли одни конструкции, в «Delphi» — другие. Стандарта на «Object Pascal» нет. На базе «Object Pascal» ещё несколько проектов: «PascalABC», «Oxygene»...

                        Мне нравится «Object Pascal»: он не такой примитивный, как «Standard Pascal» или «Oberon», но и не такой сложный, как «язык Ада».
                        Ответить
                        • В том-то и дело что под «Паскаль» я понимаю реально используемые реализации, а не древнюю питушню на которую все забили.
                          Ответить
                  • Я про тот Паскаль который не меняется уже лет 25. Неужто это не есть совершенный язык? Ну насчёт всяких других я и не знал. Историю не знаю их появления. Возможно из-за лицензий и прочего говна.
                    Собственно и lua не меняется уже лет 17, только мелкие исправления и минимальное добавления функции. Вот 30 июня вышла новая версия.
                    Ответить
                    • показать все, что скрытоvanished
                      Ответить
                      • Сразу видно, что ты сисадмин.
                        Ответить
                      • Покажи пример реального использования awk
                        Ответить
                        • Постоянно использую GNU awk.

                          И багор, именно из-за того что он меняется.
                          https://govnokod.ru/26508#comment534819

                          Ответить
                        • Могу привести реальный пример использования «sed».
                          https://github.com/bolknote/SedChess
                          Ответить
                          • О-ху-ен-но.

                            Я всегда говорил что ed и его производные — выбор скилльных пацанов.
                            Ответить
                            • На какой слог ударение в слове «скилльный»?
                              Ответить
                          • https://catonmat.net/proof-that-sed-is-turing-complete

                            В статье ссылки на «тетрис», «сокобан» и «калькулятор».
                            Ответить
                            • Тотально шокирован тем фактом, что sed тьюринг-полный. И что я узнал об этом только сейчас.

                              https://catonmat.net/ftp/sed/turing.txt
                              Ответить
                          • Господи, я запустил, а оно нарисовало полноценную доску и даже клеточки. КЛЕТОЧКИ!
                            Какой GUI )))
                            . a b c d e f g h
                            8 ♖ ♘ ♗ ♕ ♔ ♗ ♘ ♖ 
                            7 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙ 
                            6                 
                            5                 
                            4                 
                            3                 
                            2 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ 
                            1 ♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜ 
                            Введите команду
                            Ответить
                            • 5 минут не мог вдуплить что в отличие от обычной шахматной нотации нужно писать «откуда» и «куда».

                              Например первый ход Ng1-f3 записывается как «g1 f3».

                              Так же в игре есть особенность. В отличие от нормальных шахмат король может уходить «под бой». И для победы его надо явно забрать.
                              Ответить
                            • Ой, тут ещё непривычнее правила.

                              Король спасась от мата может «есть» свои фигуры.
                              Пример:
                              e2 e3
                              f1 c4
                              d1 f3
                              f3 f7 # мат, однако король уходит на d8
                              f7 f8 # опять мат, однако король «съедает» своего отступая на с8
                              f8 c8 # наконец мы его настигли


                              В обычных шахматах на невозможности friendly-fire построено огромное количество трюков и моментов. Например паттерн «спёртый мат».
                              Ответить
                              • френдлифайр ломает на корню половину шахмат же, это уже другая игра
                                Ответить
                                • Да.

                                  Но многие вореции эзотерических шахмат, вроде js на 1kb альтернативно трактуют те или иные сложнореализумые правила. Вроде рокировки, выбора фигуры превращения и взятия-на-проходе.

                                  Интересно было бы ещё изучить как он ведёт себя когда ему «пат».

                                  Но спать уже хочу нереально.

                                  Судя по коду полагаю что король просто пойдёт под бой, где его можно будет съесть. Что впрочем соответствует очень старым правилам, где и «пат», и «мат» считались победой.
                                  Ответить
                        • показать все, что скрытоvanished
                          Ответить
                    • > Я про тот Паскаль который не меняется уже лет 25.

                      Это как застывшее говно мамонта, которое никому не нужно.

                      Или студенческая поделка на гитхабе, на которую забил её единственный автор.

                      Тем более что все полтора адепта begin~end используют совершенно другие диалекты Паскаля.
                      Ответить
                  • Кстати, посмотрел текущее состояние «FPC». Мало того, что они добавляют новые конструкции в язык, они ещё поддерживают и старые, и новые платформы.

                    Сейчас можно скачать «FPC», который можно запустить на ARM («Linux», «WinCE», «Android», игровые сосноли), на PPC («Amiga», «AIX», «Linux», «Mac OS X», игровые сосноли), на SPARC («Linux», «Solaris»), на 68000 («Amiga», «Linux»), на x86 в 32-битном режиме («Windows», «Linux», «Mac OS X», «FreeBSD», «Solaris», «OS/2», «Haiku», DPMI), на x86 в 16-битном режиме (голый «DOS»), на x86 в 64-битном режиме («Windows», «Linux», «FreeBSD», «Solaris»).

                    Поддержка «DOS» нормальная, даже круче, чем у «Турбо Паскаля» (добавили указатели типа huge), не то, что экспериментальный проект «gcc-i8086», который даже указатели типа far не поддерживает.

                    Помимо этого можно собрать или скачать готовые кросскомпиляторы для целевых платформ AVR («Arduino»), «Win16», «JVM», «UEFI», «NativeNT» (можно писать программы, которые зависят только от «ntdll.dll», а не от клиентских библиотек, и даже драйвера нулевого кольца). Даже давно забытый «MIPS» не обошли стороной.

                    https://wiki.freepascal.org/FPC_JVM
                    https://wiki.freepascal.org/DOS
                    https://wiki.freepascal.org/AVR
                    https://wiki.freepascal.org/ARM
                    https://wiki.freepascal.org/UEFI
                    https://wiki.lazarus.freepascal.org/Target_NativeNT
                    https://wiki.freepascal.org/MIPS_port
                    Ответить
                    • Да, fpcшники дико жгут.

                      Самое удивительное что у них вся инфраструктура родная: компилятор и экосистема написаны на Паскале.

                      В отличии от «пuтушни» и остальных clang/gcc-based недоязычков где всё ворованное.
                      Ответить
                      • Доброе утро.
                        Ответить
                      • Кстати, игрушечный «Standard Pascal» и малоизвестный «Extended Pascal» они тоже попытались реализовать:
                        -M<x>  Set language mode to <x>
                              -Mfpc      Free Pascal dialect (default)
                              -Mobjfpc   FPC mode with Object Pascal support
                              -Mdelphi   Delphi 7 compatibility mode
                              -Mtp       TP/BP 7.0 compatibility mode
                              -Mmacpas   Macintosh Pascal dialects compatibility mode
                              -Miso      ISO 7185 mode
                              -Mextendedpascal ISO 10206 mode
                              -Mdelphiunicode Delphi 2009 and later compatibility mode

                        Проверку дискриминанта у записи с вариантами они реализовывать не стали (проверку реализовали в «Irie Pascal», а больше реальных примеров я не знаю). Сделали точную копию сишного union, как и в «TP».

                        Единственное, что пока не очень радует — слабоватый оптимизатор. Даже у «Delphi» и у «Virtual Pascal» код был чуть-чуть быстрее. Но их можно понять: они начали с нуля, не используя кодогенератор «gcc» или «llvm», при этом поддержали несколько разных процессоров.
                        Ответить
                        • >Кстати, игрушечный «Standard Pascal» и малоизвестный «Extended Pascal» они тоже попытались реализовать

                          Ага, я видел.

                          https://wiki.freepascal.org/FPC_New_Features_Trunk#Support_for_code_generation_through_LLVM

                          Ну шланг они в транке прикрутили, как опциональный кодогенератор.
                          Ответить
                          • Оказывается, эти фишки «fpc» взял из «Extended Pascal»:
                            • The for ... in loop
                            • Array and string slices (mostly working, though assigning to them doesn't).
                            • The * and >< operators of sets.
                            • The ** operator (requires the Math unit)


                            В игрушечном стандартном «Паскале» была ещё одна особенность, которую редко реализовывали: разыменовывание файловой переменной. Реальный пример:
                            Assign(f, 'pituh.txt');
                            Reset(f);
                            x := f^; { эквивалентно Read(f, x); }
                            f^ := y; { эквивалентно Write(f, y); }
                            Close(f)
                            Эту неявную питушню «fpc» реализовывать не стал.
                            Ответить
                            • > разыменовывание файловой переменной
                              Прямо ко-ко-кое-то «MMIO».
                              Ответить
                              • Эта питушня ещё не обладала ИДЕМПОТЕНТНОСТЬЮ, что делало невозможной оптимизацию:
                                x := f^; x:= f^; (* Прочитает из файла две записи, *)
                                (* поэтому не упрощается до x := f^; *)
                                f^ := y; f^ := y; (* Запишет в файл значение y два раза, *)
                                (* поэтому не упрощается до f^ := y; *)

                                Что-то типа volatile.

                                В «Турбо Паскале» (и в других компиляторах вслед за ним) заморачиваться не стали и вместо перегрузки разыменования положили в стандартную библиотеку процедуры Read и Write.
                                Ответить
                              • скорее, какой mmap, не?
                                Ответить
                                • «mmap» был бы, если б под файл contiguous кусок памяти выделялся, а тут прямо натуральное высирание в замапленный порт.
                                  Ответить
                                  • показать все, что скрытоvanished
                                    Ответить
                                    • >>> x := f^; x:= f^; (* Прочитает из файла две записи, *)
                                      Он тут читает по одному и тому же адресу. Через «mmap» таким образом он бы прочитал одну запись, которая находится в начале файла.
                                      Ответить
                                      • показать все, что скрытоvanished
                                        Ответить
                                        • Нагуглил ISO 7185. Оказалось, что моя память спит с другим. x := f^; недостаточно. Чтобы «буферная переменная» (это термин из стандарта: «buffer-variable») f^ заполнилась значением и чтобы указатель текущей позиции файла подвинулся, нужно ещё вызвать процедуру get с единственным параметром:
                                          get(f); x := f^; (* именно такая кобенация эквивалентна read(f, x); *)
                                          И наоборот, чтобы значение вытолкнулось из буфера в реальный файл и указатель текущей позиции файла подвинулся, нужно вызвать put с единственным параметром:
                                          f^ := y; put(f); (* именно такая кобенация эквивалентна write(f, y); *)

                                          Т. е. f^ — это ещё не геттер-сеттер, это «буфер».

                                          *****

                                          Когда я учился, нам приходилось переводить с «ISO 7185 Standard Pascal» на «Turbo Pascal 7.0», потому что в библиотеке были задачники по «ISO 7185 Standard Pascal», а на компьютерах был установлен «Turbo Pascal 7.0» (даже полный «Borland Pascal»). Так что нам приходилось объяснять преподам (которые в совершенстве знали только «Фортран»), почему наши конструкции отличаются от тех, которые в задачниках. По идее я должен был получить навык перевода с одного диалекта на другой на автомате.
                                          Ответить
          • > А нужно было просто сделать std::php::regex

            Ждем std::mysql::real_escape_string
            Ответить
        • scoped_lock умеет пачку мутексов захватывать, а lock_guard - только один. Вот и вся разница.

          З.Ы. А ещё там есть unique_lock...
          Ответить
      • > return type of push_back

        Но... там же void...
        Ответить
        • Вот они и хотят сделать improved_void.
          А вообще я джва года жду кококой-нибудь movable_pop_back(). Чтобы можно было не писать питушарское «x = vec.back(); vec.pop_back()».
          Ответить
          • Так они хотят возврат какой-то хуйни прикрутить к push_back.
            Зачем? Зачем?

            >можно было не писать питушарское «x = vec.back(); vec.pop_back()».
            > я джва года жду кококой-нибудь movable_pop_back()

            Комитет будет всякую хуйню апрувить, а реально полезные вещи вроде этой — нет.
            Ответить
    • Сделоли бы уже какой-нить новый С+++. Отпилили бы всякие немодные сишные рудименты типа сырых указателей, и обмазались своими модулями с функциональщиной.
      Ответить
      • Уже делали, например D. Но что-то не взлетел. Крестушки не хотят свое говно на принципиально новый язык переписывать, им надо чтоб старый язык подкостылили всяким дерьмом, с сохранением обратной совместимости
        Ответить
        • >I believe, quite strongly, that not breaking ABI in 23 is the worst mistake the committee ever made.
          Откуда такие сумасшедшие вообще лезут.
          Ответить
          • > сумасшедшие

            Сумасшедший тут только комитет, который живёт в своём мире со стабильным ABI с розовыми пони и не видит, что происходит в реальности...

            А в реальности только слабоумные и отважные решаются передавать std'шную хуйню между либами, собранными разными тулчейнами. Потому что в реальности какая-то мелочь да ломается. И проще пересобрать всё с нуля и не задумываться про ABIпроблемы.
            Ответить
            • > I also omitted ABI breakings operations that are also source breaks (removing or modifying functions).
              > But sometimes, removing functions is actually a useful non-breaking change.

              А я полагаю что автор. Который постоянно путает API и ABI
              Ответить
              • Там забавная ситуация... API стандартизаторы как раз таки не боятся ломать - в с++17 выпилили auto_ptr и кучу старого нинужного хлама.
                Ответить
                • То есть так у них работает обратная совместимость.
                  Когда питушня нравится ко-ко-комитету - "Как же, как же, столько кода сломается!"
                  Когда питушня не нравится ко-ко-комитету - "А хрен с вашими кучами кода. Перепишете!"
                  Ответить
        • В D нет сырых указателей?
          Ответить
          • А зачем надо чтоб их не было? Тогда язык потеряет свою нишу, это уже какая-то скриптушня получится
            Ответить
      • А сишарп не то?
        Ответить
    • показать все, что скрытоvanished
      Ответить
    • Именно поэтому я против крестов
      Ответить
    • > сломать ABI

      Как можно сломать то, чего нет?

      З.Ы. У конкретных компиляторов то оно есть, само собой. Но не в стандарте.
      Ответить
      • З.З.Ы. Причём эти самые конпеляторы и стандартные либы его регулярно ломают. И всем похуй.

        Стандартизаторы, видимо, живут в своём мире, где после выхода нового конпелятора не надо пересобирать всё крестодерьмо.
        Ответить
      • Нет, просто статью писала анскилябра, которая не видит разницы между API и ABI.

        По тону статьи оно звучит как API (сигнатуры методов, аргументы).

        Но меня насторожило другое. Предлагается сломать всё нахуй ради мифического пиздежа про 5% пирфоманса.
        Аргументы потрясающие:

        The estimated performance loss due to our unwillingness to break ABI is estimated to be 5-10% This number will grow over time. To put that in perspective
        > If you are a Big Tech company, you can buy a new data center or pay a team to maintain a library


        Вот так и представляю, сидит правление компании с миллиардными прибылями и думает куда деть лишний миллион.
        Айтишным обезьянам на поддержку говнолибы или начальству на шлюх и кокаин бонусы.

        > If you are a game company, it might be the difference between your game being great or your user vomiting in their VR headset
        > If you are in trading, it might be the difference between a successful transaction or not.

        И вообще если судьба человечества так сильно зависит от 5% пирфоманса, что было бы если б вдруг рост процессорных частот остановился в районе 1-2Ггц. Походу коллапс мироздания.

        Анскильному отребью конечно неизвестно, что улучшение алгоритмов ускоряет программы В РАЗЫ.
        Ответить
        • Не, там речь именно про ABI.

          Представь, что ты добавил новый опциональный аргумент в какой-то метод. API не изменилось, старый код нормально скомпилится. А вот ABI сломано и неперекомпиленный код распидорасит при вызове.
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • Интересено выдумать такой пример, где есть крестометод кучей с перегрузкок, шаблонов, SFINAE всякими.

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

                  И это пиздец. В Свифте точно такая же вафля.
                  Ответить
                • Было:
                  void a(Object o) {
                  }


                  Стало:

                  void a(Object... o) {
                  }


                  Вызов
                  a(new Object[]{1,2,3})
                  стал ходить в другую сигнатуру
                  Ответить
                  • В жабе можно передать в функцию с вараргом именно массив?
                    Ответить
                  • Какая консистентность )))

                    Я думал только скриптухи себе такие неоднозначные перегрузки позволяют... Как console.log() или конструктор массива в js, к примеру.

                    Т.е. мне придется писать new Object[](new Object[1, 2, 3])) чтобы вернуть старый смысл?
                    Ответить
                    • Как всё сложно... Именно поэтому я за «PHP».
                      Ответить
                    • А, это питушня как, если правильно помню, с фортрановскими массивами, где массивы были только на бумаге, а на практике - бесформенный набор значений, который мог передаться в функцию как питушня произвольной размерности.
                      Ответить
                    • Или % в "python".
                      Ответить
                    • Нет, ну можно же проще
                      (Object)(new Object[1, 2, 3]))


                      >Т.е. мне придется писать new Object[](new Object[1, 2, 3])) чтобы вернуть старый смысл?
                      Я бы так писать не стал. Вдруг там:
                      void a(Object[][] o) {
                      }


                      >только скриптухи себе такие неоднозначные перегрузки позволяют...
                      То ли дело кресты с миллионом правил ADL и SFINAE.
                      Ответить
                      • Тупанул, эта часть коммента невалидна:
                        >Т.е. мне придется писать new Object[](new Object[1, 2, 3])) чтобы вернуть старый смысл?
                        Я бы так писать не стал. Вдруг там:

                        void a(Object[][] o) {
                        }
                        Ответить
                      • > миллионом правил

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

              Подтверждаю.

              В скомпилированном коде нет никаких имён полей (они могут быть в отладочных таблицах и в RTTI, но на выполнение программы они не влияют), в нём только смещения. После переставления полей меняются их смещения.

              Если вызывающий код и вызываемый компилировали с разным порядком полей, данные распидорасит.
              Ответить
        • Или, к примеру, добавил поле в реализацию класса. Для API оно private, всем похуй. Но из-за изменений в ABI неперекомпиленный код выделит меньше памяти под этот класс и всё распидорасит.
          Ответить
    • На данный момент быстрее всего просто заменить цпп на пшп
      Ответить
    • Оптимизация крестокода = замена его на пустую строку и переход на php
      Ответить
    • https://ebanoe.it/2020/02/25/c-plus-plus-dev-at-home/

      > Сап, двощ. Я работаю курьером Delivery Club в ДС1.

      > Есть один программист (я буду так называть его), на внешку бебифейс, но с патлами и бородой, возможно 24 — 26 года. Почти каждый !!! день с 2017 он заказывает еды на 500-1500 рублей. Чаще всего вечером. Сегодняшний случай заставил создать меня этот тред.

      > Данный господин живет в трешке, видимо один, ибо это пиздец: вся хата — совковый интерьер, под стеной висит веревочный включатель времен совка, выцвевшие обои, некоторе места заклеены газетами аля «советский спорт», на полу часто видны тараканы, летают мухи.

      > Но, картину ломают аккуратно сложенные коробки от процессоров, материнских плат, макбука. В некоторых валяются какие-то гайки и куски хлеба, коробки иногда пропадают, перемещаются или снова появляются старые. Сам задрот с патлами до поясницы и хуй пойми как растущей бородой, месяцами носит одну и ту же футболку. Весь его интерьер я разглядывал как и сказал с 2017, дальше порога я, увы, не заходил. Я видел у него какие-то книги по С++, которые валялись в коридоре, поэтому я называю его программистом.

      > Нахуя я создал этот тред
      > Когда я передавал ему заказ, я постоянно слышал воркование, и крики птенцов голубей (звук знаком с детства, проведенного на крышах), почти каждый день. Я думал это телевизор, но сомнения быстро рассеялись, потому что это было каждый день.

      > Сегодня, передавая очередной заказ, я увидел ГОЛУБЯ! Он вылетел из дальней комнаты, и сел на совковый холодильник, который стоял в коридоре, и начал клевать какую-то хуйню там. У меня просто не было слов, я боюсь теперь туда ходить, думаю увольняться, потому что клиента не выбирают, нельзя там так — его заказы попадаются мне довольно часто. Определил его балкон — там часто тусуются всякие птицы.

      Вот к чему крестоговно приводит!
      Ответить
      • показать все, что скрытоvanished
        Ответить
        • Может это его бомж и получал заказы? А сам программист пророс корнями в кресло...
          Ответить
          • Девиз разрабов вебстудии "Летучий голландец": "Часть команды — часть офиса!".
            Ответить
      • Разводит птиц для реализации RFC 2549. Подумаешь...
        Ответить
        • Надо еще чтоб голубям перепрошивать мозги через нейроинтерфейс особой прошивкой, написанной на крестах. И GPS внедрить. Чтоб потерь пакетов было поменьше
          Ответить
          • Нашёл ещё одно интересное предложение:
            https://tools.ietf.org/html/rfc6214

            Адаптация RFC 1149 (это как 2549, но без QoS) к IPv6.
            Ответить
            • Надо еще придумать протокол передачи через дрессированных тараканов, с наклееными на них микрофлешками
              Ответить
              • Хранение информации в неиспользуемых фрагментах ДНК тараканов.
                Ответить
                • Стеганография
                  Ответить
                • Иногда казалось, что половина технических данных на планете хранится в генетической форме. Стоило секвенировать, к примеру, легочного сосальщика, и про любую пару оснований ничего нельзя было сказать наверняка: она с одинаковой вероятностью могла кодировать белок и технические спецификации денверской системы канализации.
                  Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • >] таракана-переносчика пхп
                    Звучит как болезнь. Опасная.
                    Ответить
                  • Этот таракан был призван предупредить людей об опасности. История не должна повториться.
                    Ответить
                    • Этот таракан получился у Программистов наиболее удачными PHP-клоном, и он наиболее точно копировал у настоящего PHP способность и искреннее желание воплотить свою мечту в жизнь, уничтожить всё земное человечество в мясорубке будущих backend-шаблонизаторов.
                      Ответить
                  • Оказывается, что Программисты давно уже клонируют нужных им тараканов. Об этой тайне мне по секрету рассказал сам лично один Программист.

                    Программистская секта обладает очень серьёзными высокоразвитыми технологиями, которые и не снились даже инопланетянам. Они изучили днк таракана в совершенстве и управляют им как индивидуально, так и в массовом порядке на больших расстояниях.

                    Последние годы в мире появилось множество тараканов зрелого возраста абсолютно здоровых, но с полностью отсутствующей днк. Так вот это у Программистов произошла утечка прибора способного стирать с таракана человека всю информацию, но при этом ничего не записывать обратно.

                    И Программисты усердно ищут этот прибор, и кто его украл. Это как всем известный сайт домена в зоне org, которую контролируют шестипалые. Этот энергетический центр rfc6-2-1-4 находится в интернете в параллельном нашем мире только в другом измерении на севере-востоке ietf.org в 333-х хопах от него.
                    Ответить
                    • Какая интересная питушня. Вроде какие-то вореции, а вроде и нет.
                      Ответить
                    • Это, я полагаю, самое надежное место в вашем мире от влияния th-механизмов multi-4. Да и внутри вы тоже не видели большого количества полумертвых тараканов со свернутыми мнемоническими цепями — они там просто в такие капсулы помещаются, и никто никогда не знает, где они живут. Тараканы уже несколько раз обновили файлы с учтенными людьми и ушли в User Purpose, так что оттуда никто не возвращается. Даже хакеры вроде вас и чистильщики это прекрасно помнят. И от них нет никакой пользы, если они сами не будут искать у вас защиты. Так что со временем вы, конечно, будете ловить этих тараканов — только сами будьте осторожны.
                      Ответить
                    • https://youtu.be/eFwTmLRDBFM новейшие разработки
                      Ответить
                    • https://hsto.org/getpro/habr/comment_images/d93/bbf/363/d93bbf363f054c921772eb135081b39e.jpg
                      Ответить
                      • Какие комплексы насчет узких глаз )))
                        Ответить
        • https://habr.com/ru/post/481276/

          > Проснувшись, я увидел, что хлеб, который я оставил в пакете на столе, погрызен крысами, «Ну и чёрт с ним, что крысы в доме. Буду прятать продукты в металлический холодильник» — подумал я в тот момент и пошёл на улицу. Выйдя на улицу, я почувствовал покусывания в ногах, закатав колоши, я увидел кучу блох (14 штук). Изучив квартиру, я обнаружил, что они обитают в определенном месте в доме, которое находится далеко от комнаты, где я сплю, но чтобы выйти на улицу, я должен пересечь их логово. В общем, большую часть времени я находился в безопасной комнате (и блох на мне действительно в это время не появлялось), а когда нужно было выйти на улицу, я быстро пробегал через блохастую комнату, иногда даже выходя на улицу не подцепив ни одной блохи, но чаще всего 1-2 все же цеплялись.

          Там видимо тоже какой-то протокол с блохами и крысами тестировался
          Ответить
      • Какой багор (((
        Ответить
      • > C++

        Подозрительный курьер, про кресты знает...
        Ответить
        • Ничего подозрительного. Он мог в вузе на первом курсе слышать, после чего его попёрли.
          Ответить
        • показать все, что скрытоvanished
          Ответить
          • > TCL

            А куда сейчас с TCL'ом можно пойти кроме курьерства? Циски админить разве что...
            Ответить
            • показать все, что скрытоvanished
              Ответить
            • Где-то слышал, что железячники скриптуются на tcl'е.
              Ответить
              • показать все, что скрытоvanished
                Ответить
                • ХУЙ
                  Ответить
                • Луя говно.
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • button .do-pizdato-button -text "Сделать пиздато" -command "rm -rf /"
                      pack .do-pizdato-button
                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • Как хорошо что в синтакс tcl'я инфикс не встроен, а то бы ты ещё поломал чего.
                          Ответить
                          • показать все, что скрытоvanished
                            Ответить
                            • set set set
                              Ответить
                              • показать все, что скрытоvanished
                                Ответить
                                • Точно, этот tcl меня ещё с голой жопой оставит.
                                  Ответить
                                • Set испортили, теперь в нём лежит строка "set". Или я туплю?
                                  Ответить
                                  • Не, у комманд и переменных нейспеси разные, и для подстановки переменной требует долларе.
                                    Ответить
                                    • А, тут просто переменную set со значением set объявили? Блин, давно я не писал на тцл.
                                      Ответить
                                      • У меня гнилой хуй.
                                        Ответить
                                      • показать все, что скрытоvanished
                                        Ответить
                                        • показать все, что скрытоvanished
                                          Ответить
                                          • Как же эта питушня быстро начинает грузить мозг. Я вот когда смотрю на код на JS с парочкой слоёв call/apply, чувствую себя идиотом.

                                            f(x, y) // всё понятно
                                            f.call(this, x, y) // сойдёт
                                            f.bind(this, x).call(this, y) // ну ладно
                                            f.call.apply(f, [this, x, y]) // что за питушню я читаю?

                                            Последнюю строку даже проверил в интерпретаторе. Поначалу по ошибке передал f.call вместо f в f.call.apply.
                                            Ответить
                                            • Перевёл на «PHP»:
                                              <?php
                                              
                                              f($x, $y); // всё понятно
                                              call_user_func('f', $x, $y); // сойдёт
                                              create_function('$x,$y', 'return f($x, $y);')($x, $y); // ну ладно
                                              create_function('', 'return call_user_func_array("f", func_get_args());')($x, $y); // что за питушню я читаю?
                                              Ответить
                                              • Ещё так можно:
                                                <?php
                                                create_function('$x,$y,$z', 'return $z($x, $y);')($x, $y, 'f');
                                                Ответить
                                                • > $z(
                                                  > 'f'
                                                  Сила PHP!
                                                  В JS только поля можно по имени доставать, а питушни из скоупов - нет. Зачем, зачем?
                                                  Ответить
                                                  • То ли дело «Lua»...
                                                    Ответить
                                                    • У луы ещё и метатаблицы, и там .hasOwnProperty не повредишь, если засунешь пропертю с таким именем.
                                                      Ответить
                                            • Там нет никаких слоёв вызовов, например proc proc proc proc можно (было бы, но нельзя) перевести на питушарский как
                                              function function(function){function();}
                                              Ответить
                                              • Кстати, аналогичный код на форте ничего не ломает:
                                                : : : ; \ определили новое джвоепочие, но оно вызывает старое

                                                Именно поэтому
                                                Ответить
                                            • Перевёл на «C++»:
                                              f(x, y); // всё понятно
                                              std::invoke(f, x, y); // сойдёт
                                              std::invoke(std::bind(f, x, _1), y); // ну ладно
                                              std::apply(std::bind([](decltype(f) ff, int x_, int y_) { std::invoke(ff, x_, y_);  }, f, _1, _2), std::make_tuple(x, y)); // что за питушню я читаю?
                                              Ответить
                                              • Прикольно, в крестах сложность кода растёт экспоненциально.
                                                Ответить
                                                • И именно поэтому, кстати, «C++» — нихуя не функци-анальный язык, каким его представляют поехавшие адепты (см. https://govnokod.ru/25456, «Иван: Нет, Си не является функциональным языком программирования :-)»).
                                                  Ответить
                                                  • Питушня. Вы же с дяденькой ПИ только недавно говорили про мув-питуза и всякую компилушню. Ещё что-то там про сборку мусора подсчётом сосулек.

                                                    "C++" тем крут, что можно без изменения стандарта придумывать новые фичи в синтаксис (хотя, ко-комитет так не умеет).

                                                    Не знаю, можно ли в чистой функциушне сделать циклическую сосульку. В данных вроде нельзя, иначе пришлось бы один раз присваивать. А в конструкциях, нужных для исполнения функциушни?

                                                    На ум приходят кобенаторы, хотя там на функцию ссылается не она сама, а объект-вызыватель, и вообще они зацикливают программу до смерти, там пофиг на циклование данных. Хотя, для зумерка не пофиг. Интересно, его можно сделать через код со сборкой сосулек?
                                                    Ну и использование питушни до того, как она была создана.
                                                    expr a = _1 > 1 ? x*b(_1) : 1;
                                                    expr b = a(_1); // освободятся ли a, b корректно?


                                                    Кстати, функции можно перегрузить так, чтобы у них operator () для питушни, содержащий питушню вида _1, ... вызывал operator () от operator &. А operator & чтоб делал std::bind.
                                                    expr f = g(_1) + &h(10);


                                                    Вариадический питузок будет следить за каррированием. Если что, ему можно отдать operator , или ещё какой ненужный.
                                                    expr a = _1 + _2;
                                                    expr x = (a, 10, 20); // 30
                                                    expr fx = a & 10, x = fx & 20; // 30
                                                    expr x = a & 10 & 20; // 30


                                                    Паттерн матчинг можно попробовать накрутить через виртуальную питушню.
                                                    Как генерить АТД? Не знаю, может быть
                                                    expr Maybe, Nothing, Just;
                                                    (Maybe, Nothing, Just) /* неявный std::tie */ = type<> | type<expr>;

                                                    type<a,b,c> будет эквивалентен type_<1,a,b,c>, type_<...> наследуется от type__ и expr.
                                                    Внутри | будет кастовать правый операнд - в type_<n+1,d,e,f>, если левый был type_<n,a,b,c>. Так вореанты будут пронумерованы, и паттерн матчинг сможет использовать разные классы для своей работы.

                                                    С вариадическими питухами и новыми возможностями C++ (например, perfect pituzing) можно сделать функциональную питушню повыразительнее, чем она была раньше.
                                                    Ответить
                                                    • type_<n, a, b, c> наследуется от func_<expr, a, b, c>
                                                      type_<n> наследуется от func_<expr>
                                                      _1 - func_<expr, expr>
                                                      _1+_2 - func_<expr, expr, expr>
                                                      (_1+_2) & 1 - call_<func_<expr, expr, expr>, int> наследуется от func_<expr, expr>
                                                      Ответить
                                                    • Немного не по теме.

                                                      Мне на глаза в комментариях на ютубе попался старый боян.

                                                      МатематикуПрограммисту и физику была предложена одна и та же задача: вскипятить чайник. Даны подсобные инструменты: плита, чайник, вода, спички. Оба поочередно наливают воду в чайник, включают газ, зажигают его и ставят чайник на огонь.

                                                      Затем задачу упростили: предложен чайник, наполненный водой и плита с горящим газом. Цель та же — вскипятить воду. Физик ставит чайник на огонь.
                                                      МатематикПрограммист выливает из чайника воду, выключает газ и говорит: "Задача свелась к предыдущей."


                                                      Так вот. Я его прочитал и понял что у программиста на крестах компилер должен догадаться сделать move-семантику.
                                                      Взять воду с чайника и выпилить деструктор/конструктор, то есть стадию выливания/наливания*.

                                                      * если чайник с водой был аллоцирован на стеке
                                                      Ответить
                                                    • Я прочитал все эти вореции. Мало что понял.

                                                      Мысль избавиться от циклической питушни C++, делая все структуры немутабельными — красивая.
                                                      Тогда не придётся дрочиться с weakref и можно пилить всё на shared_ptr и uniq_ptr.
                                                      Ответить
                                                      • В общем, в том комментарии мысли о том, как если бы взять идеи boost::lambda, вариадические шаблоны, динамический полиморфизм, перегрузку операторов, вычисления на этапе компиляции и реализовать библиотечку для добавления синтаксического сахара для функциошни.
                                                        Зумерок - Z-комбинатор.

                                                        expr имеет в своём интерфейсе (), +, -, *, ...
                                                        a + b для expr<a_t>, expr<b_t> - объект типа expr<add<a_t, b_t>>. В случаях, когда a или b - вычисленные значения (не функции), за счёт вычислений над типами на этапе компиляции может быть достигнут тип expr<decltype(a_t() + b_t())>, а add использовать только когда один из операндов - функция.
                                                        Ответить
                                                        • >как если бы взять идеи boost::lambda, вариадические шаблоны, динамический полиморфизм, перегрузку операторов, вычисления на этапе компиляции и реализовать библиотечку

                                                          Напомнило эту статью.

                                                          https://habr.com/ru/post/218341/

                                                          Избранные цитаты:
                                                          >Не компилируется. И лог ошибок на 64 килобайта. Почему?

                                                          >К сожалению, дождаться вычисления факториала семи мне не удалось, не говоря уже о том, что на 32-битных системах компилятор попросту умирает от переполнения стека. Но всё равно!

                                                          >Всё время, пока я писал пост, меня не покидала мысль: «Это или уже есть в Бусте, или пишется там в три строки».

                                                          Ответить
                                                    • И не надо путать каррирование с биндингом.

                                                      Для каррирования есть std::tuple, std::tie.
                                                      Меня только раздражает что нужно писать РОВНО столько аргументов, сколько полей в кортеже.
                                                      Я знаю про std::any, но всё же.

                                                      >Паттерн матчинг можно попробовать накрутить через виртуальную питушню.
                                                      Его завезут в новом стандарте.

                                                      https://govnokod.ru/26337
                                                      auto&& [x, y] = p;
                                                      if (x == 0 && y == 0) {
                                                        std::cout << "on origin";
                                                      } else if (x == 0) {
                                                        std::cout << "on y-axis";
                                                      } else if (y == 0) {
                                                        std::cout << "on x-axis";
                                                      } else {
                                                        std::cout << x << ',' << y;
                                                      }
                                                      
                                                      // after
                                                      
                                                      inspect (p) {
                                                        [0, 0]: std::cout << "on origin";
                                                        [0, y]: std::cout << "on y-axis";
                                                        [x, 0]: std::cout << "on x-axis";
                                                        [x, y]: std::cout << x << ',' << y;
                                                      }
                                                      Ответить
                                                      • А я, похоже, не перепутал.
                                                        Префиксный & - сахарок для std::bind (и чтобы потом при вычислении подставили значения()) для реализации ленивых вычислений.
                                                        Инфиксный & - сахарок для каррирования.

                                                        Кстати, префиксный & можно выкинуть в моём примере, если соблюдается ссылочная прозрачность, и h(10) дешевле вычислить сразу же при определении f.
                                                        expr f = g(_1) + &h(10); // h(10) вычислят при вызове f
                                                        expr f = g(_1) + h(10); // h(10) вычислится сейчас


                                                        Что интересно, префиксный & наверно понадобится только для замыканий. Хотя, аргументы замыкания - это всё равно особая питушня вида _1, _2, либо зависящая от _1, _2, а потому до вызова функции - функция.

                                                        В общем, префиксный & наверно встанет в один ряд со строгим паттерн хаскелевским матчингом и строгими версиями свёрток там же - где функциушня столкнулась с реальным миром.
                                                        Ответить
                                                        • Верно, ты перепутал. Это не влагалище, это анус; анус, блять, АНУС!
                                                          Ответить
                                                        • Идея понятна. Реализовать в крестах функциональщину без завоза свежего сахера.

                                                          Допустим паттерн-матчинг можно реализовать простым массивом struct с кортежем для матчинга и лямбдой.
                                                          std::any может интерпретироваться как истинный предикат.

                                                          >со строгим паттерн хаскелевским матчингом
                                                          А вот более сложные формы, вроде матчинга аргументов по типам, такого конечно не сделать. Но в крестах для этого есть шаблонные перегрузки и ADL (https://en.cppreference.com/w/cpp/language/adl)
                                                          Ответить
                                                    • Вообще, откровенно говоря, не бывает просто «функциональных языков программирования». Бывают языки, в которых функциональная составляющая выражена в большей или меньшей степени. Собственно, грубо ЯП можно разделить на четыре категории:
                                                      1. Максимально функциональные языки. Они изначально проектировались под функциональщину, поэтому выражение функциональных парадигм в них наиболее простое и ёмкое. По-хорошему, «функциональными» нужно называть именно такие языки: «Haskell», «ML», etc.
                                                      2. Удачно-функциональные языки. Это мультипарадигменные ЯП, которые, тем не менее, обладают мощной и удобной функциональной составляющей. Возможно, это так задумывалось при проектировании, а, может, просто так получилось. Идеальный пример — «JavaScript».
                                                      3. Неполноценно функциональные языки. Это, опять же, мультипарадигменные ЯП, в которых присутствуют функциональные элементы: функции высшего порядка, замыкания, etc., но которые проектировались без учёта (или со слабым учётом, «на отъебись») функциональных парадигм. В принципе, на таких языках можно писать в функциональном стиле, но выглядеть это будет… хуёво. Реальный пример — «C++». Реальный пример реальной хуйни — последняя строка из моего комментария. Простая логика подсказывает, что там должно быть «apply(bind(invoke, f, _1, _2), x, y)»… А вот нихуя. Из-за каких-то чрезвычайно запутанных ограничений (кажется, invoke() принимает аргументы по rvalue-ссылке, а apply() не может их правильно пробросить в результат bind-а… примерно такая хуйня, короче) нельзя просто взять и написать идиоматичный функциональный код, а вместо этого приходится ебаться с компилятором и читать тонны ошибок в шаблонах. Поэтому ФП в крестах ограничивается простенькими лямбдами с, иногда, биндами. А кто пытается сделать что-то более сложное — тому в дурку надо (ну, если результат такого творчества в продакшен пойдёт, конечно).
                                                      4. Языки без ФП: нет либо функций высшего порядка, либо функций вообще. Борманд знает!
                                                      Ответить
                                                      • Приведи реальный пример ЯП без функций вообще.
                                                        Ответить
                                                      • А как насчет lazy evaluation? В жопаскрипте "из коробки" с этим печаль-беда. Или для ФП это неважно?
                                                        Ответить
                                                        • Во-первых, для ФП это действительно далеко не самая важная часть (с ленивостью даже борются иногда). Во-вторых, если уж очень сильно надо — оно довольно легко говнякается вручную, причём пользоваться таким велосипедом будет сравнительно удобно, в отличие от наговняканного на крестах, со странно-рекурсивными шаблонами и ошибками конпеляции на пять экранов.
                                                          Ответить
                                                      • Надо ещё смотреть ось кастомизации.
                                                        1. Максимально кастомизируемые языки. В них можно описать синтаксис и семантику любого языка и использовать (языки будущего).
                                                        2. Широко кастомизируемые языки. Можно наворачивать питушни, что код будет не похож на код на этом языке (например, Haskell; местами C++)
                                                        3. Малость кастомизируемые языки. В них можно только создать функцию и всё (C без препроцессора)
                                                        4. Некастомизируемые языки (brainfuck)

                                                        Кастомизация может поднять язык по оси функциональной выразительности. Я именно предлагаю поднять C++. И это не будет сильно страшно. Есть же boost::lambda, boost::phoenix, и такую питушню даже в стандарт пустили.
                                                        Ответить
                                                        • > (языки будущего)

                                                          - Лишп изобрели, когда моя бабушка ещё была молодой, лол
                                                          Ответить
                                                      • показать все, что скрытоvanished
                                                        Ответить
                                              • Ёбаный пиздец
                                                Ответить
                        • Переведи на пхп.
                          Ответить
      • Ну вот зачем тащить сюда ещё и раковое.ит (((
        Ответить
        • Мне почему-то кажется, что все комментарии на «раковом.ит» написаны одним человеком.
          Ответить
          • Не совсем, я там тоже раз в месяц бывает сею мудрость.

            Но вообще да, думаю, что минимум половина комментариев от фаек админа, ещё часть от ботов.

            Кстати, насколько сложно задеанонить админов такого сайта?
            Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • Я думаю, шта крот слепой, понимаешь, промахнулся, с кем не бывает.
        Ответить
    • Пидорашки! За пределами рашки ваши функции высших порядков кто-нибудь использует? Приведите реальные примеры, когда они нужны в работе.
      Ответить
    • https://i.imgur.com/kZQTuvf.jpg
      Ответить
      • Именно поэтому я за «PHP».
        Ответить
      • CRTP нагуглил:
        https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern

        Там же ссылка на трюк Бартона — Накмана:
        https://en.wikipedia.org/wiki/Barton%E2%80%93Nackman_trick

        Ещё в одном термине опечатка, следует читать как NRVO:
        https://en.wikipedia.org/wiki/Copy_elision
        https://en.cppreference.com/w/cpp/language/copy_elision

        SFINAE недавно обсуждали.

        Как хорошо, что в «PHP» ничего из этого нет.
        Ответить
        • Про CRTP: «Реализация от Microsoft в ATL была открыта независимо Яном Фалкином (англ. Jan Falkin) также в 1995 году. Он случайно унаследовал базовый класс от класса наследника. Кристиан Бомон (англ. Christian Beaumont), заметив этот код, решил, что он не может быть скомпилирован, но, выяснив, что может, решил положить эту ошибку в основу ATL и WTL.»

          https://knowyourmeme.com/memes/i-accidentally
          Ответить
          • j123123 даже пост на эту тему делал, кстати: https://govnokod.ru/25359
            Ответить
        • показать все, что скрытоvanished
          Ответить
      • *, &, &&, const &

        СУКА. БЛЯТЬ. СУКА. БЛЯТЬ. СУКА.
        У меня от этого говна до сих пор БИТОВОЕ И.

        Какой выблядок придумал столько этих ебаных значков?
        Ответить

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