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

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    function display(id:number, name:string)
    {
        print("Id = " + id + ", Name = " + name);
    }
    
    function main() {                                                 
    	display(1, "asd");
    }

    А ваш говно компайлер умеет так делать?

    >> Output:
    Id = 1., Name = asd

    Запостил: ASD_77, 07 Мая 2021

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

    • погнали обгаживать С98. а ваш говнокомпайлер может так (за основу берем С)
      Ответить
    • > Конкатенация плюсами
      > Конкатенация строк внутри print, вместо высирания iolist-подобной структуры сразу в дескриптор
      Функциональные звуки неодобрения
      Ответить
    • Мой — умеетヽ(*⌒▽⌒*)ノ!
      def display(id: int, name: str):
          print(f'Id = {id}, Name = {name}')
      
      
      def main():
          display(1, 'asd')
      
      
      main()
      
      # Id = 1, Name = asd


      Ня понимаю, почему в 2021-м году в языках ня делают интерполяцию строк.
      Ответить
      • а разве python это компайлер?
        Ответить
        • Лучше: в Python есть компайлер!
          https://docs.python.org/3/library/py_compile.html
          Ответить
          • ну это спорно... я бы сказал что это препроцессинг наверно. ну ладно пусть будет компайлер
            Ответить
        • Да, в байт-код, как жаба. Можно и JIT компиляторы подключить.
          Ответить
          • >Можно и JIT компиляторы подключить.
            но в сипитоне его нет
            Ответить
      • Чей это виртуал?
        Ответить
        • Высказываются теории, что это gost.
          Ответить
          • Ну а кто тут ещё умеет и юзает статическую типизацию питона?
            Ответить
      • интерполяцию потом запилю....
        Ответить
      • И мой тоже так умеет, вот, посмотри :з

        https://play.nim-lang.org/#ix=3m54

        import strutils
        
        const kek = "cockadoodledoo"
        const str = "koko" & ("pokpok $#" % kek)
        
        echo str
        
        // Output: kokopokpok cockadoodledoo

        Так как все переменные типа «const», str себя отформатирует и сконкатенирует как надо ещё на этапе конпеляции. Здорово, правда? :>
        Ответить
    • Что хотел сказать автор?
      Ответить
      • хотел сказать что C не может это делать на уровне компилятора :)
        Ответить
        • Так ведь может же!
          https://govnokod.ru/26864
          Ответить
          • там нет оператора +
            Ответить
            • Можня добавить!
              #include <stdio.h>
              #include <stdlib.h>
              
              #define SPLICE(a,b) SPLICE_1(a,b)
              #define SPLICE_1(a,b) SPLICE_2(a,b)
              #define SPLICE_2(a,b) a##b
               
               
              #define PP_ARG_N( \
                        _1,  _2,  _3,  _4,  _5,  _6,  _7,  _8,  _9, _10, \
                       _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
                       _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
                       _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
                       _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
                       _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
                       _61, _62, _63, N, ...) N
               
              /* Note 63 is removed */
              #define PP_RSEQ_N()                                        \
                       62, 61, 60,                                       \
                       59, 58, 57, 56, 55, 54, 53, 52, 51, 50,           \
                       49, 48, 47, 46, 45, 44, 43, 42, 41, 40,           \
                       39, 38, 37, 36, 35, 34, 33, 32, 31, 30,           \
                       29, 28, 27, 26, 25, 24, 23, 22, 21, 20,           \
                       19, 18, 17, 16, 15, 14, 13, 12, 11, 10,           \
                        9,  8,  7,  6,  5,  4,  3,  2,  1,  0
               
              #define PP_NARG_(...)    PP_ARG_N(__VA_ARGS__)    
               
              /* Note dummy first argument _ and ##__VA_ARGS__ instead of __VA_ARGS__ */
              #define PP_NARG(...)     PP_NARG_(_, ##__VA_ARGS__, PP_RSEQ_N())
              
              
              #define PRINT_1(a1) \
                printf(a1);
               
              #define PRINT_3(a1, p1, b1) \
                printf(a1, b1);
               
              #define PRINT_5(a1, p1, b1, p2, a2) \
                PRINT_3(a1, p1, b1); PRINT_1(a2)
               
              #define PRINT_7(a1, p1, b1, p2, a2, p3, b2) \
                PRINT_3(a1, p1, b1); PRINT_3(a2, p2, b2);
               
              #define PRINT_9(a1, p1, b1, p2, a2, p3, b2, p4, a3) \
                PRINT_7(a1, p1, b1, p2, a2, p3, b2); PRINT_1(a3);
              //..... дальше лень ...
               
              #define PRINTS_(N, ...) \
                SPLICE(PRINT_, N)(__VA_ARGS__)
               
              #define PRINTS(...) \
                PRINTS_(PP_NARG(__VA_ARGS__), __VA_ARGS__)
              
              
              int main(void)
              {
                  PRINTS("10 = %d" ,+, 10 ,+, "; 3 + 3 = %d" ,+, 3+3 ,+, "\n" );
                  return EXIT_SUCCESS;
              }

              https://wandbox.org/permlink/EFGzYyIARka89vYm
              Ответить
    • а да дамп забыл LLVM IR:

      https://pastebin.com/Deb32tJR

      если кому интересно
      Ответить
    • А код программы, сконпелированной твоим конпелятором, как-то будет оптимизироваться, как в крестах -O2 и -O3? Или “LLVM“ для этого и нужен? (не ябу что это)
      Ответить
      • оптимизация уже включена от LLVM :)
        Ответить
        • Раньше я думал, что компилятор - это переводчик с языка в асм. А во что ты переводишь и как это преобразуется в асм?
          Ответить
          • Чтобы не плодить сущности (20 языков на 20 рахитектур напрямую — потребовалось бы 400 компиляторов), современные компиляторы сначала преобразуют в промежуточный код. Там общий оптимизатор оптимизирует код, и затем собирает под нужную архитектуру. В итоге количество отдельных компиляторов = М+N, где М — количество поддерживаемых языков, а N — количество рахитектур.

            Чтобы добавит новый язык, нужно всего лишь написать переводчик его в IR. Трансляторы в нативный код из IR уже есть, их писать не надо. Оптимизатор IR кода уже есть, его писать не надо. Профит.
            Ответить
            • что мешает рассматривать llvm как частный случай асма, просто с большим кол-вом регистров (они там чуть ли не динамически появляются)?
              Ответить
              • Он и есть асм, просто более-менее удобный для дальнейших трансформаций по сравнению с платформо-специфичными асмами. Ну собственно байткод JVM и .NET -- тоже асм для какой-то виртуальной машины.
                Ответить
                • могу ли я считать .bat файл асмом для виртуальной машины "cmd"?
                  Ответить
                  • Наверное нет, команды слишком сложные.
                    Ответить
                    • У JVM действительно очень простые команды (за IL не скажу). Кажется, у JVM они даже влазят в один байт (в отличие от x86, лол)

                      Но при этом в JVM нет регистров (только стек) и есть очень высокоуровневые опкоды типа invokevirtual

                      А есть какое-то определение асма? Почему одно мы можем им считать, а другое нет?

                      .pyc файлы питона это асм?
                      Ответить
                      • > нет регистров

                        Ну и что? Что мне мешает запилить стековую машинку в железе? И кстати, там довольно жёсткие ограничения на работу с этим стеком, так что его проще считать большим банком регистров.

                        > invokevirtual

                        Не такой уж он и высокоуровневый... Да и в реальных железках часто бывают "сахарные" инструкции. Те же enter/leave на x86.
                        Ответить
                      • > Почему одно мы можем им считать, а другое нет?

                        Грань проходит по наличию реальной железки, имхо. Если есть проц, который это говно исполняет -- значит мышиный код. Если нету -- значит IR или байткод.
                        Ответить
                        • ..но тогда llvm и IL это асмы?
                          (picojava есть)
                          Ответить
                          • Вай нот?
                            Ответить
                            • там "не" проебалось))

                              Нету железок для исполнения IL и llvm, нет разве?
                              Ответить
                              • Х.з., стековая машинка jvm с 5-6 типами, как у обычных мышиных кодов, выглядит гораздо ближе к железу, чем llvm с его произвольными регистрами произвольной длины. За IL не скажу.

                                З.Ы. Но это можно реализовать, в принципе. 8, 16, 32 и 64 будут быстро работать, как и первые штук 30 регистров. А остальное уже через память и эмуляцию микрокодом.
                                Ответить
                          • Здесь ещё тонкий момент есть, что джавовский байткод, емнип, непригоден к исполнению т.к. команды в нём ссылаются на имена классов и методов.

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

                              Так что нужен просто умный загрузчик, как и в случае с ельфом
                              Ответить
                    • Где проходит граница между простой и сложной командой?
                      Ответить
          • в трах-позиционный кот сначала, конечно же
            Ответить

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