Здравствуйте, alex_public, Вы писали:
_>В Rust'е есть полноценные синтаксические макросы, так что метапрограммирование там гораздо более сильное, чем в C++. Т.е. все задачи из области МП, решаемые на C++ запишутся и на Rust'е, причём чаще всего более лаконично.
А чего тогда в раст добавляют поддержку higher-kinded-types (вроде через макросы энто дело тоже реализуется). Сдается мне, что это аргумент в духе "на constexpr можно написать компилятор раста и сразу гейм-овер". (еси чо, не бейте, я сегодня первый день код раста читаю )
Re[16]: Что дает template metaprogramming (по сравнению с дру
Здравствуйте, alex_public, Вы писали:
_>Более того, можно отдельно отметить, что в C++ дела с этим обстоят намного лучше, чем в других языках. Ты можешь это тривиально проверить, просто сравнив сколько будет выделений памяти для такого простейшего C++ кода:
Это неправильная метрика. Правильная — сколько времени уйдет на управление памятью. И тут у C++ результаты будут не очень.
_>В руках профессионала и C и C++ выдадут одинаковый по эффективности результат. Но при этом объём исходников на C будет существенно выше, а их проверяемость компилятором существенно ниже.
Что проверяемость компилятором в случае C++ будет лучше, я согласен, но вот что коду будет меньше — нет. В случае C++ очень много коду уходит именно на то, чтобы описать правила, по которым компилятор будет проверять комилируемое.
На самом деле, ценность встроенноой в C++ системы статической проверки корректности программы существенно снижается из-за нечеловеческой сложности описания самих этих правил. В которых ведь тоже могут быть ошибки. Лежащая в основе системы типов C++ архаичная и переусложненная система типов C, да еще и с весьма нетривиальными правилами автоматического преобразования типов, отнюдь не упрощает эту задачу.
В С, кстати, проблемы его системы типов не так заметны, потому что там гораздо меньше чего завязано на эти самые типы.
_>Эээ что? Какое ещё "сделай сам"? Мы берём (готовый) аллокатор на пуле и передаём его в качестве шаблонного параметра в стандартную (естественно опять же готовую) строку из STL. В итоге мгновенно получаем обычный std::string, но выделяющий память на пуле. Это же основа работы STL. Ты что, реально про это не в курсе? )))
А вот фигвам. Тот пул, о котором мы говорим, умеет выделять блоки памяти одинакового размера, за счет чего и работает быстро.
Re[16]: Что дает template metaprogramming (по сравнению с дру
Здравствуйте, swingus, Вы писали:
S>В плюсы порог входа сейчас высокий, не спорю, но и получившийся результат отличается, как мелкосерийные швейцарские часы от часов Ракета. Причём страдает качество двух видов:
И где эти высококачественные мелкосерийные программы, написанные на C++? Можно хоть на несколько штук показать пальцем?
Re[17]: Что дает template metaprogramming (по сравнению с дру
Здравствуйте, Pzz, Вы писали:
Pzz>Что проверяемость компилятором в случае C++ будет лучше, я согласен, но вот что коду будет меньше — нет. В случае C++ очень много коду уходит именно на то, чтобы описать правила, по которым компилятор будет проверять комилируемое.
Pzz>На самом деле, ценность встроенноой в C++ системы статической проверки корректности программы существенно снижается из-за нечеловеческой сложности описания самих этих правил.
А можно примеры? Пока многое из того, что вы говорите, оказывается ничем не подтвержденным личным мнением.
Re[26]: Что дает template metaprogramming (по сравнению с др
Здравствуйте, rg45, Вы писали:
R>У меня только просьба к тебе: если, все-таки найдешь время, вернись, пожалуйста, к оригинальной задаче: http://rsdn.org/forum/cpp/7063448.1
. Тебе же проще будет — здесь не требуются операции с матрицами и посчитать-то нужно всего одно число — скалярное произведение двух векторов. Изюминка — автоматическое получение правильного типа результата. Если что нужно уточнить — спрашивай.
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 (по сравнению с др
ARK>Макросы и шаблоны — это хак, тупая подстановка текста, а типы — это логика.
Тупой подстановкой текста шаблоны не назовёшь.
И макросы даже в C уже не просто подстановка текста: Generic.
Здравствуйте, 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 (по сравнению с др
Ну, недостатки такого подхода, я полагаю, для тебя очевидны: подбор типа результата выполняется во время выполнения и имеет квадрадичную алгоритмическую сложность от числа поддерживаемых типов. И как утешительный приз: T4 здесь действительно можно прикрутить
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[17]: Что дает template metaprogramming (по сравнению с дру
Здравствуйте, Pzz, Вы писали:
S>>В плюсы порог входа сейчас высокий, не спорю, но и получившийся результат отличается, как мелкосерийные швейцарские часы от часов Ракета. Причём страдает качество двух видов: Pzz>И где эти высококачественные мелкосерийные программы, написанные на C++? Можно хоть на несколько штук показать пальцем?
Ну вот собственно в одном из них ты печатал это своё сообщение. Причём когда ты нажал в нём кнопку "отправить", этот твой текст отправился к другому такому C++ приложению, которое его проанализировало и отправило в третье C++ приложение, которое сохранило твой текст на диск (сервера).
Достаточное количество или ещё продолжить? )))
Re[27]: Что дает template metaprogramming (по сравнению с др
И еще маленький технический момент: в таких случаях как этот, совершенно нет необходимости в явном приведении типа конечного результата — CLR сделает это самостоятельно, а главное — гарантированно правильно!
Здравствуйте, alex_public, Вы писали:
_>Ну вот собственно в одном из них ты печатал это своё сообщение. Причём когда ты нажал в нём кнопку "отправить", этот твой текст отправился к другому такому C++ приложению, которое его проанализировало и отправило в третье C++ приложение, которое сохранило твой текст на диск (сервера).
Это firefox-то — высококакчественная программа?
RSDN, насколько я понимаю, написан на C#, и в конкурсе не участвует.
Re[18]: Что дает template metaprogramming (по сравнению с дру
Здравствуйте, alex_public, Вы писали:
Pzz>>Это неправильная метрика. Правильная — сколько времени уйдет на управление памятью. И тут у C++ результаты будут не очень.
_>Только в руках криворукого C++ программиста. )))
Нет, в руках обычного C++ программиста. Разумеется, хороший C++ программист эти проблемы обойдет. Потратив изрядное количество труда.
_>Это не верно. Автоматические преобразования типов из C не работают в C++. Иначе бы собственно не было повышения безопасности при переходе к C++.
В C++ запретили автоматические преобразование между численными типами?
Pzz>>В С, кстати, проблемы его системы типов не так заметны, потому что там гораздо меньше чего завязано на эти самые типы.
_>Да, в C в принципе можно заменить все типы на void*.
А можно и не заменять все типы на void*.
_>Ээээ, а ты вообще в курсе как работает выделение памяти в пуле? ))) Похоже что ты не понимаешь о чём речь в принципе. )))
В курсе. Вообще, словом пул называют как минимум одно из двух:
1. Быстрый аллокатор памяти, работающий с блоками одинакового размера
2. Конструкцию, которая ведет учет блоков, выделенных в контексте некоторой операции, и позволяет разом их всех освободить, когда операция заканчивается
У меня сложилось впечатление, что бустовский пул — это первый вариант. Но если честно, очень уж пристально я в него не всматривался
В принципе, более интересная конструкция получается, когда есть кучка некоторых объектов, которые достаточно трудоемко конструировать, но можно дешево обресетить, и которые используются часто но недолго. Тогда можно организовать пул таких объектов, уже сконструированных, но в данный момент не используемых. Это может существенно ускорить вещи. В C++ так обычно не делают
Re[19]: Что дает template metaprogramming (по сравнению с дру
Здравствуйте, Pzz, Вы писали:
_>>Ну вот собственно в одном из них ты печатал это своё сообщение. Причём когда ты нажал в нём кнопку "отправить", этот твой текст отправился к другому такому C++ приложению, которое его проанализировало и отправило в третье C++ приложение, которое сохранило твой текст на диск (сервера). Pzz>Это firefox-то — высококакчественная программа?
Ну если ты готов озвучить название браузера, более качественного чем FF и при этом написанного не на C++, то с удовольствием послушаю...
Pzz>RSDN, насколько я понимаю, написан на C#, и в конкурсе не участвует.
Браузер передаёт данные не некому "сайту написанному на C#", а IIS.
Re[18]: Что дает template metaprogramming (по сравнению с дру
Здравствуйте, so5team, Вы писали:
Pzz>>На самом деле, ценность встроенноой в C++ системы статической проверки корректности программы существенно снижается из-за нечеловеческой сложности описания самих этих правил.
S>А можно примеры? Пока многое из того, что вы говорите, оказывается ничем не подтвержденным личным мнением.
Примеры приводить трудоемко. Согласен считать то, что я говорю, моим личным мнением (подтвержденным моим опытом, но для вас он — штука не верифицируемая).
Но я не единственный, кто высказывает подобное мнение. Поэтому оно, по крайней мере, имеет право на существование.
Re[20]: Что дает template metaprogramming (по сравнению с дру
Здравствуйте, alex_public, Вы писали:
Pzz>>Это firefox-то — высококакчественная программа?
_>Ну если ты готов озвучить название браузера, более качественного чем FF и при этом написанного не на C++, то с удовольствием послушаю...
Отсутствие более качественного бровсера, чем FF, не делает FF "качественной штучной программой, типа швейцарских часов", как тут было заявлено.
Мозилла, кстати, не очень довольна ни C++'ом, ни фирефоксом. Иначе с чего бы им было придумывать Rust и писать на нем совершенно новый бровсер с нуля?
Pzz>>RSDN, насколько я понимаю, написан на C#, и в конкурсе не участвует.
_>Браузер передаёт данные не некому "сайту написанному на C#", а IIS.
Я не специалист по виндовсным серверным решениям, но очень подозреваю, что обкатанная на миллионе сайтов связка апача с nginx'ом под линухом работала бы куда лучше, чем IIS. Правда, не получилось бы сайт на C# писать.
Хотя лично я бы в новом проекте попробовал бы Caddy...
Re[22]: Что дает template metaprogramming (по сравнению с др
Здравствуйте, rg45, Вы писали:
TB>>Эт почему? Можно первой строчкой конструктора проверить, что обе переменные инициализировались.
R>И что делать, при обнаружении ошибки?
А что в приведенной ситуации вообще можно сделать полезного, кроме как культурно склеить ласты?
Re[22]: Что дает template metaprogramming (по сравнению с др
Здравствуйте, so5team, Вы писали:
S>Гораздо лучше было бы использовать подход с конструирующими методами, возвращающими какой-нибудь either<object, error_code>:
Мне кажется, если мы не смогли сконструировать строку, то это означает одно из двух:
1. Памяти совсем мало
2. Кто-то попытался засунуть в строку гигабайт — такие вещи должны ловиться на более высоком уровне (там, где этот гигабайт откуда-то берется)
В первом случае жить дальше нельзя (ну, т.е., теоретически можно, но несоразмерно трудоемки для ширпотребовской программы). Второй случай — очевидная внутренняя ошибка программы.
В обеих случаях самая уместная реакция — культурно склеить ласты.
Re[21]: Что дает template metaprogramming (по сравнению с др
Здравствуйте, AlexRK, Вы писали:
ARK>Конкурентное программирование — одна из областей, где раст получает значительные преимущества над Ц++, за счет уникальных ссылок по умолчанию, семантики перемещения по умолчанию, и помеченных явным образом разделяемых ссылок. И всё это проверяется компилятором.
Начнет получать, когда они осилят сделать легковесные потоки. Если осилят.
Re[23]: Что дает template metaprogramming (по сравнению с др
Здравствуйте, Pzz, Вы писали:
Pzz>А что в приведенной ситуации вообще можно сделать полезного, кроме как культурно склеить ласты?
Необходимость обработки ощибок есть в обоих случаях, конечно. Но главное преимущество подхода с исключениями — это невозвожность создания невалидного объекта. Ну представь на минуточку, каково было-бы если бы каждый объект типа std::string перед использованием приходилось бы проверять на валидность.
--
Не можешь достичь желаемого — пожелай достигнутого.