Re[25]: Что дает template metaprogramming (по сравнению с др
От: dead0k  
Дата: 27.02.18 11:37
Оценка:
Здравствуйте, alex_public, Вы писали:

_>В Rust'е есть полноценные синтаксические макросы, так что метапрограммирование там гораздо более сильное, чем в C++. Т.е. все задачи из области МП, решаемые на C++ запишутся и на Rust'е, причём чаще всего более лаконично.

А чего тогда в раст добавляют поддержку higher-kinded-types (вроде через макросы энто дело тоже реализуется). Сдается мне, что это аргумент в духе "на constexpr можно написать компилятор раста и сразу гейм-овер". (еси чо, не бейте, я сегодня первый день код раста читаю )
Re[16]: Что дает template metaprogramming (по сравнению с дру
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.02.18 12:16
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Более того, можно отдельно отметить, что в C++ дела с этим обстоят намного лучше, чем в других языках. Ты можешь это тривиально проверить, просто сравнив сколько будет выделений памяти для такого простейшего C++ кода:


Это неправильная метрика. Правильная — сколько времени уйдет на управление памятью. И тут у C++ результаты будут не очень.

_>В руках профессионала и C и C++ выдадут одинаковый по эффективности результат. Но при этом объём исходников на C будет существенно выше, а их проверяемость компилятором существенно ниже.


Что проверяемость компилятором в случае C++ будет лучше, я согласен, но вот что коду будет меньше — нет. В случае C++ очень много коду уходит именно на то, чтобы описать правила, по которым компилятор будет проверять комилируемое.

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

В С, кстати, проблемы его системы типов не так заметны, потому что там гораздо меньше чего завязано на эти самые типы.

_>Эээ что? Какое ещё "сделай сам"? Мы берём (готовый) аллокатор на пуле и передаём его в качестве шаблонного параметра в стандартную (естественно опять же готовую) строку из STL. В итоге мгновенно получаем обычный std::string, но выделяющий память на пуле. Это же основа работы STL. Ты что, реально про это не в курсе? )))


А вот фигвам. Тот пул, о котором мы говорим, умеет выделять блоки памяти одинакового размера, за счет чего и работает быстро.
Re[16]: Что дает template metaprogramming (по сравнению с дру
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.02.18 12:20
Оценка:
Здравствуйте, swingus, Вы писали:

S>В плюсы порог входа сейчас высокий, не спорю, но и получившийся результат отличается, как мелкосерийные швейцарские часы от часов Ракета. Причём страдает качество двух видов:


И где эти высококачественные мелкосерийные программы, написанные на C++? Можно хоть на несколько штук показать пальцем?
Re[17]: Что дает template metaprogramming (по сравнению с дру
От: so5team https://stiffstream.com
Дата: 27.02.18 12:27
Оценка: +1
Здравствуйте, Pzz, Вы писали:

Pzz>Что проверяемость компилятором в случае C++ будет лучше, я согласен, но вот что коду будет меньше — нет. В случае C++ очень много коду уходит именно на то, чтобы описать правила, по которым компилятор будет проверять комилируемое.


Pzz>На самом деле, ценность встроенноой в C++ системы статической проверки корректности программы существенно снижается из-за нечеловеческой сложности описания самих этих правил.


А можно примеры? Пока многое из того, что вы говорите, оказывается ничем не подтвержденным личным мнением.
Re[26]: Что дает template metaprogramming (по сравнению с др
От: AlexRK  
Дата: 27.02.18 12:31
Оценка: 33 (2) :)
Здравствуйте, rg45, Вы писали:

R>У меня только просьба к тебе: если, все-таки найдешь время, вернись, пожалуйста, к оригинальной задаче: http://rsdn.org/forum/cpp/7063448.1
Автор: rg45
Дата: 24.02.18
. Тебе же проще будет — здесь не требуются операции с матрицами и посчитать-то нужно всего одно число — скалярное произведение двух векторов. Изюминка — автоматическое получение правильного типа результата. Если что нужно уточнить — спрашивай.


using System;
using System.Linq;

namespace ConsoleApplication1
{
    class Vector<T> { public T[] Data { get; set; } }

    class Program
    {
        static object dotproduct<T, U>(Vector<T> t, Vector<U> u)
        {
            if (t.Data.Length != u.Data.Length)
                throw new Exception("error");

            return Enumerable.Range(0, u.Data.Length)
                .Select(x => Some_Common_Library.Mul(t.Data[x], u.Data[x]))
                .Aggregate(Some_Common_Library.Add);
        }

        static void Main(string[] args)
        {
            var v1 = new Vector<short> { Data = new short[] { 1, 2, 3 } };
            var v2 = new Vector<char> { Data = new[] { '1', '2', '3' } };

            var res = dotproduct(v1, v2);

            if (res.GetType() != typeof(int))
                throw new Exception("error");

            Console.WriteLine(res);
            Console.ReadLine();
        }
    }

    static class Some_Common_Library
    {
        public static object Add<T, U>(T t, U u)
        {
            if ((t.GetType() == typeof(int)) && (u.GetType() == typeof(int)))
                return (int)((int)(object)t + (int)(object)u);

            // ... more cases ...

            throw new Exception("error");
        }

        public static object Mul<T, U>(T t, U u)
        {
            if ((t.GetType() == typeof(short)) && (u.GetType() == typeof(char)))
                return (int)((short)(object)t * (char)(object)u);

            // ... more cases ...

            throw new Exception("error");
        }
    }
}


Re[26]: Что дает template metaprogramming (по сравнению с др
От: AlexRK  
Дата: 27.02.18 12:36
Оценка:
Здравствуйте, dead0k, Вы писали:

D>А чего тогда в раст добавляют поддержку higher-kinded-types (вроде через макросы энто дело тоже реализуется).


Макросы и шаблоны — это хак, тупая подстановка текста, а типы — это логика.
Re[27]: Что дает template metaprogramming (по сравнению с др
От: _NN_ www.nemerleweb.com
Дата: 27.02.18 13:01
Оценка:
Здравствуйте, AlexRK, Вы писали:


ARK>Макросы и шаблоны — это хак, тупая подстановка текста, а типы — это логика.

Тупой подстановкой текста шаблоны не назовёшь.
И макросы даже в C уже не просто подстановка текста: Generic.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[17]: Что дает template metaprogramming (по сравнению с дру
От: alex_public  
Дата: 27.02.18 13:11
Оценка:
Здравствуйте, Pzz, Вы писали:

_>>Более того, можно отдельно отметить, что в C++ дела с этим обстоят намного лучше, чем в других языках. Ты можешь это тривиально проверить, просто сравнив сколько будет выделений памяти для такого простейшего C++ кода:

Pzz>Это неправильная метрика. Правильная — сколько времени уйдет на управление памятью. И тут у C++ результаты будут не очень.

Только в руках криворукого C++ программиста. )))

_>>В руках профессионала и C и C++ выдадут одинаковый по эффективности результат. Но при этом объём исходников на C будет существенно выше, а их проверяемость компилятором существенно ниже.

Pzz>Что проверяемость компилятором в случае C++ будет лучше, я согласен, но вот что коду будет меньше — нет. В случае C++ очень много коду уходит именно на то, чтобы описать правила, по которым компилятор будет проверять комилируемое.

У кого как.

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


Это не верно. Автоматические преобразования типов из C не работают в C++. Иначе бы собственно не было повышения безопасности при переходе к C++.

Pzz>В С, кстати, проблемы его системы типов не так заметны, потому что там гораздо меньше чего завязано на эти самые типы.


Да, в C в принципе можно заменить все типы на void*.

_>>Эээ что? Какое ещё "сделай сам"? Мы берём (готовый) аллокатор на пуле и передаём его в качестве шаблонного параметра в стандартную (естественно опять же готовую) строку из STL. В итоге мгновенно получаем обычный std::string, но выделяющий память на пуле. Это же основа работы STL. Ты что, реально про это не в курсе? )))

Pzz>А вот фигвам. Тот пул, о котором мы говорим, умеет выделять блоки памяти одинакового размера, за счет чего и работает быстро.

Ээээ, а ты вообще в курсе как работает выделение памяти в пуле? ))) Похоже что ты не понимаешь о чём речь в принципе. )))
Re[27]: Что дает template metaprogramming (по сравнению с др
От: rg45 СССР  
Дата: 27.02.18 13:12
Оценка: +1
Здравствуйте, AlexRK, Вы писали:

ARK>


Браво!

Ну, недостатки такого подхода, я полагаю, для тебя очевидны: подбор типа результата выполняется во время выполнения и имеет квадрадичную алгоритмическую сложность от числа поддерживаемых типов. И как утешительный приз: T4 здесь действительно можно прикрутить
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[17]: Что дает template metaprogramming (по сравнению с дру
От: alex_public  
Дата: 27.02.18 13:14
Оценка:
Здравствуйте, Pzz, Вы писали:

S>>В плюсы порог входа сейчас высокий, не спорю, но и получившийся результат отличается, как мелкосерийные швейцарские часы от часов Ракета. Причём страдает качество двух видов:

Pzz>И где эти высококачественные мелкосерийные программы, написанные на C++? Можно хоть на несколько штук показать пальцем?

Ну вот собственно в одном из них ты печатал это своё сообщение. Причём когда ты нажал в нём кнопку "отправить", этот твой текст отправился к другому такому C++ приложению, которое его проанализировало и отправило в третье C++ приложение, которое сохранило твой текст на диск (сервера).

Достаточное количество или ещё продолжить? )))
Re[27]: Что дает template metaprogramming (по сравнению с др
От: rg45 СССР  
Дата: 27.02.18 13:20
Оценка: +2
Здравствуйте, AlexRK, Вы писали:

ARK>
ARK>            if ((t.GetType() == typeof(short)) && (u.GetType() == typeof(char)))
ARK>                return (int)((short)(object)t * (char)(object)u);
ARK>


И еще маленький технический момент: в таких случаях как этот, совершенно нет необходимости в явном приведении типа конечного результата — CLR сделает это самостоятельно, а главное — гарантированно правильно!

    if ((t.GetType() == typeof(short)) && (u.GetType() == typeof(char)))
        return (short)(object)t * (char)(object)u;
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[18]: Что дает template metaprogramming (по сравнению с дру
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.02.18 13:34
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну вот собственно в одном из них ты печатал это своё сообщение. Причём когда ты нажал в нём кнопку "отправить", этот твой текст отправился к другому такому C++ приложению, которое его проанализировало и отправило в третье C++ приложение, которое сохранило твой текст на диск (сервера).


Это firefox-то — высококакчественная программа?

RSDN, насколько я понимаю, написан на C#, и в конкурсе не участвует.
Re[18]: Что дает template metaprogramming (по сравнению с дру
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.02.18 14:52
Оценка:
Здравствуйте, alex_public, Вы писали:

Pzz>>Это неправильная метрика. Правильная — сколько времени уйдет на управление памятью. И тут у C++ результаты будут не очень.


_>Только в руках криворукого C++ программиста. )))


Нет, в руках обычного C++ программиста. Разумеется, хороший C++ программист эти проблемы обойдет. Потратив изрядное количество труда.

_>Это не верно. Автоматические преобразования типов из C не работают в C++. Иначе бы собственно не было повышения безопасности при переходе к C++.


В C++ запретили автоматические преобразование между численными типами?

Pzz>>В С, кстати, проблемы его системы типов не так заметны, потому что там гораздо меньше чего завязано на эти самые типы.


_>Да, в C в принципе можно заменить все типы на void*.


А можно и не заменять все типы на void*.

_>Ээээ, а ты вообще в курсе как работает выделение памяти в пуле? ))) Похоже что ты не понимаешь о чём речь в принципе. )))


В курсе. Вообще, словом пул называют как минимум одно из двух:

1. Быстрый аллокатор памяти, работающий с блоками одинакового размера
2. Конструкцию, которая ведет учет блоков, выделенных в контексте некоторой операции, и позволяет разом их всех освободить, когда операция заканчивается

У меня сложилось впечатление, что бустовский пул — это первый вариант. Но если честно, очень уж пристально я в него не всматривался

В принципе, более интересная конструкция получается, когда есть кучка некоторых объектов, которые достаточно трудоемко конструировать, но можно дешево обресетить, и которые используются часто но недолго. Тогда можно организовать пул таких объектов, уже сконструированных, но в данный момент не используемых. Это может существенно ускорить вещи. В C++ так обычно не делают
Re[19]: Что дает template metaprogramming (по сравнению с дру
От: alex_public  
Дата: 27.02.18 14:53
Оценка:
Здравствуйте, Pzz, Вы писали:

_>>Ну вот собственно в одном из них ты печатал это своё сообщение. Причём когда ты нажал в нём кнопку "отправить", этот твой текст отправился к другому такому C++ приложению, которое его проанализировало и отправило в третье C++ приложение, которое сохранило твой текст на диск (сервера).

Pzz>Это firefox-то — высококакчественная программа?

Ну если ты готов озвучить название браузера, более качественного чем FF и при этом написанного не на C++, то с удовольствием послушаю...

Pzz>RSDN, насколько я понимаю, написан на C#, и в конкурсе не участвует.


Браузер передаёт данные не некому "сайту написанному на C#", а IIS.
Re[18]: Что дает template metaprogramming (по сравнению с дру
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.02.18 14:54
Оценка:
Здравствуйте, so5team, Вы писали:

Pzz>>На самом деле, ценность встроенноой в C++ системы статической проверки корректности программы существенно снижается из-за нечеловеческой сложности описания самих этих правил.


S>А можно примеры? Пока многое из того, что вы говорите, оказывается ничем не подтвержденным личным мнением.


Примеры приводить трудоемко. Согласен считать то, что я говорю, моим личным мнением (подтвержденным моим опытом, но для вас он — штука не верифицируемая).

Но я не единственный, кто высказывает подобное мнение. Поэтому оно, по крайней мере, имеет право на существование.
Re[20]: Что дает template metaprogramming (по сравнению с дру
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.02.18 15:00
Оценка:
Здравствуйте, alex_public, Вы писали:

Pzz>>Это firefox-то — высококакчественная программа?


_>Ну если ты готов озвучить название браузера, более качественного чем FF и при этом написанного не на C++, то с удовольствием послушаю...


Отсутствие более качественного бровсера, чем FF, не делает FF "качественной штучной программой, типа швейцарских часов", как тут было заявлено.

Мозилла, кстати, не очень довольна ни C++'ом, ни фирефоксом. Иначе с чего бы им было придумывать Rust и писать на нем совершенно новый бровсер с нуля?

Pzz>>RSDN, насколько я понимаю, написан на C#, и в конкурсе не участвует.


_>Браузер передаёт данные не некому "сайту написанному на C#", а IIS.


Я не специалист по виндовсным серверным решениям, но очень подозреваю, что обкатанная на миллионе сайтов связка апача с nginx'ом под линухом работала бы куда лучше, чем IIS. Правда, не получилось бы сайт на C# писать.

Хотя лично я бы в новом проекте попробовал бы Caddy...
Re[22]: Что дает template metaprogramming (по сравнению с др
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.02.18 15:04
Оценка:
Здравствуйте, rg45, Вы писали:

TB>>Эт почему? Можно первой строчкой конструктора проверить, что обе переменные инициализировались.


R>И что делать, при обнаружении ошибки?


А что в приведенной ситуации вообще можно сделать полезного, кроме как культурно склеить ласты?
Re[22]: Что дает template metaprogramming (по сравнению с др
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.02.18 15:08
Оценка:
Здравствуйте, so5team, Вы писали:

S>Гораздо лучше было бы использовать подход с конструирующими методами, возвращающими какой-нибудь either<object, error_code>:


Мне кажется, если мы не смогли сконструировать строку, то это означает одно из двух:
1. Памяти совсем мало
2. Кто-то попытался засунуть в строку гигабайт — такие вещи должны ловиться на более высоком уровне (там, где этот гигабайт откуда-то берется)

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

В обеих случаях самая уместная реакция — культурно склеить ласты.
Re[21]: Что дает template metaprogramming (по сравнению с др
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.02.18 15:11
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Конкурентное программирование — одна из областей, где раст получает значительные преимущества над Ц++, за счет уникальных ссылок по умолчанию, семантики перемещения по умолчанию, и помеченных явным образом разделяемых ссылок. И всё это проверяется компилятором.


Начнет получать, когда они осилят сделать легковесные потоки. Если осилят.
Re[23]: Что дает template metaprogramming (по сравнению с др
От: rg45 СССР  
Дата: 27.02.18 15:14
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>А что в приведенной ситуации вообще можно сделать полезного, кроме как культурно склеить ласты?


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