Re[10]: Чем современные шаблоны лучше макросов? :)
От: ArtDenis Россия  
Дата: 10.01.22 16:48
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>А если бы в языке изначально были условные конструкции, работающие на уровне компилятора ...


Просто хочется увидеть примеры кода как всё это может выглядеть для некоторых случаев
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[9]: Чем современные шаблоны лучше макросов? :)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.01.22 17:31
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>Ну, то есть те же самые C++ шаблоны, + концепты из нового стандарта


Концепты — очередной сугубо частный костыль, чтоб, упаси боже, не нарушить священную функциональную парадигму.

У>ты хотел бы, чтобы шаблоны с концептами были сразу в CFront?


Я хотел бы, чтоб концептов не было вообще, а конструкции вроде шаблонов были еще в позднем C — хоть на основе макросов (но не традиционных, а более адекватных).

У>Думаю, никто тогда такого вообще и помыслить не мог.


Да ну, макросредства в языках появились достаточно давно, но более убогих, чем в C/C++, насколько я знаю, нигде не было и нет. А делается-то ведь примитивно до невозможности. У компилятора всегда есть вся необходимая информация о программных элементах. Добавляем простые конструкции для извлечения этой информации, и столь же простые конструкции для условной компиляции по их результатам. Все, на этом просто и изящно делается львиная доля того, что было наколхожено на шаблонах за все время их существования.

У>Побочные явления, типа SFINAE, которое использовал Александреску, были в общем-то случайно обнаружены.


Да. И само то, что их так охотно подхватили и стали продвигать, лучше всего иллюстрирует извращенный характер мышления этих людей. Это что-то вроде строительства дома из пластиковых бутылок — выглядит круто и необычно, позволяет обрести известность и прослыть гуру, но для массового применения никак не годится.

У>Не что-то могу припомнить, в каком бы языке такое было бы сразу искаропки.


Например, в ассемблере 360/370 (60-е годы) был неимоверно мощный и удобный макропроцессор, на нем можно было черта сделать, поскольку там была доступна информация о трансляции (адреса, размеры переменных и т.п.). Но вот в ЯВУ почему-то всегда так получалось, что есть либо чистый макропроцессор (на уровне абстрактных лексем), либо навороченный (и часто полуинтерпретируемый) язык, либо скудный язык и минимумом или полным отсутствием макросредств.
Re[2]: Чем современные шаблоны лучше макросов? :)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.01.22 17:37
Оценка: 1 (1)
Здравствуйте, TailWind, Вы писали:

TW>В 99% случаев хватает виртуальных функций


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

TW>- сложность понять что написал 5 лет назад на шаблонах (имел негативный опыт)


Я с некоторых пор взял за правило описывать причины выбора тех или иных подходов, решений, конструкций — или в комментариях, или отдельно. Любая мало-мальски нетипичная конструкция через несколько лет рискует показаться бессмысленной и ненужной, а при удалении/переделке лезут глюки, и тогда вспоминается, для чего было сделано именно так.
Re[11]: Чем современные шаблоны лучше макросов? :)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.01.22 17:39
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Просто хочется увидеть примеры кода как всё это может выглядеть для некоторых случаев


Зачем Вам именно примеры кода? Неужто без этого не получается представить?
Re[12]: Чем современные шаблоны лучше макросов? :)
От: ArtDenis Россия  
Дата: 10.01.22 17:57
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Зачем Вам именно примеры кода? Неужто без этого не получается представить?


Не получается. Хочу примеры
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[13]: Чем современные шаблоны лучше макросов? :)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.01.22 18:19
Оценка: :))
Здравствуйте, ArtDenis, Вы писали:

AD>Не получается. Хочу примеры


Ну вот, например, примитивно, на псевдокоде, максимально приближенном к C/C++:

define is_signed (expr) {

  return (tostring (typeof (expr)) == "char" || tostring (typeof (expr)) == "int" || tostring (typeof (expr)) == "long" || tostring (typeof (expr)) == "float" || tostring (typeof (expr)) == "double");

}


Хотя и это тоже извращение. Для таких вещей любой вменяемый компилятор обязан иметь встроенные предикаты.
Re: Чем современные шаблоны лучше макросов? :)
От: B0FEE664  
Дата: 10.01.22 18:28
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Вот будь вместо шаблонов приличный макропроцессор, в котором можно и параметры вызова разобрать, и циклические конструкции использовать, и за счет объединения с компилятором использовать в условиях типы, классы и их свойства — какие у шаблонов остались бы преимущества?


Как вы на макропроцессоре решите следующую задачу:?
#include <iostream>


class Out
{
  public:
            Out&              operator <<       (int            n);
            Out&              operator <<       (const char* pStr);
    template <class T>
            Out&              operator <<       (T) = delete;
};


Out& Out::operator << (int n)
{
  std::cout << n;
  return *this;
}


Out& Out::operator << (const char* pStr)
{
  std::cout << pStr;
  return *this;
}


int main()
{
  Out o;
  int x = 1;
  o << x << "\n";

  unsigned int u = 0xFFFFFFFF;
  o << u << "\n";

  o << "\n    the end \n";
  return 0;
}

И каждый день — без права на ошибку...
Re[2]: Чем современные шаблоны лучше макросов? :)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.01.22 18:39
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Как вы на макропроцессоре решите следующую задачу:?


В чем именно заключается задача? И объем этого кода точно меньше, чем ее словесное описание?
Re[7]: Чем современные шаблоны лучше макросов? :)
От: T4r4sB Россия  
Дата: 10.01.22 18:47
Оценка:
Здравствуйте, удусекшл, Вы писали:


У>Я так понимаю, что он хочет что-то типа доступа к AST, чтобы можно было писать простые функции с циклами, набивающие AST дополнительными штуками, и чтобы эти функции писались на том же C++ и исполнялись во время компиляции. Что-то такое есть в C# вроде.


Или в Русте

https://doc.rust-lang.org/reference/procedural-macros.html
Re[8]: Чем современные шаблоны лучше макросов? :)
От: ArtDenis Россия  
Дата: 10.01.22 19:07
Оценка: 4 (2) :))) :))
Здравствуйте, T4r4sB, Вы писали:

TB>Или в Русте


В русте макросы настолько круты, что могут своровать твой закрытый ключ при открытии проекта с макросом: https://github.com/lucky/bad_actor_poc
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: Чем современные шаблоны лучше макросов? :)
От: ksandro Мухосранск  
Дата: 10.01.22 19:33
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>С чего бы вдруг? Есть множество способов расширения и синтаксиса, и семантики без малейшей потери совместимости.


С того, что тут придется создавать еще один метаязык, который должен как-то не испортить текущие шаблоны и макросы, мне кажется никто не готов взять на себя такую огромную работу. С++ и так уже переусложнен. Проблема в том, что это надо еще согласовать в коммитете по стандартизации. Никто за это не возьмется.

ЕМ>Так хоть бы попытались несколько раз. А то такое впечатление, что хаотично мечутся, добавляя сугубо частные возможности и закрывая столь же частные бреши, а об универсальных возможностях думают меньше всего.


Так пытаются, есть всякие предложения по reflection и обсуждают идеи метаклассов, но когда от абстрактных идей переходят к более менее конкретной логике, то понимают, что не осилят...

ЕМ>Это я в курсе. Но еще более неожиданным стало стремление делать на шаблонах все, что было технически возможным. А в силу пресловутой полноты оказалось, что делать на них можно вообще все без исключения. И возобладал подход "на кой совершенствовать язык, если можно нагородить пару десятков или сотен тысяч строк на шаблонах? нужно совершенствовать шаблоны!".


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

ЕМ>Если изо всех сил держаться за функциональный подход — непросто. А если принять возможность процедурного подхода, то в любой момент можно добавить конструкций для анализа и перебора параметров, условного включения фрагментов кода, повторения похожих по виду конструкций и т.п. Такая проблема давно известна — например, даже простейшие алгоритмы, будучи реализованы в виде конечных автоматов, могут приобретать совершенно неприличный вид и изрядную сложность в отладке.


Только вот примеров такого успешного внедрения мейнстрим в языки подобных фич, как-то не видно. Говорят в Расте что-то похожее есть, надо будет как-нибудь глянуть как будет время. А больше вроде нигде, все только в runtime.
Дело не в функциональном стиле, дело в том, что никому не хотелось добавлять еще один метаязык к существующим уже шаблонам и препроцессору.

ЕМ>Да ну, полно приверженцев ФП, для которых любая новая функциональная конструкция — еще один шаг к божественному.


У ФП, есть много преимуществ, например лучшее распараллеливание, лучшие возможности для ленивых вычислений и др. Но какие же реальные плюсы преимущества есть от ФП в шаблонном метапрограммировании. Просто других вариантов для С++ нет. И никто не осиливает сделать. Поэтому пользуются тем, что есть.

ЕМ>Да, хороший пример сугубо частного решения.

Ну, не все сразу. Вот когда-нибудь придумают синтаксис для compile-time списка разнотипных аргументов, и добавят "constexpr for", и будет счастье!

ЕМ>А при грамотном подходе еще полвека назад #ifdef мог бы работать так же.


Мне кажется тогда никто серьезно не задумывался о метапрограммировании... Считали что препроцессора достаточно.
Re[14]: Чем современные шаблоны лучше макросов? :)
От: night beast СССР  
Дата: 10.01.22 19:52
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Ну вот, например, примитивно, на псевдокоде, максимально приближенном к C/C++:


/// lib 1
define is_signed(expr) {...}

/// lib 2
class Number {};

/// main
assert(is_signed(Number) == true);


как?
Re[3]: Чем современные шаблоны лучше макросов? :)
От: B0FEE664  
Дата: 10.01.22 20:40
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

BFE>>Как вы на макропроцессоре решите следующую задачу:?

ЕМ>В чем именно заключается задача?
Запретить неявное преобразование типа.

ЕМ>И объем этого кода точно меньше, чем ее словесное описание?

Слова не точны, а код... Этот код хорош тем, что он не компилируется.
И каждый день — без права на ошибку...
Re: Чем современные шаблоны лучше макросов? :)
От: Went  
Дата: 12.01.22 10:16
Оценка:
Здравствуйте, Евгений Музыченко.
Макросы, объединенные с компилятором, это уже не просто макросы, а полноценные языковые конструкции. В которых, наверняка, будут и перегрузки, и рекурсия, и вариадики и прочие навороты. И все эти навороты нужно будет как-то записывать и поддерживать. Поэтому, противопоставляя одно другому, вы должны точно очертить, в чем принципиально "хорошие" макросы будут отличаться от текущих шаблонов. Простота и мощь текущих макросов, конечно, заманчива и кажется, что их "чуть чуть развить" и сразу они "похоронят" "переусложнённые" шаблоны. Но это только так кажется.
Re[4]: Чем современные шаблоны лучше макросов? :)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 12.01.22 14:00
Оценка:
Здравствуйте, ksandro, Вы писали:

K>С того, что тут придется создавать еще один метаязык, который должен как-то не испортить текущие шаблоны и макросы, мне кажется никто не готов взять на себя такую огромную работу.


Я ж не говорю, что это нужно делать сейчас — поздно, поезд давно уже идет под откос. А вот лет 20-30 назад, когда уже было достаточно хорошо видно, что template hell будет покруче macro hell, впору было задуматься.

K>Так пытаются, есть всякие предложения по reflection и обсуждают идеи метаклассов, но когда от абстрактных идей переходят к более менее конкретной логике, то понимают, что не осилят...


Во многом — потому, что пытаются удержаться в рамках принятой парадигмы. А в этом нет смысла — язык давно потерял всякое подобие стройности и логичности, и уже почти нет разницы, с какой стороны и в каком виде громоздить новое.

K>то, что с помощью шаблонов можно уже сейчас делать всякие прикольные штуки уже сейчас, а не ждать нового стандарта больше 10 лет, было для многих откровением. Поэтому на шаблонах все и стали делать.


И стало это сильно напоминать известный анекдот.

K>Вот когда-нибудь придумают синтаксис для compile-time списка разнотипных аргументов, и добавят "constexpr for", и будет счастье!


Да, с новым костылем, столь же частным, сколь и остальные.

ЕМ>>еще полвека назад #ifdef мог бы работать так же.


K>Мне кажется тогда никто серьезно не задумывался о метапрограммировании...


О метапрограммировании и задумывались, и пробовали еще раньше.

K>Считали что препроцессора достаточно.


Подозреваю, что в основном люди просто не видели нормальный реализаций макропроцессора.
Re[15]: Чем современные шаблоны лучше макросов? :)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 12.01.22 14:01
Оценка:
Здравствуйте, night beast, Вы писали:

NB>как?


Что именно "как"?
Re[4]: Чем современные шаблоны лучше макросов? :)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 12.01.22 14:04
Оценка:
Здравствуйте, B0FEE664, Вы писали:

ЕМ>>В чем именно заключается задача?

BFE>Запретить неявное преобразование типа.

Для этого не нужен макропроцессор. Нужны языковые средства задания допустимых правил преобразования.
Re[16]: Чем современные шаблоны лучше макросов? :)
От: night beast СССР  
Дата: 12.01.22 14:06
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

NB>>как?


ЕМ>Что именно "как"?


как это будут выглядеть на твоих макросах?
Re[2]: Чем современные шаблоны лучше макросов? :)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 12.01.22 17:27
Оценка:
Здравствуйте, Went, Вы писали:

W>Макросы, объединенные с компилятором, это уже не просто макросы, а полноценные языковые конструкции.


Ну да. Это средства, позволяющие компилятору при обработке исходного кода порождать новый исходный код, и тут же его обрабатывать.

W>В которых, наверняка, будут и перегрузки, и рекурсия, и вариадики и прочие навороты.


Зачем там перегрузки? Каково их возможное применение? Рекурсия там была бы обязательно, но контролируемая более явно и точно, нежели в шаблонах. "Вариадики" в таких конструкциях не нужны — это костыль исключительно для функционального стиля. Представьте, что в сишную main вместо argc/argv передавались бы "вариадики".

W>вы должны точно очертить, в чем принципиально "хорошие" макросы будут отличаться от текущих шаблонов.


Я ж вроде описал — более естественным и понятным способом развертывания, обработки параметров, управления порождением кода. Тем же, чем любой процедурный язык отличается от любого функционального. Математические задачи, моделирование и подобное на ФЯ решаются удобно и изящно, но как доходит до реализации обычного последовательного алгоритма, так сразу начинаются пляски.

W>Простота и мощь текущих макросов


У Вас слишком много ошибок в словах "примитивность" и "убожество".

W>кажется, что их "чуть чуть развить" и сразу они "похоронят" "переусложнённые" шаблоны.


Повторю: речь не о том, чтобы сейчас заменить шаблоны "продвинутыми макросами" — это очевидно невозможно без создания новой версии языка. Речь о том, что сперва был реализован примитивный и неудобный препроцессор, затем он заботливо сохранялся два десятка лет, а затем, "для избавления от macro hell", были созданы шаблоны, которые создали hell почище прежнего.
Re[17]: Чем современные шаблоны лучше макросов? :)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 12.01.22 17:29
Оценка:
Здравствуйте, night beast, Вы писали:

NB>как это будут выглядеть на твоих макросах?


В этом примере is_signed вернет false, и assert обломается. А чего хотелось-то?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.