ЙажаСценарий / Говнокод #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 ASD_77, (Updated )

Комментарии (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-м году в языках ня делают интерполяцию строк.
    Ответить
  • Что хотел сказать автор?
    Ответить
    • хотел сказать что C не может это делать на уровне компилятора 🙂
      Ответить
          • Можня добавить!
            #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
            Ответить
  • А код программы, сконпелированной твоим конпелятором, как-то будет оптимизироваться, как в крестах -O2 и -O3? Или “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 регистров. А остальное уже через память и эмуляцию микрокодом.
                              Ответить
                        • Здесь ещё тонкий момент есть, что джавовский байткод, емнип, непригоден к исполнению т.к. команды в нём ссылаются на имена классов и методов.

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

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

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

Семь раз отмерь — один отрежь, guest!

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


    8