1. JavaScript / Говнокод #20230

    −45

    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
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    var fn={ 
         '+':{priority:0,exec:function(a,b){return a+b}}
        ,'-':{priority:0,exec:function(a,b){return a-b}}
        ,'*':{priority:1,exec:function(a,b){return a*b}}
        ,'/':{priority:1,exec:function(a,b){return a/b}}
        ,'&':{priority:1,exec:function(a,b){return a&b}}
        ,'|':{priority:1,exec:function(a,b){return a|b}}
        ,'»':{priority:2,exec:function(a,b){return a>>b}}
        ,'«':{priority:2,exec:function(a,b){return a<<b}}
    }
    
    function exec(str){
        var machine=putin();
        var out=[];
        console.log("Executing: "+str);
        (str.trim()+" END").split(/\s+/).forEach(parser(function (e){
            if (!e) throw "empty:"+e;
            out.push(e);
            machine.send(e);
        }));
        console.log(out.slice())   
        return machine.top();
    }
        
    
    function putin(){
        // раз "единственно полезная структура данных"
        var stack = [];
        return {
            send:function(e){
                if (fn[e]){
                    b = stack.pop();
                    a = stack.pop();
                    r=fn[e].exec(a, b);
                }else{
                  r=+e;
                }
                console.log(e,r);
                stack.push(r);
            },top:function(){return stack[0];}
        }
    }    
    
    function parser(output){
        // джва "единственно полезная структура данных"
        var ops=[];
        var op2;
        return function(e){
            if (/[0-9]+/.test(e)) {
                output(e);
            }else if (null!=fn[e]){
                op2=ops.slice(-1)[0];
                while (fn[op2] &&  (fn[e].priority <= fn[op2].priority) ){
                    output(op2);
                    ops.pop(); 
                    op2 = ops.slice(-1)[0];
                }
                ops.push(e);
            }else if (e == "(") {
                ops.push(e); 
            }else if (e == ")") { 
                while (ops.slice(-1)[0] != "("){ 
                    output(ops.pop())
                }
                ops.pop(); 
            }else if ("END" == e){
                var x;
                while (x=ops.pop(),x) {
                    output(x);
                }    
            }else{
                throw 'invalid pituh:'+e;
            }
        }
    }
    [
        [-1187,"1 + 22 - 13 * ( 44 + 51 ) + 150 / 3 « 1"]
        ,[13,"1 + 3 * 4"]
        ,[16,"( 1 + 3 ) * 4"]
        ,[17,"  1 + 2 * 3 - 4 * 5 + 10 * ( 12 - 9 )"]
    ]
    .forEach(function (a){
        if (a[0]!=exec(a[1])) throw ("Shit:"+ a[0]+" != "+ a[1])
    });

    После того как я заявил что массив — "единственно полезная структура данных", и можно парсить выражения без деревьев.
    Гумно начало брать на «слабо».
    Поточный парсер выражений, который принимает пайпом поток токенов и «на лету» пайпает свой выхлоп в интерпретатор.
    Таким образом по мере прохождения потока он потихоньку исполняется и упрощается.

    Запостил: 3.14159265, 19 Июня 2016

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

    • Из LL(1) срача.
      http://www.govnokod.ru/20220#comment335515
      Ответить
    • >> массив — единственно полезная структура данных
      прибежит любой луашник и скажет да.
      Ответить
      • То, что юзают луашники и у пхпшники - это не массив... Это гибрид массива и хешмапы.
        Ответить
        • Тут всё по заветам Царя и алехуя, например применён легендарный паттерн "Джва стека".
          Ответить
          • Есть джва стека: в одном операторы точёные, в другом данные кручёные. В какой плюс поставишь, в какой 42 посадишь?
            Ответить
            • Во, с нормальным выводом, как оно работает.
              https://jsfiddle.net/f47afqct/4/
              Ответить
              • Офтопик. Вспомнил о микрокалькуляторах. Четыре популярных типа организации вычислений:

                1. RPN. Один стек для чисел. Исполнение операторов мгновенное. Есть клавиша для подъёма стека. Обычно четыре регистра (Χ, Υ, Ζ, Τ), причём Χ намертво припаян к экрану. Иногда бывает регистр Χ1 для временного хранения значения X, которое было перед последней операцией.
                Пример: 2 ↑ 2 ↑ 2 + *
                Ответ: 8
                Пример: 2 ↑ 2 ↑ 2 * +
                Ответ: 6

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

                2. Бухгалтерские. Также один стек, но всего на две ячейки, ибо для двухместной операции хватит. Операции исполняются мгновенно.
                Пример: 2 + 2 * 2 =
                Ответ: 8

                3. Инженерные. Есть клавиши скобок и приоритет операций. От размера стека зависит поддерживаемая глубина вложения скобок.
                Пример: 2 + 2 * 2 =
                Ответ: 6

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

                4. Калькуляторы с AER — algebraic expressions representation. У них красивый редактор вводимого выражения, синус записывается как префикс и со скобками (как в математических формулах), а не как постфикс (как в инженерных калькуляторах). Есть подозрение, что они вообще строят дерево при разборе формулы.
                Ответить
                • показать все, что скрытоЯ протестую против такого использования слово питон. Надо говорить налинупс, нарнр или нажс.
                  Ответить
                • Ага.
                  А я говорю: можно не только мат. формулы в калькуляторах, но и программу парсить, компилировать и интерпретировать в один проход!

                  Допустим парсер получает на вход по одному символу. Он тут же разбирает их, и передаёт на вход интерпретатору запуская программу (тесты)
                  .
                  Таким образом еще мы не вычитали и половины программы, а уже исполняем её.
                  И допустим интепретатор наткунлся на команду goto napython;
                  Он ожидает пока парсер не дойдёт до места napython: после чего идёт напитон.

                  Или допустим есть
                  func pituhTest(){
                       Assert(2+2,Pituh.kokoko())
                  }

                  У интерпретатора уже есть ссылка на Assert, поскольку он только что выполнил предыдущий тест.
                  Интерпретатор фолдит константу 2+2 в 4.
                  И говорит: не знаю что такое Pituh и даёт хинт компилятору, тот ищет файл Pituh и кормит его парсеру.

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

                    И тут посреди исполнения программы ошибка компиляции: метка напитон не найден
                    Ответить
                    • >метка напитон не найден
                      Надо ждать пока или "найден" или поток символов не кончится.

                      Может я неточно выразился.
                      Но вот же инканус всё очень хорошо расписал.
                      http://govnokod.ru/20230#comment335561
                      Ответить
                      • Ну суть в том, что я уже половину программы выполнил и только потом вдруг обнаружил, что она не корректно.
                        Ответить
                        • Суть в том что ты половину тестов выполнил. Ну или допустим программы.
                          Ты можешь починить нужную строку и если она еще не прошла интерпретацию — продолжить выполнение с того места где остановился. Бейсик так умел.

                          >и только потом вдруг обнаружил, что она не корректно.
                          Тогда и многопоточные компиляторы нинужны. Другие потоки что-то лишнее выполнили, а один отвалился.
                          Всё — насмарку. Жизнь — тлен.
                          Ответить
                          • Да все просто. Делаешь копию стека и первый проход извлекаешь из стека до дна для проверки, а второй - исполняешь
                            Ответить
                            • Так слишком просто и суть теряется: памяти надо больше
                              По сути сейчас так всё и работает сконпелировал — записал ast в память, и выполнил.
                              Ответить
                              • ну это метод джвух стеков.

                                а так то твой метод синтаксического стека не слишком годный для интерпретаторов, но годный для трансляторов, имхо.
                                Ответить
                                • Кстати, гумно, а я оказывается давно всякие стековые интерпретаторы сочиняю.
                                  http://govnokod.ru/17323

                                  см.
                                  arity=fn.length;
                                          }else{
                                              args.push(arg);
                                          }        
                                          
                                          if (arity<=args.length+1){
                                              space.res=fn.apply(this, [space.res].concat(args));
                                              args=[];
                                          }


                                  Я всё голову ломал, как бы в той хуёвине на свойствах и естественно без скобок сделать читабельный язык.
                                  Нет, конечно можно было сделать постфикс, но там голову сломаешь пока напишешь/прочтёшь.
                                  Ответить
                          • Баш так и работает. В нем можно даже файл редактировать пока программа в нем выполняется, и парсер заметит изменения если они будут после того места до которого он дочитал на момент внесения изменений.
                            Ответить
                            • >В нем можно даже файл редактировать пока программа в нем выполняется
                              А. Точно
                              Но в баше эта фича как-то криво сделана и часто раздражает.
                              Написал чего-то сверху текущей команды и всё пошло вкривь, поскольку позиция в файле теперь указывает на средину команды.
                              Ответить
                              • Эту фичу вообще нельзя нормально сделать, не?
                                Ответить
                  • При построении однопроходного компилятора/интерпретатора для гото нужно рассматривать два случая: прыжок вперёд или прыжок назад.

                    Если у нас метка napython встретилась до goto (прыжок назад), то мы запоминаем её адрес в табличке меток и к моменту, когда встретится goto, у нас будет уже готовый адрес перехода.

                    Если goto встретился до метки napython (прыжок вперёд), то мы никуда не прыгаем, а в молчаливом режиме (ничего не выполняем, просто считаем длины команд) разбираем дальнейший код до того момента, пока не встретится метка. Как встретилась метка, выходим из виртуального режима и продолжаем выполнение. В случае же компилятора (а не интерпретатора) придётся латать адрес перехода в goto, но можно и не возвращаться назад, если у goto косвенная адресация: кладём адрес метки napython в таблицу, как и в первом случае, но только тут на запись таблицы уже указывает реальный goto.
                    Ответить
                  • а что если исходников больше чем один файл? а если предполагаются типы, как собственно они должны выглядеть чтоб конпелироваться в один проход?
                    Ответить
                • У мну был калькулятор, что в разметку вставлялся. Складывалась с заметными тормозами. Целые секунды. А синус так вообще полминуты мог считать
                  Ответить
                  • *В разетку
                    Ответить
                  • Был у меня тормозной калькулятор МК-18М. У него, как у бухгалтерского, стек был на два числа (никаких приоритетов, 2 + 2 * 2 = 8), но при этом были и синусы. По моей классификации это пункт 2+ε.

                    У этой машины был забавный баг: при вычислении синуса стиралось содержимое второго стекового регистра. Т. е. синус 30° плюс 5 я мог посчитать, а 5 плюс синус 30° посчитать не мог, ибо пятёрка стиралась во время вычисления синуса. У других микрокалькуляторов той же эпохи (Б3-36, например) такого бага не было и оба варианта выражения считались без ошибок.

                    Получается, что у МК-18М микропрограмма вычисления синуса использовала не внутренние (скрытые) регистры, а пользовательский стек.
                    Ответить
    • показать все, что скрыто
      var machine=hujlo();
      Ответить
    • Дочитал до строк
      function putin(){
          // раз "единственно полезная структура данных"


      сразу подумал про 3.14159265358979323846264338327950288419 7169399375105820974944592307816406286208 9986280348253421170679
      Ответить
    • Я тут тред годы нашел:
      Пролистывай по несколько страниц и смотри как топикстартер вореционировал:
      Под конец вообще вореции вореции. Короче не шутите с ними и с программированием в частности. Оно не прощает.
      http://www.gamedev.ru/flame/forum/?id=133421
      Ответить
      • Там часом не ломанули учётку автора?
        Ответить
        • Ну полгода назад он возвращался. Говорил что на лекарствах сидит. А игру забросил. Мне даже иногда кажется, что мне решительно пока везет
          Ответить
          • Тогда и вправду всё печально. Там где-то в окрестностях 11-й страницы происходит переход: сначала текст, близкий к нормальному, потом витиеватый трёп, а потом переключение на настоящую шизофазию.
            Ответить
            • разработка движка продолжается, сейчас правда он в нерабочем состоянии буду приводить в рабочее, шейдер ssao будет открытый, кстати с ума лучше не сходить)))

              И понеслась! здравствуйте, я Кирилл, я сделаю игру суть токова:

              Действия, происходят в городе, есть университетская зона, и поездки на природу или в парк не исключаются. У нас будут более сложные взаимоотношения про любовь и дружбу, чем в Sims 3. Лучше все-таки делать от первого лица, мне “Morrowind” и “Мор Утопия” больше симпатичны. Можно общаться по интернету с ботами, т.е. компьютеры как в “Vampire: The Masquerade – Bloodlines” но более функциональные. Время действия ближайшее наше будущее.
              Мне и исходники сильно не нужны, найти бы программистов. Основной вид на них, т.к. интересна большее концепция, реализации этого чем графика. По графике людей мы найдем, потом, когда будет куда ее вставлять.
              Да, мне, не надо, скорее роман. Название, да, что-то вроде, 'как Ева, не смогла приказать'.
              Но вообще и, Акиана, есть, две книжки. Елена невидимая, в порядке. Она мне по возрасту, подходит.
              Спасибо, я очень поольщен. Я, не отказываюсь, От хорошей, сказки. Рэйна - таких, не бывает, Бог...
              Ответить
              • ну в общем кроми симс он мои любимые игры назвал. так глядишь тут и какая-то корреляция есть. Например еслиб мне нравился ещеб и симс, то и я бы может бы поехал с большей вероятностью
                Ответить
                • > Например еслиб мне нравился ещеб и симс, то и я бы может бы поехал с большей вероятностью
                  (осторожно интересуется)
                  А ты Хаскель уже забросил учить?
                  Ответить
                  • Пока приостановил. Нет времени на это немутабильное говно. Когда чтобы написать хештаблицу - приходится городить структуру, работающую в итоге за о логарифм н вместо о 1 - я уж не знаю кому такое днище может понадобится.
                    Ответить
                    • только анскильные лалки кукарекают про O(1), в то время как пацаны используют логарифмические алгоритмы

                      во-первых, поскольку объём памяти ограничен, N тоже ограничено сверху, следовательно O(log(N))≡O(1); это только питухретики кукарекают про машины анала тьюринга с бесконечными лентами

                      во-вторых, физически память представляет собой не анскильный сишный массив, а царское дерево фиксированной высоты: каждая ячейка адресуется иерархически: по номеру банка, затем страницы, ну и потом уж строки и столбца

                      а уж дерево-то ложится на хаскель превосходно!

                      в общем, адресация за O(1) -- это миф для высокоуровневых адептов сишки, ничего не понимающих в настоящих оптимизациях на низком уровне

                      итог: хаскель -- царский язык, пацаны всегда будут унижать адептов сишки
                      Ответить
                      • > царское дерево фиксированной высоты
                        Ну это как посмотреть... Там же размеры банков/страниц/строк не плавают - а значит это просто четырёхмерный царский массив, а не питушиное дерево.
                        Ответить
                        • нет, нет и нет!
                          только анскильная лалка думает, что контроллер памяти прыгает сразу в произвольный байт
                          если посмотреть на спецификацию любого DDR SDRAM протокола, видно, что на самом деле он итерирует по этим индексам, сначала подготавливая строку для чтения
                          так же типичная хаскель-программа рекуррентно поднимается по дереву
                          отсюда же видно, что последовательный доступ к памяти быстрее, чем рандомный: а именно так работают зипперы в haskell
                          следовательно зиппер - царская структура, а массив -- нет
                          Ответить
                          • > последовательный доступ к памяти быстрее, чем рандомный
                            Факт. Но вот деревья на это совсем уж плохо ложатся.

                            > прыгает сразу в произвольный байт
                            Ну где я об этом пишу?
                            Ответить
                          • Ок, dram - это массив, недоступный ни программисту, ни процессору ни даже контроллеру памяти. Всё что с ним можно сделать - попросить скопировать одну строчку массива в массив sense amp'ов и получить к этой строчке почти произвольный доступ. С задержкой ответа на cas latency, да. Но стримить данные из одной строки можно в произвольном порядке, не обязательно подряд (т.е. можно попросить третье-седьмое-пятое-второе слова, и через cas latency чип начнёт выплёвывать их именно в таком порядке). Писать - тоже.

                            З.Ы. Я про тот sdram, с которым довелось работать. На ddr не так?
                            Ответить
                            • во-первых, ты не можешь обратиться ни к произвольному sens amp ни к самой строке напрямую, т.к. в шине адреса проводов элементарно меньше, чем и того и другого
                              т.е. нужен мультиплексор, сама схема которого неслабо напоминает дерево
                              во-вторых, если для обращения к элементу нам в принципе нужно как-то итерировать, мы уже явно работаем не с массивом (в нём достаточно арифметики и _одной_ операции с абстрактной памятью, чтобы прочитать любой элемент, а в случае с реальной памятью таких операций получается как минимум две -- если смотреть снаружи)
                              Ответить
                        • Как бы машина Тюринга нам не дает никаких гарантий существования массивов. И если внимательно читать всяких Корменов, то где-нибудь обязательно маленьким шрифтом будет приписка указывающая на то, что все это делается в надежде на т.н. "машину произвольного доступа" (RAM). Это такая (одна из) моделей компьютеров (не путать с электронными вычислительными машинами), где аксиоматично существует возможность обращения к ячейкам памяти за константное время.

                          Но если мы будем рассматривать другие модели компьютеров, например, что-нибудь базирующееся на лямбда исчислении, то само по себе предположение о том, что может быть доступ к произвольной ячейке в памяти за константое время будет сильно сомнительным.

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

                          Но ведь по-сути, индекс ячейки в памяти - это путь в бинарном дереве, он кодирует сколько-то решений, которые нужно принять для доступа к этой ячейке.
                          Ответить
                          • Машина тьюринга - это абстрактный автомат, использующийся для доказательства выполнимости. Время выполнения там никого не интересует, пока оно конечно. Скажите, www - это такой вореционный бот, только получше написанный?
                            Ответить
                            • Сема, ты не в теме.
                              Ответить
                              • Где конкретно?
                                Ответить
                                • Ну, например, внимательно прочитай этот параграф:
                                  https://en.wikipedia.org/wiki/Turing_machine#Computational_complexity_theory

                                  Возможно, после этого ты поймеш, что то, что ты сказал про ТМ - в принципе правильно, но не противоречит тому что я сказал раньше (что вызывает подозрения: а понял ли ты сам, что сказал).
                                  Ответить
                                  • Это только на свиной мове есть?
                                    Ответить
                                    • На свиной мове будет так:

                                      Away imitationlay ofway Uringtay achinesmay isway atthay eythay
                                      oday otnay odelmay ethay engthsstray ofway away articularpay
                                      arrangementway ellway. Orfay instanceway, odernmay oredstay-
                                      ogrampray omputerscay areway actuallyway instancesway ofway away
                                      oremay ecificspay ormfay ofway abstractway achinemay ownknay
                                      asway ethay andomray accessway oredstay ogrampray achinemay
                                      orway ASPRAY achinemay odelmay. Ikelay ethay Universalway
                                      Uringtay achinemay ethay ASPRAY oresstay itsway "ogrampray"
                                      inway "emorymay" externalway otay itsway initefay-atestay
                                      achine'smay "instructionsway". Unlikeway ethay universalway
                                      Uringtay achinemay, ethay ASPRAY ashay anway infiniteway
                                      umbernay ofway istinguishableday, umberednay utbay unboundedway
                                      "egistersray"—emorymay "ellscay" atthay ancay ontaincay anyway
                                      integerway (cfay. Elgotway andway Obinsonray (1964), Artmanishay
                                      (1971), andway inway articularpay Ookcay-Echowray (1973);
                                      eferencesray atway andomray accessway achinemay). Ethay ASP'sray
                                      initefay-atestay achinemay isway equippedway ithway ethay
                                      apabilitycay orfay indirectway addressingway (eway.gay. ethay
                                      ontentscay ofway oneway egisterray ancay ebay usedway asway
                                      anway addressway otay ecifyspay anotherway egisterray); usthay
                                      ethay ASP'sray "ogrampray" ancay addressway anyway egisterray
                                      inway ethay egisterray-equencesay.
                                      Ответить
                                      • (продолжение)

                                        Ethay upshotway ofway isthay
                                        istinctionday isway atthay erethay areway omputationalcay
                                        optimizationsway atthay ancay ebay erformedpay asedbay onway
                                        ethay emorymay indicesway, ichwhay areway otnay ossiblepay inway
                                        away eneralgay Uringtay achinemay; usthay enwhay Uringtay
                                        achinesmay areway usedway asway ethay asisbay orfay oundingbay
                                        unningray imestay, away 'alsefay owerlay ound'bay ancay ebay
                                        ovenpray onway ertaincay algorithms'WAY unningray imestay (ueday
                                        otay ethay alsefay implifyingsay assumptionway ofway away
                                        Uringtay achinemay). Anway exampleway ofway isthay isway
                                        inarybay earchsay, anway algorithmway atthay ancay ebay ownshay
                                        otay erformpay oremay icklyquay enwhay usingway ethay ASPRAY
                                        odelmay ofway omputationcay atherray anthay ethay Uringtay
                                        achinemay odelmay.
                                        Ответить
                      • Причём, когда чипу sdram приходит команда на открытие строки, он копирует (ок, даже перемещает) одну строку из этого многомерного массива в массив sense amp'ов, откуда к ней потом возможен произвольный доступ. А при закрытии строки он её сохраняет обратно.

                        Где здесь деревья, CHayT?
                        Ответить
                        • Так работает типичный зиппер. Сначала мы розжимаем дерево в нужном месте, получая произвольный доступ к какому-то элементу. Меняем либо читаем его, и зожимаем зиппер обратно в дерево.
                          Ответить
                        • показать все, что скрытоvanished
                          Ответить
                          • Да хуйню я написал там.

                            Данные сразу сохраняются т.к. сенс-ампы ещё подключены к строке.

                            Но после отключения сенс-ампов от строки их надо перезарядить до среднего значения (precharge). Только тогда можно будет открыть следующую.
                            Ответить
              • > я Кирилл
                Борисов?
                Ответить
      • А вы не его брат случайно?
        (просто, полагаю, что нужно быть настолько же чертовски талантливым, чтобы упорно находить такое подобное)
        Ответить
      • Внезапно: https://pp.userapi.com/sDhlJwOIhQlrud9lRjznpxYvPkOjSWalUwiyoA/Y95fotH1qCY.jpg
        Ответить
    • гiмно
      Ответить

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