ЙажаСценарий / Говнокод #27540 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 ASD_77, (Updated )

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

  • У меня в "C" нет никакого "RTTI", а в "D" я его вырубаю нахрен, ибо не нужен мне этот оверхед заедушный!
    Ответить
      • Я изначально знаю, где какой тип у меня будет. А если не знаю, то я просто хуячу структуры с каким-то описателем типа, и передавать это говно через указатели, но это мне нахуй не надо
        Ответить
        • так и RTTI же примерно так и работает, тока это компилятор за тебя делает
          Ответить
        • юзай логику 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; }
          };
          Ответить
        • правильно. У него есть только статик, реинтерпретер и конст. Причем в одном флаконе
          Ответить
      • Зачем мне какие-то эксепшены? Это ж оверхед, под эксепшены нужно какое-то специальное говно, которое отслеживает всякие места, где это исключение может пойматься. См. https://habr.com/ru/post/208006/

        В "D" я их тоже вырубаю нахрен.
        Ответить
          • В «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
                          Ответить
                            • > недавно выпилили
                              Только это был не GC, а говно и палки, с помощью которых предлагалось сделать свой GC. Ими никто не пользовался (даже те, кто делал GC в крестах) поэтому и убрали.
                              Ответить
                              • А в «Nim» есть несколько разных «GC»: один перфоманснее другого! А ещё его можно отключить и течь.
                                Ответить
                                    • Перфоманс это когда у тебя даже хипа нет нихуя, все статически размещено в памяти контроллера. И какой-то там GC вообще смысла не имеет.
                                      Ответить
                                      • Перформанс – это когда я пишу лабу на асемблере и не знаю как выделить память, поэтому все данные хранятся прямо в регистрах.
                                        Ответить
                                        • > Перформанс – это когда я пишу лабу на асемблере и не знаю как выделить память

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

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

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

                                В непидорских средах и непидорских языках GC нет
                                Ответить
                      • 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?
                              Ответить
                                • скомпилял hello world. вроде я намного меньше генерю разного кода.
                                  Ответить
                              • Очевидно, сделать это проще, когда тип функции указан явно, с чего мы сначала и начали.

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

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

Где здесь C++, guest?!

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


    8