А почему макросам не радуются?
Nov. 7th, 2012 08:03 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Макросы - это признание поражения. "Наш язык оказался недостаточно хорошо, нам придется генерировать программы на нём, чтобы продолжать притворяться, что мы пишем на нём".
Во-первых, тут явно подразумевается, что кодогенерация является чем-то плохим и доказывает несостоятельность языка, как средства для написания программ. Из моего ежедневного: редактировать форму мне удобней в графическом дизайнере, просматривать схему базы данных и редактировать связи между таблицами опять же удобней в графическом представлении. По-моему, очевидно, что если существуют разные способы выполнить одну работу, то надо выбирать самый удобный. И либо у нас есть серебряная пуля, либо для каждой задачи существует свой самый удобный инструмент. А чтобы это все как-то между собой взаимодействовало о совмещалось, надо приводить к одному знаменателю. Например, к текстовому представлению в виде кода на определенном языке программирования. Этот способ не единственный, но, на мой взгляд, достаточно практичный и удобный.
Во-вторых, языки развиваются и видоизменяются. При этом во время компиляции многие известные мне языки сначала рассахариваются в некоторое подмножество языковых конструкцию, после чего код на этом подможестве преобразуется в AST и поехало. Специальный синтаксис для монад (linq query syntax в C#, do-нотация в Haskell), asyc/await в C#, сахар для стрелок в том же Haskell, препроцессоры OCaml и множество других примеров. Интересно, нормально ли после каждого релиза с подобными изменениями, упрекать авторов в том, что их язык оказался недостаточно хорош?
В-третьих, существуют расширения компилятора. Для Haskell'а они активно используются и даже можно встретить мнения, что часть этих расширений пора включить в стандарт. Для C# делается некий проект Roslyn, который должен позволить пилить аналогичным образом расширения для главного языка дотнетов. На мой взгляд, это свидетельсво того факта, что разные люди по-разному видят развитие инструмента и работают в соответствующем направлении. Расширение его возможностей или наоборот специализация - это нормально. Но можно, например, заявить про признание поражения.
На мой взгляд, имеет место быть "ваша пуля не серебряная", а это как-то не серьезно.
Код с макросами очень трудно отлаживать.
Этот пойт я не понял. Я пишу на Немерле, и код с использованием макросов в отладке ни чем не отличается от кода без них. Откуда могут быть проблемы? Было выражение, потом на этапе компиляции оно раскрылось в другое выражение. И итоге получается простой линейный код с нормальными именами переменных. Проблемы - это когда стираются имена аргументов, когда стейт шарится между кучей объектов, когда стектрейс растягивается на два экрана, когда куча всего вычисляется лениво и ошибки этих вычислений экранируются и игнорируются или пихаются в стейт, когда все это вычисляется в нескольких потоках наступает ад. Макросы ничего в этот список не привносят. Есть еще отладка самих макросов, но это дело скорее неудобное чем сложное, по крайней мере, применительно к Немерле.
Практически деткам в руки дали не спички, а сразу тротиловые шашки. Представляю, что на этом могут построить наши индийские братья по разуму.
Во-первых, всем всем равно, чем занимается контингент именуемый здесь "индийские братья по разуму". Сколько лет я программирую, столько лет слышу эти рассказы, иногда вижу какие-то подтверждения. Если человек склонен к превращению кода в ад, он это сделает. Они этим занимались на Lisp, занимались на Си, занимаются на Java, будут заниматься на любом другом языке. (Я считаю, что в той или иной мере мы все к этому склонны, просто не всегда рядом есть кто-то, способный увидеть сумасшествие и указать на это, как и не всегда есть желание обсуждать подобное. А вопрос как раз и состоит в постоянном развитии и совершенствовании. И приоритеты в этом развитии могут быть разными).
Во-вторых, я не вижу, чтобы слабые программисты лезли использовать мощные и сложные средства. То есть существует некий контингент постоянно стремящийся интегрировать в проекты НОВЬЕ из последнего выпуска журнала Хакер или статей на Хабре, но там либо старшие товарищи останавливают, либо все желание пропадает, пока новатор разбирается с новой игрушкой. А те программисты, которые ничем не интересуются, пишут на небольшом примитивных подмножестве языка, мирно делаю свои велосипеды и никому жизнь портить не пытаются. (Всегда забавляет эта ежемесячная статья на Хабре "Что такое атрибуты в дотнете и зачем они нужны" и куча комментариев вроде "интересно, спасибо, прочитал") А макросы в статически типизируемом языке с негомоиконичным синтаксисом - штука сложна, очень сложная. И вроде,
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Скала очень сложная и без макросов.
- Ребята, я конфетки вам принес
- Не надо, у нас уже есть БАГЕТ. Очень сытный
То есть, я каким-то серьезных аргументов против макросов в Скале пока не увидел. Не хотят люди пользоваться - никто не заставляет. Не знают, какие задачи будут решаться макросами - но ведь никто и не спрашивает. Да и часто не читают про эти самые макросы, то у там С++, то сишка, то рефлексия тормозит.
(no subject)
Date: 2012-11-07 04:42 pm (UTC)(no subject)
Date: 2012-11-07 06:29 pm (UTC)(no subject)
Date: 2012-11-07 06:37 pm (UTC)пример
с макросами такие вот трейсы отлаживать будет не то, чтобы сложно, а сложно в сотой степени двойки. Потому что у меня в исходном коде даже и строки такой не будет, на которой оно уебется в говно, и нужно будет чесать репу - a$b$c at Source.scala:110 при общем количестве строк в Source.scala в 20 - это куда смотреть?
так понятнее?
(no subject)
Date: 2012-11-07 06:46 pm (UTC)(no subject)
Date: 2012-11-07 08:08 pm (UTC)"Попробовать и убедиться" - увольте. Я уже неоднократно говорил, что Scala не подходит для эффективной работы, особенно в функциональном стиле. Вот начнут компилировать в нативный код, чтобы объекты занимали ровно столько, сколько нужно, тогда и посмотрим. Если смогут, конечно.
Тем не менее, идеи интересные есть, за что большое спасибо.
(no subject)
Date: 2012-11-07 08:20 pm (UTC)При генерации отладочной информации есть вариант оставлять все как есть, т.е. раскрытия макросов будут для дебаггера каждое схлопываться в одну строчку (соответствующую вызову макро-функции). Тогда стек трейсы будут нетронутыми, но посмотреть в дебаггере раскрытый исходник не получится. Так работает прямо сейчас.
А в будущем добавим вариант запоминать результаты раскрытия макросов и сохранять информацию о них в отладочной информации. Тогда дебаггер сможет по этой информации воссоздать исходник с раскрытыми макросами, и отладка будет вестись как будто этот исходник был вручную написан программистом.
Про "попробовать и убедиться" я предлагал уважаемому
(no subject)
Date: 2012-11-07 09:00 pm (UTC)К TurboAssembler прилагался отличный отладчик. Он назывался td.exe. ТурбоДебаггер. А ещё был td386.exe, который позволял использовать больше памяти MS-DOS.
Это я к тому, что я не понаслышке знаком с отладкой раскрытых макросов.
(no subject)
Date: 2012-11-08 01:50 am (UTC)так уже же
есть scala под llvm, его конечно надо потыкать палочкой что бы убедится что оно живое, но как proof-of-concept вполне годится
(no subject)
Date: 2012-11-08 09:26 am (UTC)А то компилирующаяся в машинный код Scala будет иметь все минусы - и большие накладные расходы, и трудности с библиотеками.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
Date: 2012-11-07 08:58 pm (UTC)да что там макросы, взять для примера обычную скалу как она есть в 2.9.1
почему-то оно сначала уебалось на строке с декларацией класса, потом уже в нужном месте
тестовый код при это выглядит как:
и никаких макросов, но ПЕРВЫМИ строчками в трейсе идет какой-то аццкий буллшит. При
СталинеГослинге такого не было. Я читаю эти имена функций в трейсе и мне натурально становится жалко тех людей, которым не дай бог придется это поддерживатьТеперь взять эти макросы - они сделают все только хуже и еще более нечитабельнее в плане трейсов.
(no subject)
Date: 2012-11-07 09:28 pm (UTC)(no subject)
Date: 2012-11-07 09:55 pm (UTC)scala была бы ок, если бы собиралась в нативный код, или если бы у неё была своя VM, как у хаскеля.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
Date: 2012-11-08 01:54 am (UTC)(no subject)
Date: 2012-11-08 05:04 am (UTC)В C# и С++ для этого #line есть или как там его, в жабе не знаю.
Если по хорошему - то надо указывать два номера строки - до раскрытия и после раскрытия, вплоть до вкручивания оригинальных номеров внутрь манглинга имен. :)
(no subject)
Date: 2012-11-07 07:20 pm (UTC)Сам по себе макрос ни строчки в стэктрейс не добавляет, его формируют вызовы функцию.
Куда и как смотреть зависит от особенностей отладчика и от правильно протаскиваемых Location через все уровни преобразования.
Игрушечный пример.
Макрос for
раскрывается вот в такое представление (показан уже типизированный код)
Отлаживается оно самым обычным привычным образом и со строчками никакой неразберихи нет.
(no subject)
Date: 2012-11-07 08:57 pm (UTC)дальше по развернутому коду оно скажем упарывается в строке 45, хотя по факту упоролось в строке 21.
как я об этом догадаюсь?
примеры того, что происходит в Scala/Clojure я уже привел, номера строчек там часто вообще ничего не значат, так как могут указывать на сигнатуру класса в том числе.
(no subject)
Date: 2012-11-07 09:26 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
Date: 2012-11-07 06:06 pm (UTC)Но по факту-то действительно странно такое отношение. Не нравиться не ешь. Но всем что-то пох...
(no subject)
Date: 2012-11-07 07:50 pm (UTC)(no subject)
Date: 2012-11-07 07:59 pm (UTC)Что может быть хуже...
(no subject)
Date: 2012-11-07 08:03 pm (UTC)(no subject)
Date: 2012-11-07 08:05 pm (UTC)(no subject)
Date: 2012-11-07 08:08 pm (UTC)(no subject)
Date: 2012-11-29 12:16 pm (UTC)(no subject)
Date: 2012-11-29 09:00 pm (UTC)