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

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
function main() {
    const o = {
        v: "Hi",
        toString() {
            return this.v;
        },
    };
    print(o);
}

Хочу напомнить о себе, а то люди начали забывать :)...

Запостил: ASD_77 ASD_77, (Updated )

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

  • думаю как захостить мой "компилятор" что бы люди могли поиграть с компилятором в онлайне? Проблема в том что надо сервер который может exe запускать ..а таких думаю не много в мире
    Ответить
    • > exe

      Ну да, виндовая VPS'ка скорее всего будет дороже линуксовой из-за лицензии... А под линух ты ещё не портанул его?

      З.Ы. Можно под вайном попробовать, один фиг тебе там только файлы читать да писать.
      Ответить
      • под линух уже давно работает. там только надо c-функции промапить правильно
        Ответить
        • Ну тогда в чём проблема? Любая VPS'ка за 5 баксов сойдёт.
          Ответить
              • ну да и что компилятор тоже можно в линухе скомпилировать.. а то я уже думал как его через WASM скомпилять 🙂
                Ответить
                  • именно это я и хотел сделать ... но как представлю кол-во не про имплементированных функций - что это задача может быть не реализуема
                    Ответить
                    • Да я не думаю, что конпелятору прям много функций от платформы надо... Я больше за размер боюсь.
                      Ответить
    • Jekyll только статика AFAIK.

      Но ты рядом можешь поднять nginx или apache и в добрый путь
      Ответить
    • Конкретно им не пользуюсь, но вроде идея всех генераторов статики просто в том, чтобы высрать html, который отдавать как статику без CGI?
      P.S. Как макака ответил, тебе всё равно понядобится сервант, чтобы эту статику раздавать, в конфе у него же можешь и CGI записать.
      Ответить
    • А ты прямо запускать юзерский код планируешь, или отдавать дампики? Если первое, то твой сервант проживёт в интернете примерно пять минут.
      Ответить
        • и как это помешает юзерскрипту послать сообщение "ВЗОРВУ ВАС НАХУЙ" на емейл krenlin.gov.ru ?
          Ответить
          • А зачем давать ему сеть?

            Ну для максимальной паранойи можно в начале экзешника отречься от всех сисколлов кроме read и write. И дальше юзерский код хрен что сделает.
            Ответить
            • >отречься от всех сисколлов кроме read и write.
              можно, но это сильно ограничит возможности.
              Ответить
              • Ну для тестовых программок как на ideone вполне достаточно будет. Разве что sbrk стоит заранее сделать, потому что потом в mode 1 его уже не позвать, а mode 2 где можно выбрать набор сисколлов настраивать сложнее.
                Ответить
                • а mmap тоже не давать? Тогда malloc обосреца на больших кусоках
                  Ответить
                  • Можно другой аллокатор вкомпилить, более простой или более управляемый.
                    Ответить
                    • можно заранее ммапнуть кусок памяти, дать его хендл, и нехай туда срёт

                      гига памяти хватит всем
                      Ответить
            • Даже это много.

              write ведь принимает дескриптор открытого файла? Можно брутом дескриптора насрать во все открытые файлы, запоров файловую систему сервера. Так что ему ещё нужно права лоховские дать.
              Ответить
              • так open(2) не давать

                дали тебе дескриптор 1 (stdout) и 2 (stderr)
                туда и серь
                Ответить
                    • Кстати, а как это правильно реализовать на пинде?
                      Никак? Sandbox? виртуалка?
                      Ответить
                      • Посмотри в хроме. Секскомп вроде они и завезли в прыщи.
                        Ответить
                        • Ну вот, опять ненужная корпорация что-то завезла в свободолюбивый Linux
                          Ответить
              • > насрать во все открытые файлы

                А нахуя ты наоткрывал всяких файлов перед запуском юзерского кода?
                Ответить
        • Докер не про недоверенный код. Нужно что-нибудь типа bubblewrap или Firejail.
          Ответить
      • ыы.. ту думаешь хацкеры настолько суровы что могут работать с ОС.. они хотябы поняли как "маллок" прикрутить динамически 🙂
        Ответить
        • const a = new Int32Array(1024 * 1024 * 1024 * 8);
          a[1024 * 1024 * 1024] = 42;

          и сипец твоему серверу
          Ответить
        • > работать с ОС

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

            З.Ы. Хотя там вроде нельзя взять и напрямую выделить буфер с нужным контентом на стеке? Ну сотню-другую интов положим, не проблема.
            Ответить
      • можно генерировать WASM и возвращать обратно в броузер для запуска.
        Ответить
        • И как я пойму, что ты меня не нашутил, и не исполнил мой TS код скомпилировав его в JS?
          Ответить
        • Можно всё вынести в вротэнд, т.е. в WASM скомпилировать хуйню, которая генерирует WASM, и ей генерировать WASM через браузер
          Ответить
  • toString() {
                return this.v;
            },

    это ты ловко тип вывел, или у тебя ``toString()`` any вернул?
    Ответить
      • В смысле все объекты неявно наследуют родителя, у которого этот метод определен как возвращающий `string`?

        Я к тому, что не нужно явно
        toString(): string

        ?
        Ответить
        • ну тут просто ... toString() пренадлежит обьекту { v: string }, а тип v определяется из значения поля.
          Ответить
            • там все просто.. если тип можно определить по значению.. то берется он. если нельзя тогда тип нужно предоставлять самому. это как "auto" в с++
              Ответить
              • const foo = (true ? "A" : 42);
                const bar = (buz() === qux() ? "A" : 42);

                Какой тип foo? А у bar?
                Ответить
                • У bar наверное (String | Integer), с точностью до синтаксиса?

                  foo, возможно, получится оптимизнуть и уточнить тип.
                  Ответить
                  • Только наверное

                    ``string | number``
                    Мы же не про жабу говорим

                    В жабе юнионов нет. И не путайте в JS `string` и `String` !
                    Ответить
                      • Но ведь юнионы это одна из киллфич TS
                        Ответить
                        • не все юнионы одинаково полезны в С. вот такой юнион приветсвтуется

                          type Shape =
                              | { kind: "circle", radius: number }
                              | { kind: "square", sideLength: number };


                          а такой юнион "number | string" - нет
                          Ответить
                          • потому что kind можно проверить в рантайме, а ``typeof`` нет?
                            Ответить
                          • Что мешает реализовать number | string как tagged union? Тем более он у тебя по-любому уже реализован для any.

                            Неэффективно, да. Но программист сам так написал.
                            Ответить
                            • ну я сейчас не думал еще.. но думаю можно просто добавкой невидимого "enum"-а решить эту проблему
                              Ответить
                • > Какой тип у bar?

                  buz() === qux() ? String : Integer

                  З.Ы. Хотя из-за мутабельности и нечистоты так не получится, скорее всего. Зависимые типы сложно будет подружить с привычными языками...
                  Ответить
                • ответ да будет юнион .. но в "с"-подобном языке юнионы бесполезная штука т.к. из за отсутствия RTTI определить какой там тип не представляется возможным. т.к. что бы решить вопрос нужно применить общий тип.
                  Ответить
                  • > отсутствия RTTI
                    Ну ты же в курсе как это решает TS, правда?
                    Ответить
    • хотя идея интересная что будет если заменить v на другой тип и позырять что будет
      Ответить
      • Попытается потом позвать toString() у типа, который вернули?
        Ответить
        • ну да... v автоматом будет кастанутый на string т.к. результат toString всегда string
          Ответить
          • А если я напишу что-то в духе toString() { return this; }, то всё повиснет нафиг?
            Ответить
            • Хвала Яхве нет
              > const bormand = {toString: ()=> this};
              > parseInt(bormand);
              Uncaught TypeError: Cannot convert object to primitive value
                  at parseInt (<anonymous>)


              Вернулся объект, и всё упало.

              Обычный же объект вернет `[object Object]`, и будет NaN.

              Удобно, правда?
              Ответить
  • - Я так раньше никогда не делала. Мне понравилось. А тебее? - сказала она после того, как я влил в неё свой заряд и, уставший, уселся прямо на ковролин на полу кабинета.
    Ответить
  • -Да, мамочка, ты классная блядь! Юрка принялся целовать маму взасос…
    Ответить
  • У жeны oкaзaлся любoвник, и я уeхaл, брoсив всё, в дaльнee Пoдмoскoвьe, гдe у мeня былa oднoкoмнaтнaя квaртирa
    Ответить
  • -Да, мамочка, ты классная блядь! Юрка принялся целовать маму взасос…
    Ответить

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

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

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


    8