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

0

  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 j123123, (Updated )

Комментарии (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-Неимоверной-Крутизны-С-Правом-Ковырять-В-Носу-В-Присутствии-Августейшего, если он почувствует эту неимоверную крутизну в кругу таких же дураков, преисполнится благодарности, и никогда не перейдет к другим языкам программирования. Как по моральным, так и по материальным причинам.
        Ответить
        • Поиграется с этим калькулятором и забьёт. Язык то может и хороший, но стандартной либы у него явно нет.
          Ответить
            • у пхп нет спецификации, и именно потому у него богатая стандартная либа с mysqli_real_escape_string
              Ответить
              • И то верно.

                А у «Оберона» спецификация чуть ли не на одной странице. Вру, одна страница на синтаксис, 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 впишутся, если описания слов/функций оставить за кадром.
            Ответить
              • асемблеры разве что у z80.

                у современнных интелов третьим томом девелопер гайда убить можно
                Ответить
                • Поди защита и аппаратная многозадачность много весят? Или всякие SIMD?
                  Ответить
                  • Ну в томе с инструкциями - однозначно SIMD. А в томе для системщика одной виртуализации страниц на 500...

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

                    хотя, частично все таки наверное надо, хотябы чтб понимать как переключаются кольца защиты
                    Ответить
                    • Там ещё 64-битный режим на отъебись описан, в своё время пришлось вместе с amd'шной докой читать.
                      Ответить
            • Нельзя синтакс от слов отделять, слова тоже часть языка. Просто в большинстве остальных языков "слова" типа ключевых слов, операторов и пр. захардкожены в синтаксисе.
              Ответить
            • Нет, не влезет. Там одно только простое описание опкодов «JVM» в пару страниц с очень большим скрипом (и мелким шрифтом) влезет, и то не факт. А уж стандартная библиотека (тоже, между прочим, важная часть языка) — тут, как говорится, без комментариев.
              Ответить
            • Хуй там.

              Рекомедую попробовать ужать хотя бы JLS хотя бы на десяток A4.
              Ответить
            • Да нет, JLS и JMM достаточно большие, ну и либа стандартная, как правильно сказал гост.

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

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

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

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

          Именно поэтому я за Си - там комитет почти нихуя не меняет
          Ответить
          • Если в языкe за 10 лет практически ничего не меняется, значит он уже близок к совершенству.
            Ответить
                • В «Standard Pascal» (ISO, ANSI) ничего из этого нет. Всё это есть в «Object Pascal» — по сути в новом языке, который придумали в «Борланде», а остальные подхватили.

                  «Object Pascal» от «Standard Pascal» отличается примерно как «C++» или «Objective C» от «Plain C».
                  Ответить
                    • Про «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 июня вышла новая версия.
                  Ответить
                  • Я за awk. С 85-го года примерно не меняется
                    Ответить
                      • Сразу видно, что он сисадмин с 1985-го года
                        Ответить
                        • О-ху-ен-но.

                          Я всегда говорил что ed и его производные — выбор скилльных пацанов.
                          Ответить
                          • На какой слог ударение в слове «скилльный»?
                            Ответить
                        • Господи, я запустил, а оно нарисовало полноценную доску и даже клеточки. КЛЕТОЧКИ!
                          Какой 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 альтернативно трактуют те или иные сложнореализумые правила. Вроде рокировки, выбора фигуры превращения и взятия-на-проходе.

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

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

                                Судя по коду полагаю что король просто пойдёт под бой, где его можно будет съесть. Что впрочем соответствует очень старым правилам, где и «пат», и «мат» считались победой.
                                Ответить
                      • $ awk -F: '/nologin/{A++; print $(NF-1)};  END{print A}' /etc/passwd
                        Ответить
                  • > Я про тот Паскаль который не меняется уже лет 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», при этом поддержали несколько разных процессоров.
                      Ответить
                        • Оказывается, эти фишки «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» был бы, если б под файл contiguous кусок памяти выделялся, а тут прямо натуральное высирание в замапленный порт.
                                Ответить
                                • какой порт? Питуз откыл файл, и получил указатель на "файл", разыменовал ево, и получил данные
                                  не?

                                  Роботоет с файл, как с памитью
                                  Ответить
                                  • >>> x := f^; x:= f^; (* Прочитает из файла две записи, *)
                                    Он тут читает по одному и тому же адресу. Через «mmap» таким образом он бы прочитал одну запись, которая находится в начале файла.
                                    Ответить
                                    • А вот тут он всё слурпнул
                                      x := f^; { эквивалентно Read(f, x); }


                                      но я согласен, что если чтение из одново и тово же адерса дает азные результаты (ид импотентно или как по умному сазать) то это ммио
                                      Ответить
                                      • Нагуглил 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...
        Ответить
      • Вот они и хотят сделать 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 и кучу старого нинужного хлама.
              Ответить
              • То есть так у них работает обратная совместимость.
                Когда питушня нравится ко-ко-комитету - "Как же, как же, столько кода сломается!"
                Когда питушня не нравится ко-ко-комитету - "А хрен с вашими кучами кода. Перепишете!"
                Ответить
        • А зачем надо чтоб их не было? Тогда язык потеряет свою нишу, это уже какая-то скриптушня получится
          Ответить
      • Хороший язык, мне нравится. В исследовательском отделе лежит аффидевит на более глубокое изучение.
        Ответить
        • Не знаю как в 2020, но 10 лет назад надо было читать "CLR via C#" Джефри нашего Рихтера (того самого, что про програмирование под винду писал).

          Самая охуенная книга про шарпы, например
          Ответить
      • Это такой вариант жабы от мелкософта. Для микроконтроллеров непригоден, так что отправляется нахуй
        Ответить
        • Ну кстати в отличие от жабы, c# умеет value objects и гораздо более простой интероп с сями (PInvoke)
          Ответить
          • Всё хуже, уже есть аналог ардуины с js на борту. Подумаешь, проц в 10 раз мощнее пришлось поставить.
            Ответить
            • Для сисярпика кстати был .NET Micro Framework, а сейчас это бессмысленное и беспощадное дело продолжает nanoFramework.
              Ответить
            • еще бы флешку туда гигов на восемь для .node_modules
              Ответить
              • В «PHP» нет никаких .node_modules, там все нужные функции из коробки. Именно поэтому я за «PHP».
                Ответить
                • А если каких-то нет, то можно их написать, положить в fynkcii.php, и скопировать тотал коммандером на сервер

                  как там ваш гомпозер, кстати? тоже качает гигабайты?
                  Ответить
                  • Компостер для хипстеров всяких. Настоящие пэхапэшники вроде «Конардо» им не пользуются.
                    Ответить
          • Это всё хуйня тупая, которая сжирает ценные ресурсы контроллера, так что оно нахуй не нужно
            Ответить
            • зато позволяет писать макакам
              макаки си не знаюит: там байтики какие-то, хуяйтики
              Ответить
              • Нахуй не нужно, чтоб всякие макаки своими кривыми руками лезли в контроллеры. Разве что для школоты/студентоты анскильной подойдет, а для серьезных вещей это хуйня полная
                Ответить
                    • Кек! Обезьяньи наши руки. Под воздействием науки только дети или внуки станут, может быть, людьми.
                      Ответить
                        • ну там бы скорее был function, чем def всё таки
                          Ответить
                        • > В 2003 году Совет по искусству Англии решил доказать теорему на практике. Совет профинансировал шесть обезьян с целью выяснить, сколько им потребуется времени, чтобы напечатать сочинения Шекспира. Через полгода обезьянам не удалось набрать ни одного слова по-английски, они разломали компьютер и изгадили клавиатуру )))
                          Ответить
                          • Дык мало обезьян и мало времени... Надо было дождаться пока обезьяны создадут новую цивилизацию, изобретут компы и начнут печатать свои книги.
                            Ответить
                • Ты опоздал лет так на 6, когда сделали Arduino Yun как раз для этого.
                  Ответить
                  • Ну так я не отрицаю что подобное говно существует. Просто это тупая хрень для школоты и анскиллябр заедушных
                    Ответить
      • C# - это язык для богов
        а так как существование бога никому пока не удалось доказать,
        Ответить
  • Омг, сова хуёво натягивается на глобус
    Верните мне С++2003 пожалуйста
    Ответить
  • > сломать 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 сломано и неперекомпиленный код распидорасит при вызове.
        Ответить
        • у жабоёбов есть охуенный пример на эту тему.
          было
          void sosat(Petuh petuh) {
          }

          стало

          void sosat(Petuh... petuh) {
          }

          Апи остался прежним, а аби -- нет, бо варарг это массив под капотом. И всем пизда.

          Кстати, если я в няшной поменяю местами поля у структуры, то сломается ли аби? Там же смещение другое будет?
          А у жабы сломается, интересно?
          Ответить
          • Интересено выдумать такой пример, где есть крестометод кучей с перегрузкок, шаблонов, SFINAE всякими.

            И добавление новых аргументов не то чтобы ломает программу. Но заставляет вызываться другой перегруженный метод.
            Ответить
            • Старый код, который эту функцию вызывал, продолжает компилиться и работать. Т.е. 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])) чтобы вернуть старый смысл?
                  Ответить
                  • А, это питушня как, если правильно помню, с фортрановскими массивами, где массивы были только на бумаге, а на практике - бесформенный набор значений, который мог передаться в функцию как питушня произвольной размерности.
                    Ответить
                  • Нет, ну можно же проще
                    (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) {
                      }
                      Ответить
                    • > миллионом правил

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

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

            В скомпилированном коде нет никаких имён полей (они могут быть в отладочных таблицах и в 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, дальше порога я, увы, не заходил. Я видел у него какие-то книги по С++, которые валялись в коридоре, поэтому я называю его программистом.

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

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

    Вот к чему крестоговно приводит!
    Ответить
    • пока ждешь компиляции шаблонов не то, что голуби, бомжи заведуца
      Ответить
      • Может это его бомж и получал заказы? А сам программист пророс корнями в кресло...
        Ответить
        • Девиз разрабов вебстудии "Летучий голландец": "Часть команды — часть офиса!".
          Ответить
      • Надо еще чтоб голубям перепрошивать мозги через нейроинтерфейс особой прошивкой, написанной на крестах. И GPS внедрить. Чтоб потерь пакетов было поменьше
        Ответить
          • Надо еще придумать протокол передачи через дрессированных тараканов, с наклееными на них микрофлешками
            Ответить
            • Хранение информации в неиспользуемых фрагментах ДНК тараканов.
              Ответить
              • Иногда казалось, что половина технических данных на планете хранится в генетической форме. Стоило секвенировать, к примеру, легочного сосальщика, и про любую пару оснований ничего нельзя было сказать наверняка: она с одинаковой вероятностью могла кодировать белок и технические спецификации денверской системы канализации.
                Ответить
              • После ядерной войны только они и выживут, и на протяжении многих поколений будут хранить в своем днк все знания человечества, чтобы редкие выжившие и деградировавшие люди смогли бы потом эти знания восстановить.

                Главное найти таракана-переносчика знаний о пхп, и стерилизовать
                Ответить
                • >] таракана-переносчика пхп
                  Звучит как болезнь. Опасная.
                  Ответить
                • Этот таракан был призван предупредить людей об опасности. История не должна повториться.
                  Ответить
                  • Этот таракан получился у Программистов наиболее удачными PHP-клоном, и он наиболее точно копировал у настоящего PHP способность и искреннее желание воплотить свою мечту в жизнь, уничтожить всё земное человечество в мясорубке будущих backend-шаблонизаторов.
                    Ответить
                • Оказывается, что Программисты давно уже клонируют нужных им тараканов. Об этой тайне мне по секрету рассказал сам лично один Программист.

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

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

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

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

        Там видимо тоже какой-то протокол с блохами и крысами тестировался
        Ответить
        • у меня в детстве не было блох, потому никакого языка не придумал
          Ответить
      • Ничего подозрительного. Он мог в вузе на первом курсе слышать, после чего его попёрли.
        Ответить
      • Кажется, что про кресты слышали и нормальные люди.
        Вот если бы он TCL слышал например, или про Ocaml, то сразу былоб понятно, что нихуя он не курьер
        Ответить
        • > TCL

          А куда сейчас с TCL'ом можно пойти кроме курьерства? Циски админить разве что...
          Ответить
          • DBAшничать еще можно
            https://www.postgresql.org/docs/11/pltcl.html

            tcl у кисок же примерно как ш у прыщей, да? для скриптушни автоматизации?

            я, к стыду своему, никогда его там не использовал
            Ответить
            • да, его автор вроде тож име отношение к железу


              эй! кто может что-то умное спизднуть на тему lua vs tcl?
              Ответить
                • а ты тисиэльщик? а ну-ка, скажи чонить по тисиэльному
                  Ответить
                  • button .do-pizdato-button -text "Сделать пиздато" -command "rm -rf /"
                    pack .do-pizdato-button
                    Ответить
                    • это ты кнопучку в тикей нарисовал?)

                      вообще давайте течь от tcl?
                      % proc 2 "x y" "puts 5"
                      % 2  + 2
                      % 5
                      Ответить
                      • Как хорошо что в синтакс tcl'я инфикс не встроен, а то бы ты ещё поломал чего.
                        Ответить
                        • поломал всё к хуям, проверь
                          % proc proc proc proc
                          Ответить
                            • и что? я не очень в тцл, но не вижу ничегт страшного

                              сабститюшен же требует доллароа
                              Ответить
                              • Set испортили, теперь в нём лежит строка "set". Или я туплю?
                                Ответить
                                • Не, у комманд и переменных нейспеси разные, и для подстановки переменной требует долларе.
                                  Ответить
                                  • А, тут просто переменную set со значением set объявили? Блин, давно я не писал на тцл.
                                    Ответить
                                    • именно

                                      а proc proc proc proc сломал proc
                                      какой бугор
                                      Ответить
                                      • сет тоже можно сломать
                                        # proc set set set
                                        Ответить
                                        • Как же эта питушня быстро начинает грузить мозг. Я вот когда смотрю на код на 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); // что за питушню я читаю?
                                            Ответить
                                              • > $z(
                                                > 'f'
                                                Сила PHP!
                                                В JS только поля можно по имени доставать, а питушни из скоупов - нет. Зачем, зачем?
                                                Ответить
                                                  • У луы ещё и метатаблицы, и там .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, и такую питушню даже в стандарт пустили.
                                                      Ответить
                                                      • > (языки будущего)

                                                        - Лишп изобрели, когда моя бабушка ещё была молодой, лол
                                                        Ответить
                                                    • >нет либо функций высшего порядка,
                                                      джава шестая
                                                      Ответить
                                                      • Приведи реальный пример функций высшего порядка в «джаве седьмой».
                                                        Ответить
                                                          • 1. В джаве шестой нет функций высшего порядка.
                                                            2. Джава седьмая не нужна.

                                                            Следует ли из этого, что функции высшего порядка не нужны?
                                                            Ответить
                          • перевод не совсем точный, так как заменить двойку в пхп всё равно нельзя, а в тцл -- можно. Точнее говоря, никакой двойки в тцл нет.

                            Про нее может знать функция expr, а сам интерпретатор -- нет
                            Ответить
                            • Есть расширение для перегрузки операторов в «PHP»:
                              https://pecl.php.net/package/operator

                              Можно было бы перегрузить плюс... но автор его адаптировал только для 5.3 и 5.4, а потом приуныл.
                              Ответить
                              • Но в tcl-коде не было прегрузки апираторов, там определение комманды с именем "2". Мой перевод настолько близок оригиналу насколько это возможно.
                                Ответить
                              • в tcl нету никакого "плюс". Там есть функция expr, которая умеет понимать математику в своем строковом аргументе

                                вспомни баш
                                Ответить
      • Мне почему-то кажется, что все комментарии на «раковом.ит» написаны одним человеком.
        Ответить
        • Не совсем, я там тоже раз в месяц бывает сею мудрость.

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

          Кстати, насколько сложно задеанонить админов такого сайта?
          Ответить
  • [quote]
    Взрослый, здоровый пернь зарабатывает меньше, чем я. У меня зарплата средняя 30 кусков. Я считаю, что мне в 23 очень повезло и я еще при учебе на дневному устроилась на такую денежную должность. При этом я рекламщик. Сейчас рекламщиков, как грязи. А парень программист (!), старше меня и зарабатывал 25 тысяч. 25 тысяч в 25 лет. Живет с мамой, ковыряется в носу, работает из дома.
    [/quote]
    https://vk.com/knndev?w=wall-51889526_3077115
    Ответить
    • Я думаю, шта крот слепой, понимаешь, промахнулся, с кем не бывает.
      Ответить
  • Пидорашки! За пределами рашки ваши функции высших порядков кто-нибудь использует? Приведите реальные примеры, когда они нужны в работе.
    Ответить

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

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

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


    8