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

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    void Assembler::divsd(XMMRegister dst, Address src) {
      NOT_LP64(assert(VM_Version::supports_sse2(), ""));
      InstructionMark im(this);
      simd_prefix(dst, dst, src, VEX_SIMD_F2);
      emit_byte(0x5E);
      emit_operand(dst, src);
    }
    
    void Assembler::divsd(XMMRegister dst, XMMRegister src) {
      NOT_LP64(assert(VM_Version::supports_sse2(), ""));
      int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2);
      emit_byte(0x5E);
      emit_byte(0xC0 | encode);
    }
    
    void Assembler::divss(XMMRegister dst, Address src) {
      NOT_LP64(assert(VM_Version::supports_sse(), ""));
      InstructionMark im(this);
      simd_prefix(dst, dst, src, VEX_SIMD_F3);
      emit_byte(0x5E);
      emit_operand(dst, src);
    }
    
    void Assembler::divss(XMMRegister dst, XMMRegister src) {
      NOT_LP64(assert(VM_Version::supports_sse(), ""));
      int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3);
      emit_byte(0x5E);
      emit_byte(0xC0 | encode);
    }
    
    void Assembler::emms() {
      NOT_LP64(assert(VM_Version::supports_mmx(), ""));
      emit_byte(0x0F);
      emit_byte(0x77);
    }
    
    void Assembler::hlt() {
      emit_byte(0xF4);
    }
    
    void Assembler::idivl(Register src) {
      int encode = prefix_and_encode(src->encoding());
      emit_byte(0xF7);
      emit_byte(0xF8 | encode);
    }

    https://github.com/openjdk-mirror/jdk7u-hotspot/blob/50bdefc3afe944ca74c3093e7448d6b889cd20d1/src/cpu/x86/vm/assembler_x86.cpp

    Вот эта вот вся ерунда отвечает в Hotspot JVM за генерацию опкодов (чтоб JIT делать). Вы возможно спросите "а где тут говно, j123123?".
    Отвечаю: говно тут на фундаментальном уровне. Такой хуйни по-хорошему вообще не надо писать. Надо формально описать вообще все ебучие опкоды жабового байткода, и все машинные инструкции процессора, которые могут быть порождены жабовым JIT-ом, и потом математически доказать эквивалентность всей этой трансформации какой-нибудь логикой Хоара, системами автоматического доказательства теорем, всякими там Coq, Isabelle и прочей такой сранью, о которой вероятно слышал roman-kashitsyn, раз он там хачкель и Idris с зависимыми типами задрачивал. Ну и CHayT.

    Запостил: j123123, 29 Августа 2017

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

    • Т.е. рассмотрим среднестатистическую аппаратную платформу. Краеугольными камнями любой аппаратной платформы являются:
      1. Процессорная архитектура
      2. Memory map - адресное пространство, в которое отображаются RAM, ROM и внешние устройства
      3. Протоколы управления этими самыми внешними устройствами.
      Так вот, всё вышеперечисленное вполне можно вполне декларативно описать обычным конфигурационным файлом, не прибегая к программированию вовсе. Затем, описав байткод жабы, автоматически сгенерировать через какую-то хитрую жопу некий код, который бы умел выполнять трансляцию байткодов жабы в машинный код целевого процессора, с учетом всех архитектурных особенностей ЭВМ. Т.е. фактически
      1. Формально описываем архитектуру ЭВМ, ISA
      2. Формально описываем жавовый байткод
      3. Пишем код (x), который по декларативному описанию 1 и 2 сможет автоматически сгенерить код(y), который будет уметь переводить из 2 в 1 с полным сохранением семантики, и чтоб корректность трансляции из языка 2 в язык 1 была полностью формально доказана для любых возможных последовательностей жавового байткода. При этом нужно, чтобы была доказана корректность кода (x), и если корректность кода (x) доказана, то из его корректности вытекает и корректность кода (y), порождаемого им. Вообще, код (x) это очень охуительная штука, это чем-то напоминают третью проекцию Футамуры, только круче, это генератор компиляторов(трансляторов) из любого языка в любой другой по формальному описанию(спецификации) этих двух языков. Насчет проекций Футанарей Футамуры советую почитать например тут https://habrahabr.ru/post/47418/.
      Ответить
      • В коде Hotspot я не наблюдаю никакого декларативного описания x86-ассемблера и жабового байткода, нет там разумеется и доказательств, что перевод JVM-bytecode -> x86 ASM всегда сохраняет семантику исходного JVM байткода т.е. не вносится никаких смысловых искажений при этом переводе. Таких доказательств нет например и для компиляторов Си, за исклочением разве что http://compcert.inria.fr/compcert-C.html#archi (и то с некоторыми оговорками)
        Ответить
    • > hlt
      Жаба умеет в ring 0?
      Ответить
      • Я так подозреваю, это используется чтоб жаба упала в каких-то там местах
        Ответить
    • Пиздеть-то мы все умеем, а ты возьми и сделай.
      Ответить
    • > формально описать <...> все машинные инструкции процессора
      А затем доказать, что все инструкции описаны правильно (т.е. именно так, как они будут исполнены процессором).
      Ответить
      • А еще доказать, что сам процессор без багов сделан, и микрокод без багов
        Ответить
        • Заебало всё подряд доказывать, да и сроки подгорают. Добавлю ещё десяток-другой
          emit_byte(0xF4);
          и пойду в отпуск на море кружочки под музыку тыкать.


          Это я к тому, что код из топика написать и отревьювить всяко легче, чем твою универсальную систему + 2 универсальных описания байткодов. Даже для всех существующих процессоров.
          Ответить
    • # и потом математически доказать эквивалентность всей этой трансформации какой-нибудь логикой Хоара, системами автоматического доказательства теорем, всякими там Coq, Isabelle и прочей такой сранью

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

        Т.е. может например так оказаться, что теорема Пифагора является полной хуитой? Ну вообще в геометрии Лобачевского так и есть, но там уже аксиоматика другая. А для обычной геометрии эта теорема доказана железобетонно
        Ответить
        • # Т.е. может например так оказаться, что теорема Пифагора является полной хуитой?

          Вполне возможно, а возможно и то, что она иногда верна, а иногда - нет
          Ответить
          • А еще возможно, что ты хуй, болтающийся у меня в трусах
            Ответить
            • # А еще возможно, что ты хуй, болтающийся у меня в трусах

              Батенька, а вы знаете, что возможно и то, что вы хуй, болтающийся у меня в трусах?
              Ответить
              • Не исключаю. Но моя теория мне нравится больше вашей.
                Ответить
                • Уважаемый, а уточните аудитории, почему это вас заинтересовал "HotSpot JVM"?
                  Ответить
                  • Потому как жаба - говно. Ну и недавно тут эту самую JVM упоминали всуе http://govnokod.ru/23287#comment389587
                    Вот я и решил туда в код заглянуть в поисках говна (покушать принес вам тут)
                    Ответить
                    • # жаба - говно

                      А как вы относитесь к C#/.NET?
                      Ответить
                      • Примерно таким же образом. Разные говна высираются разными людьми и организациями, но независимо от того, кто высрал говно, оно остается говном.
                        Ответить
        • define "доказана"
          Ответить
    • Кстати, а как доказать корректность кода самой системы доказательства корректности кода? В ней ведь тоже могут быть ошибки, нельзя ей слепо доверять.
      Ответить
      • Золотце?
        http://sym.at.ua/blog/how_to_win_any_argument/2012-12-20-1
        So you want to prove that "2+2=5"? Not so fast! First ask your opponent what proves "2+2=4" and watch the silly jerk trying to invoke his hollow schoolbook erudition. If he has PhD in math, then it will be worse for him, as he will present you some set theoretic definitions, based on very specific axiomatic presuppositions, which no one ought to accept "true", as there is no "objective truth", these math freaks masturbate at.

        Next step would be doubting the concept of "truth" itself, because truth is subjective, so "2+2=4" has no reason to be true for everyone. Ask your opponent to define "truth" and counter any dictionary references the same way I shown you how to counter "2+2=4" argument: i.e. ask "what makes your definition of truth itself to be true?"
        Ответить
      • Вообще, советую покурить метаматематику, матлогику
        Ответить
        • ох чую вы батенька что-то другое курили
          Ответить
        • Вообще говоря, чтобы реализовать твою задумку, нужно решить задачу останова. Это, как бы помягче сказать... невозможно.
          Ответить
      • > Кстати, а как доказать корректность кода самой системы доказательства корректности кода?
        Во все существующие пруфчекеры предлагается только уверовать.
        https://github.com/clarus/falso/blob/master/All.v (эпичный баг в Coq Gallina, позволявший доказать False, например)
        Ответить
        • На самом деле можно доказать, что для любого правильного пруфчекера можно построить такую теорему с корректным доказательством, что этот пруфчекер не сможет проверить, что это доказательство является корректрым
          Ответить
          • Очень долгий способ сказать "теорема Геделя"
            Ответить
            • На самом деле "проблема останова", но теорема Геделя о том же самом, как впрочем и канторов диагональный процесс
              https://avva.livejournal.com/2647325.html
              https://inf.1september.ru/2000/5/art/turing.htm

              Допустим что есть идеальная функция X(теорема, доказательство) которая для любой теоремы с корректным доказательством может всегда за конечное время правильно ответить, правильно ли доказательство этой самой теоремы (т.е. возвращает true если доказательство корректно, false если некорректно. Вернуть unknown(т.е. не смочь проверить, правильно ли доказательство) или зависнуть функция не может). Тогда берем эту самую функцию проверки доказательств, и приделываем к ней программу, перебирающую все возможные доказательства для какой-то там теоремы. Т.е. будет функция X1(теорема), а все возможные доказательства попросту брутфорсятся. Получается, что функция X1 возвращает true если есть корректное доказательство и зависает, если доказательства не существует. Ну а теперь по обычной схеме, т.е. через то же доказательство, что у проблемы останова, сделаем теорему T1 = "теорема о том, что X1 зависнет, проверяя теорему T1"
              Делаем X1(T1) - получится так, что если доказательство теоремы T1 существует, то тогда X1(T1) должен зависнуть, а это значит что доказательства искомой теоремы не существует. Но раз мы это смогли понять, то функция X1 перебором должна суметь такое доказательство найти и доказать что X1(T1) зависнет, а если она сможет его доказать, то тогда она не должна зависать. Приходим к противоречию. Идеальный проверятель теорем может работать только на каких-то сверхтьюринговых машинах
              Ответить
    • Тема сисек оптимизации не раскрыта.

      На некоторых процессорах инструкция LOOP быстрее, чем цепочка DEC RCX; JNZ, на некоторых — наоборот. Таких примеров можно найти море.

      Как описать оптимизацию под конкретный процессор?

      P.S. Я ещё не упомянул, что уже у первого Пентиума было два конвейера (U-pipe и V-pipe) и оптимизацию нужно было делать с учётом, что не все инструкции пролезают во второй конвейер...

      P.P.S. А ещё у некоторых процессоров были глюки... Например, после инструкции перехода иногда надо было вставлять NOP, чтобы предиктор чего-нибудь лишнего не засосал.
      Ответить
      • ТС предполагал что архитектура проца и его особенности заложены в некоем конфигурационном файле который подается на вход генератору транслятора
        Ответить
        • Да, например там можно описать то, сколько тактов какая инструкция сжирает, описать пайплайн процессора и особенности кэшей, всякие там задержки обращений ко всяким кэшам первого, второго уровня, оперативной памяти. Если все это описать достаточно полно, то на основе этих данных можно сгенерировать оптимизирующий компилятор, который бы учитывал все эти особенности архитектуры т.е. стремился минимизировать время выполнения кода или же стремился минимизировать количество кода, чтобы он влазил в кэш процессора лучше, или еще что-нибудь такое
          Ответить
          • А если мы процессор на нанометровые слои нарежем и под микроскопом сфоткаем - это же описание? Сможешь по фотографиям пиздатый jit скодогенерировать?
            Ответить
            • Надо только доказать, что программа, которая будет генерить jit по фоткам нарезанного процессора, не содержит багов.
              Ответить
    • если я правильно понял, гениальная идея состоит в изобретении формального описания языков, который бы корректно (причем обоснованно и доказанно) преобразовывался в/из любого яп, который его поддерживает?

      Это же по сути AST. Преобразования туда-обратно не особо нужны. По факту, нужен некий универсальный формат AST, в который можно преобразовать из любого (не слишком экзотерического) яп, и который уже будет использоваться для оптимизаций и генерации байткода унифицированными средствами. Это уже придумали и называется llvm.

      В теории, можно все яп свести к трансляции в единый AST, который уже дальше будет унифицированно оптимизироваться и интерпретироваться или компилироваться в зависимости от задачи (заодно и парситься для синтаксической подсветки). Так можно заодно полностью стереть грань между интерпретируемыми и компилируемыми яп, и заодно между разными яп в рамках одного приложения.
      Ответить
      • > Это уже придумали и называется llvm.

        Во-первых llvm говно (попробуй на нем Сетунь описать. llvm байткод предполагает, что мы имеем дело с битами, тогда как на деле это может быть совсем не так). Во-вторых такое было и до llvm.
        Ответить
        • я говорю о подходе, а ты критикуешь конкретную реализацию, причем объективно тебя в конкретной реализации не устроила незначительная мелочь
          Ответить
          • Это не мелочь. В данной реализации меня не устраивает то, что LLVM недостаточно абстрагированная хрень. LLVM это специально-узкозаточенная штука, в самом LLVM байткоде нельзя описать аппаратуру, под которую этот LLVM потом будет транслироваться. В самом LLVM предполагается уже по семантике самого байткода, что будут у нас какие-то там регистры и какой-то там стек, ну т.е. типа вот все это заточено под стандартную модель исполнения. Короче, LLVM под это дело вообще подходит плохо, LLVM подходит для низкоуровневых байтоебских трансформаций, а не всякой абстрактной хуйни. В самом LLVM байткоде еще предполагается, что есть какие-то там указатели, а есть например dataflow архитектуры, в которых никаких указателей вообще нет.

            Что же касается трансляции из любого ЯП в некий AST и потом из AST трансляция в любой язык - так против этого я ничего не имею. НО в LLVM используется LLVM-БАЙТКОД, это не AST! Байткод это может и неплохо, если например будет способ специализировать этот байткод, например чтоб можно было сделать легко свой байткод с тритами вместо битов и еще какой-нибудь хренью, почему бы и нет...

            Мне вообще не нравится LLVM, в LLVM вообще нет ничего нового, никаких новых идей в LLVM нет.
            Ответить
            • AST не обязан быть в текстовом виде. Быстрее, если это будет бинарный файл с возможностью отображения пользователю в текстовом виде.

              Проблема недостаточной абстрагированности будет остро стоять когда у нас появятся альтернативные архитектуры общего пользования, причем не в виде лабораторных игрушек
              Ответить
            • > никаких новых идей в LLVM нет

              LLVM сделали не для проверки новых идей, а чтобы распилить компилятор на реюзабельные компоненты. Монолитное говно вроде GCC тормозит прогресс.
              Ответить
              • Если бы GCC был модульным, его бы украли проприетарщики
                </Stallman>
                Ответить
                • # украли проприетарщики

                  Пора бы уже законодательно (законодательство об авторском праве) запретить Public Domain и дискриминацию проприетарщины
                  Ответить
                  • Поправка: запретить Public Domain, дискриминацию проприетарщины, да и саму проприетарщину тоже запретить, оставив только GNU GPLv3-or-later. А при появлении более новых версий GNU GPL, весь софт автоматом переводится на эту лицензию. А за непредоставление исходников - расстрел.
                    Ответить
                    • напомни, где можно скачать исходники твоего продукта, который ты работаешь на работе?
                      Ответить
                      • > напомни, где можно скачать исходники твоего продукта, который ты работаешь на работе?

                        на govnokod.ru, разумеется
                        Ответить
                      • Исходники кое-какого моего продукта кстати будут выложены но раскрывать это дело пока нельзя, т.к. ту хрень еще не пофиксили.
                        Я вообще сплоиты разрабатываю.
                        Ответить
                    • В современном мире гпл - не такая уж большая проблема. Можно просто захостить софт на собственных серверах и предоставлять его как сервис - в этом случае предоставлять сорцы пользователям не нужно. Вот AGPL - заноза в жопе, да.
                      Ответить
                      • > в этом случае предоставлять сорцы пользователям не нужно
                        И каким хуем это тебя спасёт от GPL? Будет несвободный сервис, дальше-то что?
                        Ответить
                      • и что мешает каким-нить китайцам брать твой сервис и хостить его же на более дешевых серверах?
                        Ответить
                        • Вут? Я говорю, не надо опенсорсить, если предоставляешь модифицированный гпл-софт в виде сервиса. Откуда китайцы его его возьмут?
                          Ответить
                    • # оставив только GNU GPLv3-or-lat

                      У тебя ошибка: оставив только Microsoft Shared Source
                      Ответить
                • Вообще-то его крадут проприетарщики несмотря на немодульность, прецеденты были
                  https://www.linux.org.ru/forum/talks/12214511#comment-12215138
                  Ответить
              • > Монолитное говно вроде GCC тормозит прогресс

                Если бы людям тогда объяснили, что под словом «прогресс» подразумевают облегчение выдrustывания кучи сырых говноязыков для анскильной школоты.
                Думаю все бы скептически смотрели на это "распиливание" ...
                Ответить
                • Так LLVM не только растишка

                  Вон, ASD свой TS на нем пилит, а яблоко сделало "свифт"
                  Котлин нейтив (которым, правда, пользуется 0 человек) тоже использует LLVM
                  Ответить
                  • Я именно об этом.

                    Такие благие цели декларировались. Изрекали такие пафосные вещи: «Монолитное говно», «тормозит прогресс».

                    А в итоге что? Получили обилие недоязыков и крики: «да я же как Сишка*»

                    * на -O0 при даунклокнутом процессоре
                    Ответить
                    • Ну вот например "свифт" я считаю благом.

                      У него нет GC, а значит он не скриптуха)
                      Ответить
                      • Нет zero-cost абстракций.

                        База по-прежнему сишная (рантайм objective), компилятор на семантике крестов.

                        То есть вместо «прогресса» просто дальнейшие наслоения говн.
                        Ответить
                        • >компилятор на семантике крестов.
                          В смысле?
                          Ответить
                          • Ой, а что это у нас? Undefined behavior? А чья это семантика? Не крестосишная ли?

                            https://blog.regehr.org/archives/1467
                            https://bugs.swift.org/browse/SR-3016


                            Какой прогресс )))
                            Ответить
                            • Хм, ты о том, что у них там есть UB?
                              Ну ок, но UB есть и в няшной
                              Ответить
                              • > но UB есть и в няшной

                                Но в Сишке о минах предупреждают заранее.
                                А в стандартах «swift», «rust» предупреждают про UB?
                                Ответить
                                • Но ведь и в С++ предупреждают?
                                  Ответить
                                  • C++ - говнокостыли над сишкой, естественно там будут предупреждать.
                                    Ответить
                        • в pure swift никакого "рантайма objective" нет
                          Ответить
                      • RC — это довольно медленная и некорректная версия GC.
                        Ответить
                        • define "некорректная", приведи пример медленности, и define "версия GC".

                          При случае передам Борманду с Гостом что у них в С++ со смартпоинтерами есть медленная и некорректная версия GC.
                          Ответить
                          • > define "версия GC"

                            https://govnokod.ru/26439#comment528160

                            https://iacoma.cs.uiuc.edu/iacoma-papers/pact18.pdf

                            Garbage collection is the process of runtime monitoring the life-time of objects and freeing them once they are no longer necessary.
                            There are two main approaches to garbage collection: tracing [28] and reference counting (RC) [17].
                            Ответить
                            • Спасибо. В таком случае у нас есть GC в операционных системах (собираются дескрипторы/хендлеры) в С++ в шариках и юниках и в COM AddRef

                              Теперь интересно узнать про остальные вопросы
                              Ответить
                              • > define "некорректная"
                                Островки циклических ссылок же.

                                > медленная
                                Тут спорно. Пусть CHayT развернёт что он имел ввиду.
                                Ответить
                                • "Некорректна" это когда она не соответствует некоей спецификации", а в системах с RC обычно явно сказано, что циклы ссылок нужно делать через слабые ссылки, так что не очень понятно в чем тут некорректность.

                                  В том, что она не реализует какую-то фишку, которая есть в другой системе?
                                  Ответить
                              • > В таком случае у нас есть GC в операционных системах (собираются дескрипторы/хендлеры)

                                Под контроллеры есть ОС, в которых никаких "дескрипторов" и "хендлеров" нет.
                                Ответить
                                • Пишешь в IO порты устройства и течешь?
                                  Ответить
                                • > ОС

                                  Та самая грань между ОС и библиотекой для переключения задач...
                                  Ответить
                          • > define "некорректная"

                            Дяденька Пи выше объяснил.

                            > приведи пример медленности

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

                            > define "версия GC"

                            Дяденька Пи выше объяснил.
                            Ответить
                            • Я не понимаю почему вы называете "некорректностью" отсутствие какой-то функциональности.

                              GC это некорректная реализация RC, потому что вызов десктрутора в ней не детерменирован, и приходится использовать все эти Closable и Disposable

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

                              Существуют какие-то исследования, доказывающие что это всё медлеенее хорошего крепкого Major GC в джаве на секунду?
                              Ответить
                              • > и приходится использовать все эти Closable и Disposable

                                У меня в ``ФП'' никаких Closable и Disposable нет.

                                > что это всё медлеенее хорошего крепкого Major GC в джаве на секунду

                                ЙАЖА не нужна. У меня в ``ФП'' никаких секундных major GC нет.
                                Ответить
                                • Можно ли сказать, что в .NET и JVM реализация GC некорректна?
                                  Ответить
                                  • Можно сказать, что пользователи вышеперечисленных рантаймов некорректны.
                                    Ответить
                                    • не пописял на столб илитным шовинизмом – день прожит зря
                                      Ответить
                                    • Спарки хадупы кафки пюрефки и дохуя другого говна оперируют на жвм так что нахрюк странный
                                      Ответить
                                      • Как там говорил ротоёб: "напомню, что на PHP написан Вконтакте"
                                        Ответить
                                        • Я про то что если ты делаешь хайлоад то с большой вероятностью ты являешься пользователем жвм и Снаут возможно сам зашкварился и не заметил
                                          Ответить
                                          • Если ты используешь браузер, ты со 100% вероятностью являешься пользователем PHP и JS, но это не значит, что PHP и JS это что-то хорошее.
                                            Ответить
                                            • Он говорил про пользователей
                                              Ответить
                                            • >Если ты используешь браузер, ты со 100% вероятностью являешься пользователем PHP

                                              Кстати, почему?
                                              Ответить
                                              • Потому что есть сайты на PHP, на которые ты наверняка заходишь.
                                                Ответить
                                      • Однажды мы пытались эрланговскую хуйлоад distributed logушню перевести на кафку, всосали по перфомансу и latency знатно. Хотя казалось бы.
                                        Ответить
                                        • Казалось что вы достаточно скилльные чтобы согнуть кафку в нужное положение без сравнимого с вашей эрлангушней опыта?
                                          Ответить
                                          • Её специально обученные люди сгибали. Секрет, думаю, как раз в GC, который в BEAM никогда не стопает всю VM и во многие области кучи тупо не лезет, т.к. их можно более эффективными алгоритмами чистить.
                                            Ответить
                                            • Что такое BEAM?
                                              Ответить
                                            • BEAM от JVM отличается тем, что тактически копирует память. Казалось бы, передавать всё по ссылкам было бы быстрее, но была имплементация Erlang на JVM, и она не взлетела как раз из-за перфоманса. Копировать данные между процессами лучше не только для latency (если один процесс уйдёт в GC, другим пофиг), но для throughput'а тоже.
                                              В Erlang есть даже подобие арен, когда питушню, которая много аллоцирует, выносят в отдельный worker процесс, который отработав дохнет, и тогда никакого GC не нужно.
                                              Конечно, Полина Аксёнова с бормандом накрестушат более быстрые программы для частных случаев, но BEAM вылизывали для high I/O лет тридцать, и в общем случае она очень и очень хороша.
                                              Ответить
                                              • > BEAM вылизывали для high I/O лет тридцать

                                                Хм, если вдуматься, то и Йажу тюнят больше 20 лет...

                                                Хотя там в последних версиях начались подвижки: Shenandoah, ZGC.
                                                Правда лично я их не пробовал, ибо потерял интерес к йажвм.
                                                Ответить
                                                • Ну это всё попытки сделать ГЦ менее стоп-зе-ворлдным или вовсе от него избавиться (если твое приложение никогда не выделит больше чем xms, то тебе и GC не нужен)

                                                  Но это всё не чинит проблем вроде отсутствия "тактически копирует память"

                                                  А чем ты сейчас увлекаешься?
                                                  Ответить
                                                  • > не чинит проблем

                                                    А эту проблему и не починить пока у тебя есть мутабельные данные.

                                                    Эрлангу пофиг копия там или ссылка. Джаве не пофиг.
                                                    Ответить
      • http://rise4fun.com/Z3/Atms8 вот кстати я тут триты описал на SMT-LIB язычке, можно доказывать теоремы. Этот ваш LLVM так умеет? Им триты описать можно?
        Ответить
    • Всё ради того, чтобы люди продолжали верить, что функций нет, есть только методы классов?
      Нет уж, пусть жрут кактус.
      Ответить
    • >и потом математически доказать эквивалентность всей этой трансформации какой-нибудь логикой Хоара, системами автоматического доказательства теорем, всякими там Coq, Isabelle и прочей такой сранью
      > ма-тем-ати-чес-ки доказать

      rust уже пробовал доказать корректность ма-тем-ати-чес-ки.
      Правда llvm, на котором он стоит тут же всё это опроверг.

      Как говорил один финский парень: Theory and practice sometimes clash. And when that happens, theory loses. Every single time.
      Ответить

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