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

    0

    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
    namespace InstanceOf {
    
        class Foo {
            x: number
            y: string
            bar() {
                return this.x
            }
        }
    
        class Bar extends Foo { }
        class Baz extends Foo { }
        class Bar2 extends Bar { }
        class Bar3 extends Bar { }
    
        export function run() {
            print("InstanceOf")
    
            assert(new Bar2() instanceof Foo, "if")
            assert(new Bar2() instanceof Bar, "ib")
            assert(new Bar2() instanceof Bar2, "ib2")
            assert(new Bar3() instanceof Bar, "ib")
            assert(!(new Bar2() instanceof Baz), "!ib")
            assert(!(new Foo() instanceof Baz), "!ib2")
            assert(!(new Foo() instanceof Bar), "!ib2")
    
            (new Foo()).bar();
            (new Bar3()).bar();
        }
    }
    
    function main()
    {
      InstanceOf.run()
      print("done");
    }

    Возрадуйтесь братья и сестры. я вам принес зачатки RTTI :) и узрите этот дампик во очию.

    Запостил: ASD_77, 29 Июля 2021

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

    • это ссыль на дампик https://pastebin.com/1SzYPXEg
      Ответить
    • а эта ссыль на репо-говнокод https://github.com/ASDAlexander77/TypeScriptCompiler
      Ответить
    • У меня в "C" нет никакого "RTTI", а в "D" я его вырубаю нахрен, ибо не нужен мне этот оверхед заедушный!
      Ответить
      • а каким хреном ты делать dynamic_cast будешь?
        Ответить
        • Я изначально знаю, где какой тип у меня будет. А если не знаю, то я просто хуячу структуры с каким-то описателем типа, и передавать это говно через указатели, но это мне нахуй не надо
          Ответить
          • > а если не знаю

            То ты анскильная лалка
            Ответить
          • так и RTTI же примерно так и работает, тока это компилятор за тебя делает
            Ответить
            • Компилятор это делает хуй знает как, а я могу это делать эффективно, упихав описание типа в один байт, если мне достаточно иметь 256 вореантов типов
              Ответить
              • https://blog.quarkslab.com/visual-c-rtti-inspection.html

                https://blog.quarkslab.com/resources/2013-07-12_visualcpp-rtti-inspection/images/rtti-layout.png

                В крестах всё просто и понятно
                Ответить
          • юзай логику LLVM

            /// Base class for all expression nodes.
            class ExprAST {
            public:
              enum ExprASTKind {
                Expr_Num,
                Expr_Literal,
              };
            
              ExprAST(ExprASTKind kind)
                  : kind(kind) {}
              virtual ~ExprAST() = default;
            
              ExprASTKind getKind() const { return kind; }
            
            private:
              const ExprASTKind kind;
            };
            
            /// Expression class for numeric literals like "1.0".
            class NumberExprAST : public ExprAST {
              double Val;
            
            public:
              NumberExprAST(double val) : ExprAST(Expr_Num), Val(val) {}
            
              double getValue() { return Val; }
            
              /// LLVM style RTTI
              static bool classof(const ExprAST *c) { return c->getKind() == Expr_Num; }
            };
            Ответить
        • У него в "Си" нету никаких "dynamic_cast".
          Ответить
          • правильно. У него есть только статик, реинтерпретер и конст. Причем в одном флаконе
            Ответить
      • а как ты будешь ловить разные exception?
        Ответить
        • Зачем мне какие-то эксепшены? Это ж оверхед, под эксепшены нужно какое-то специальное говно, которое отслеживает всякие места, где это исключение может пойматься. См. https://habr.com/ru/post/208006/

          В "D" я их тоже вырубаю нахрен.
          Ответить
          • Поддерживаю.
            -fno-rtti -fno-exceptions

            Перепитушня не нужна.
            Ответить
        • У него в "Си" нету никаких "exception".
          Ответить
          • Кстати, в винде есть эксепшены для сишечки
            g: SEH
            Ответить
            • В «MSVC» и в «Watcom C» для них даже специальная языковая конструкция была, как в крестах. Только вместо слова «catch» было слово «except».
              Ответить
          • У меня есть setjmp-longjmp, но мне ими как-то не доводилось пользоваться. А в ассемблере вообще можно свободно отматывать стек и прыгать из "функции" в "функцию" (на самом-то деле в ассемблере нет никаких "функций")
            Ответить
      • и это оверхед у других у меня максимум один укозатель + одна функция...
        Ответить
      • это у тебя комплекс не полноценности развился на базе использования C/C++ ... " .. ой я лишний байтик выделили. ой я интерфесиков много в класс напихал что теперь класс распидарасило.. ой я в хипе класс разместил теперь моя PC c 16 гб оперативы это не потянет... ой тут DLL размером с SSD диск..." пора взрослеть
        Ответить
        • > теперь моя PC c 16 гб оперативы это не потянет
          Не стоит забывать, что у j123123 оператива меряется в килобайтах. Да и флеш памяти не сильно больше.
          Ответить
        • Зачем тебе тогда компилировать тайпскрипт? Что, байтиков и тактов процессора под жаваскриптовый интерпретатор жалко? Ай-яй-яй!
          Ответить
          • я не хочу видеть & и * в С++ языке :)
            Ответить
          • а еще ни одна мобила V8 не тянет нормально.... а если туда еще WebGL запихнуть так ваще все умрет
            Ответить
            • Кстати, почему ты пишешь компилятор TS а не компилятор JS? Ведь TS элементарно переводится в JS, и потом этот JS уже можно компилить.

              Или может TS оттранслированный в JS содержит в себе какую-то принципиально некомпилируемую хуйню, например eval()?
              Ответить
              • В TS у него гораздо больше информации о типах в момент компиляции, это проще компилировать.
                Ответить
                • Но ведь много какой код на JS это код на TS, так ведь? Значит ему и JS надо уметь компилировать, вот в чем багор )))

                  https://en.wikipedia.org/wiki/TypeScript#Compatibility_with_JavaScript
                  TypeScript is a strict superset of ECMAScript 2015, which is itself a superset of ECMAScript 5, commonly referred to as JavaScript.[32] As such, a JavaScript program is also a valid TypeScript program, and a TypeScript program can seamlessly consume JavaScript. By default the compiler targets ECMAScript 5, the current prevailing standard, but is also able to generate constructs used in ECMAScript 3 or 2015.
                  Ответить
                  • Код на JS из которого выводятся типы валидный код TS, угу

                    Я не уверен, что компилятор TS генерит такой JS код, из которого легко вывести типы
                    Ответить
                    • > Код на JS из которого выводятся типы

                      Что еще за "выводятся типы"? Вполне обычный код на JS это валидный код на TS.

                      https://stackoverflow.com/questions/38318542/how-to-use-javascript-in-typescript

                      https://www.tutorialsteacher.com/typescript/converting-javascript-to-typescript - некоторые небольшие исправления конечно же могут потребоваться, но я не вижу никаких требований что-то там типизировать
                      Ответить
                      • > Вполне обычный код на JS это валидный код на TS.

                        вот валидный код для JS, но не валидный для TS, потому что не известно что возвращает foo()
                        function foo() {
                          if (doAll()) return 42;
                        }
                        if (foo()) {
                        }


                        ``allowJs`` позволяет включать js код в компиляцию, но это не делает его TS.
                        Ответить
                        • > ``allowJs`` позволяет включать js код в компиляцию, но это не делает его TS.

                          И как включение js кода будет решаться в компиляторе из-TS-в-LLVM?
                          Ответить
                          • Не знаю.

                            на выбор
                            1. запретить
                            2. сделать неоптимально

                            Например гетерогенный массив куда сложнее сделать оптитмально, чем массив numberов.

                            Можно провести такую аналогию: у тебя есть код на "си" с асмовставками на "x86 asm".

                            Как скомпилировать его под arm?

                            1. запретить асмовставки
                            2. перевести их на ARM (возможно очень неоптимально_)
                            Ответить
                          • никак. хочешь JS юзай node. у меня С++ компилятор c синтаксисом TS
                            Ответить
                            • Только вот в C++ никакого GC нет (недавно выпилили из стандарта http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2186r2.html ), а у тебя он явно будет.
                              Ответить
                              • > недавно выпилили
                                Только это был не GC, а говно и палки, с помощью которых предлагалось сделать свой GC. Ими никто не пользовался (даже те, кто делал GC в крестах) поэтому и убрали.
                                Ответить
                                • А в «Nim» есть несколько разных «GC»: один перфоманснее другого! А ещё его можно отключить и течь.
                                  Ответить
                                  • у меня будет так же
                                    Ответить
                                    • Чтобы был перфоманс?
                                      Ответить
                                      • Перфоманс это когда у тебя даже хипа нет нихуя, все статически размещено в памяти контроллера. И какой-то там GC вообще смысла не имеет.
                                        Ответить
                                        • Перформанс – это когда я пишу лабу на асемблере и не знаю как выделить память, поэтому все данные хранятся прямо в регистрах.
                                          Ответить
                                          • > Перформанс – это когда я пишу лабу на асемблере и не знаю как выделить память

                                            Через инструкцию push выделяй
                                            Ответить
                                            • Я уже дописал ту лабу и получил за неё плюсик, так что теперь я ещё очень нескоро что-то напишу на ассемблере.

                                              А ещё можно позвать из ассемблера аллоку или маллоку сишную.
                                              Ответить
                                              • alloca() это не совсем функция. Это отматывание стека, и позвать ее как функцию нельзя.
                                                Ответить
                                                • Тогда malloc'у можно позвать.
                                                  Ответить
                                                  • Можно, если она у тебя есть. А если у тебя контроллер, никакого "malloc" у тебя нет. У тебя есть столько-то памяти по таким-то адресам, и ты как-то должен решать, чем и как эту память засирать
                                                    Ответить
                                • На всякий случай напомню, что GC это самое отвратительное ненужное говно, когда либо созданное человеком

                                  Хуже того: говно это лживое

                                  В непидорских средах и непидорских языках GC нет
                                  Ответить
                                  • > В непидорских средах и непидорских языках GC нет

                                    Приведи реальные примеры.
                                    Ответить
                                    • Си.
                                      Ответить
                                      • Это понятно. Кроме очевидных C, C++.
                                        Ответить
                                        • Rust. Из старого -- паскали да фортраны.
                                          Ответить
                                        • swift
                                          Ответить
                                          • > swift

                                            Но ведь он для apple...
                                            Ответить
                                            • ты можешь на нём легитимно писать под любимую убунтучку, problems?
                                              Ответить
                                              • > писать под любимую убунтучку

                                                А там либы то завезли? Или надо будет как на сишке всё с нуля?
                                                Ответить
                                                • так собсно юзай сишные либы

                                                  https://medium.com/@Aciid/ship-c-code-with-swift-packages-using-swift-package-manager-44edcc702a45

                                                  впрочем, я на практике сишный интероп юзал только на мяке и там это очень ок
                                                  Ответить
                                                  • > юзай сишные либы

                                                    Да, для всякой гуйни это особенно удобно...
                                                    Ответить
                                                  • Error 1020
                                                    Ответить
                                                    • умвр

                                                      кстати, как оказалось, что медиум вполне работает и с включённым noscript
                                                      Ответить
                                          • > непидорских языках
                                            Ответить
                                            • один из самых непидорских языков на сегодняшний момент ёпта
                                              Ответить
                                      • Из-за меня борманд вернулся.
                                        Ответить
                        • function foo(a: any) {
                            return 42 + a;
                          }
                          
                          console.log(foo(42));
                          console.log(foo("- the answer to life the universe and everything"));


                          https://www.typescriptlang.org/play?ts=4.4.0-beta#code/GYVwdgxgLglg9mABMOcAUBDAXIjYCeAlIgN4BQiiATgKZQhVIAsATIgNS4DcZAvmWQgIAznAA2NAHRi4AczQp0rQoR5CwoidLkLUaAEQBaRFAAWNXBoDuNKibiIxMYBbMXwMAG63hFvABNEGm8qfDMYMFl9FR4gA


                          Вот вполне валидный код на TS. И где здесь типизация, guest6? Можно еще "noImplicitAny": false выставить, и тогда даже этот ": any" можно не использовать
                          Ответить
                          • Функция foo() возвращает any, это примерно как "void*" вернуть.
                            Ответить
                          • Т.е. этот тайпскрипт не запрещает писать всю хуйню с этим "any", который неявно есть в JS, а значит нужно такую хуйню уметь компилировать, и получается внезапно, что нужно уметь компилировать JS, не так ли?
                            Ответить
                            • Да, ты прав: пользователь может отказаться от явных типов, и получить менее оптимизированный код.

                              ``any`` хранить менее оптимально, чем ``number``.

                              Если всегда сначала компилировать в JS, то тебе всегда придется иметь дело с "any", а значит ты никогда не сможешь ничего оптимизировать (точнее сможешь, но придется много чего доказывать)

                              Сравним с жабой или C#: ты можешь явно указать int, и получить 4 байта инт. А можешь указать Object, и получить указатель на объект в куче, который будет внутри иметь int.

                              Очевидно, первый случай более оптимальный.
                              Ответить
                              • Очевидно, что оптимизировать можно и с "any", если можно построить граф, какая функция какую вызывает с какими типами.

                                Хуйню с "any" реализовывать в любом случае придется, иначе такой компилятор TS много какой хуйни не скомпилирует, так почему б не начать с реализации компилятора JS, и уже потом на него напяливать типы как в TS?
                                Ответить
                                • Вот кстати я еще такую хуйню нашел https://github.com/NectarJS/nectarjs
                                  Ответить
                                  • скомпилял hello world. вроде я намного меньше генерю разного кода.
                                    Ответить
                                • Очевидно, сделать это проще, когда тип функции указан явно, с чего мы сначала и начали.

                                  вон товарищ подсказывает, что он такой кейс вообще не
                                  Ответить
                          • это не struct mode - в стрикт моде "any" запрещен. вот у меня мод где есть any но он не дает валидный код. (пока) и для моего компилятора any это почти запрещенная конструкция
                            Ответить
    • А зачем в ЖС-подобный ЯП тащить неймспейсы? По стандарту ES6 предполагается использовать модули, в которых сущности по умолчанию приватные (ето в C++ нет модулей - только инклюды для импорта другого кода, так что там нужны неймспейсы чтобы конфликтов имен было поменьше). Или это фишка для nested modules?
      Ответить
      • Когда мелкомягкие придумали TS (Появился в 1 октября 2012), никакого ES6 еще не было
        Ответить

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