Куча говна / Говнокод #27847 Ссылка на оригинал

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
https://www.evilfingers.com/publications/research_RU/oldnewlang.pdf языки, которые мы потеряли

...

Кстати, тот, кто считает, метапрограммирование достижением последних десятилетий, — жестоко
ошибается. Да, в языке Си++ оно появилось совсем недавно и в полном объеме (описанном в 
последних редакциях Стандарта) не реализовано ни в одном реально существующем компиляторе, a
Nemerle и R# (языки программирования для платформы .Net со встроенной поддержкой
метапрограммирования) — вообще младенцы, но на самом деле концепция метапрограммирования
возникла еще во времена палеолита. Lisp, появившийся в далеком 1958 г., — хороший пример
языка, естественным образом поддерживающий метапрограммирование, одной из задач которого
является создание программы, выводящей точную копию своего собственного исходного текста — так
называемый куин (англ, quine). На Lisp'e он записывается так:

(funcall (lambda (x) 
               (append x (list (list 'quote x))))
             '(funcall (lambda (x) 
                          (append x (list (list 'quote x))))))

             Листинг 1 программа на Lisp'е, распечатывающая сама себя

На Си так:

#include<stdio.h>
char*i="\\#include<stdio.h>",n='\n',q='"',*p=
"%s%cchar*i=%c%c%s%c,n='%cn',q='%c',*p=%c%c%s%c,*m=%c%c%s%c%c;%s%c",*m=
"int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n);}"
;int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n);}

А теперь попробуйте реализовать тоже самое на Си++ с использованием шаблонов и посмотрите, насколько
сильно они вам «помогут».

Крестобляди соснули

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

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

    • Язык Си++ оказал огромное влияние как на мышление программистов, так и на развитие всех последующих языков, став стандартом де-факто. Никто, естественно, не говорит, что ООП- и метапрограммирование— это плохо. Почему обязательно плохо?! Очень даже хорошо! Местами. Но вот мысль о том, что ООП — единственно правильный подход — ужасна. Самолеты и космические корабли мирно сосуществуют с велосипедами и автомобилями. Никому ведь и в голову не придет летать за сигаретами на ракете, особенно если сигареты продаются в киоске на соседнем углу.

      Но ведь это же неправильно! Появление ракет _должно_ перевернуть наше мышление! Поэтому — строим киоск за орбитой Плутона и каждому даем по ракете, чтобы туда летать, а горючее покупаем за деньги, вырученные от строительства космодромов и продаж ракет. Кто не может строить ракеты — пусть учит других, как на них летать. Сколько создается новых рабочих мест и главное, что все в бизнесе. Вот тут уж действительно, возврата в прошлое нет... Сигареты стоят миллиарды долларов, и деньги в индустрию вращаются просто огромные. Кто же захочет от них отказываться?! Напротив, ракеты будут стремительно «совершенствоваться», чтобы за сигаретами можно было летать даже на Альфу-Центавра.
      Ответить
      • Говорите, что это нелогично и невозможно? Но ведь именно такая ситуация сложилась с Си++. Судите сами — реализация компиляторов языка Си++ очень сложная и дорогостоящая задача, а сам язык настолько обширен и объемен, что его изучение требует невероятных усилий. Чтобы окупить средства, вложенные в разработку компиляторов, фирмы вынуждены «подсаживать» на него миллионы программистов, которые, пройдя длительный (и ужасно мучительный) путь обучения Си++, просто не могут признаться себе в том, что напрасно убили десять лет своей жизни (данной человеку лишь однажды!) и что стоящие перед ними задачи с ничуть не меньшей эффективностью реализуются на чистом Си и других процедурных языках, легко осваиваемых на ходу без отрыва от производства. Вот они и начинают убеждать остальных, что процедурные языки давно мертвы. Сложность ради сложности.
        Ответить
      • первый язык который научил меня программировать - это C# - когда мой моск не был забит проблемами выделения и управления памятью
        Ответить
        • > мой моск не был забит проблемами выделения

          То есть, ДО говнокода?
          Ответить
        • Зато он стал забит проблемами выделения "классов" и "интерфейсов".

          Ну и проблемами закрытия ресурсов, отличных от памяти, лол.
          Ответить
          • на крестах точно так же стоит "проблема" "выделения классов и интерфейсов"
            Ответить
            • Там можно забить и ебашить по-сишному, если сова на глобус не налезает. Это к слову про "местами" из цитаты выше.
              Ответить
                  • это типа ты отрезал себе ноги и спрашиваешь "где теперь твой велосипед"?
                    Ответить
                  • static методы и всё, в чем проблема?
                    Ответить
                      • рассматривай его как namespace. Это не главная проблема С# кмк)

                        В коко кстати есть топлевел функции
                        Ответить
              • если бы каждый раз, когда борманд минимум на треть правит свой комментарий, мне давали даже не доллар, а гривну, то
                Ответить
                • Ну что поделать, у меня мозг так работает. Не умею с первого раза вчистовую.
                  Ответить
                  • А потом идешь с работы домой и вдруг думаешь: а надо было еще так написать! А уже и 5 минут прошло, и комп далеко.
                    Ответить
                    • Именно поэтому я за ограничение в 5 минут, которое делает процесс написания коммента конечным.
                      Ответить
        • >C# - когда мой моск не был забит проблемами выделения и управления памятью

          В C# есть value types, так что понимать про память там надо. А вообще там есть GC, и без понимания памяти ты сделаешь мемори лик
          Ответить
          • Да-да, value types. Сначала они отказались от звездочек, потому что указатели - это сложно, а через несколько лет ввели value types. A еще строка или массив могут быть null, потому что все объект.
            Ответить
                • struct это и есть value types в C# (в отличие от C++)

                  value types имеют семантику.. ээ.. value types. Они копируются по значению, передаются по значению итд.

                  Классы это reference types, ну они понятное дело живут на куче, и с ними работают по референсу
                  Ответить
      • Потому что люди идиоты.

        ООП это инструмент. Как молоток или паяльник. Иногда он нужен, иногда нет.
        Ответить
  • А что такое "метапрограммирование"? Мета- это значит "между".
    Стало быть, между клавиатурой и программистом находится некая субстанция, так что ли?..
    Ответить
  • Такое ощущение, что метапрограммирование на текстовых языках - это изначально дохлый номер. Куда ни посмотрю - то сам язык неудобный, то возможности метушения ущербные и приткнуты к языку сбоку. В общем, жду (или сам запилю 8D) хороший инструмент для редактирования AST напрямую и надеюсь, что там с этим будет получше. Кстати, надо будет посмотреть, как там MPS поживает. В прошлый раз он был сильно непродуманный и страдал генерализованной джавой.
    Или всё-таки есть язык, настоящее метапрограммирование на котором не выглядит как кандидат сюда и который можно на практике поприменять?
    Ответить
    • Конечно есть такой язык, TCL LISP называется.

      Доступ к AST конечно лучше, чем доступ к тексту (или чем вообще никакого доступа), но он может оказаться слишком низкоуровневый.

      Взять, например, груви: https://dzone.com/articles/groovy-ast-transformations

      >MPS
      вроде он никому не нужен. Чувак из JB, который всю вторую половину нулевых носился с идеей DSL, давно к нему охладел (и все остальные люди после chief/puppet/gradle/cocoa pods тоже поняли, что DSL не нужен).
      Теперь они пишут на котлине.
      Злые языки говорят, что даже Youtrack теперь вместо MPS использует JS
      Ответить
      • Сложно придумать более подходящий для метушения на уровне AST язык, чем лисп... Замена скобочек на другие не считается, само собой.

        Как только начнёшь добавлять новые синтаксические конструкции, метушить станет сложнее.
        Ответить
    • Просто язык удобный для метушения должен иметь регулярную запись в формате сериализации данных, простом для парсинга вроде S-expr или yaml.

      Зоответственно либо писать на таком языке неудобно (много синаксиального мусора вроде скобочек). Либо писать удобно, но нужен сложный парсер чтобы разбивать питушню на термы.
      Ответить
    • Программирование на рулонных языках - дохлый номер

      /fxd
      Ответить
  • мы студентам на курсе кокпиляторов даем бонусные баллы за написание квайна для их языка/компилятора, обычно им это упражнение очень нравится
    Ответить
  • Русский каннибал признался, что ему не понравился язык жертвы
    Ответить
      • Как по мне - все инкубаторы одинаковы. Я не привередлив.
        Завещание уже можно составлять. Представь, как твои родичи бегают по чинушам с бумажками...
        Ответить
    • Русский язык в умелых руках и в опытных устах красив, певуч, выразителен, гибок, послушен, ловок и вместителен. (А. Куприн.)

      ниасилил карочи
      Ответить

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

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

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


    8