Здравствуйте, kvasya, Вы писали: K>Как считаете, ожидает C++ развитие в сторону LINQ?
Я от души надеюсь что нет. LINQ это инструмент быдлокодера (да, есть люди которые понимают как он работает и какой код генерирует, но это большая редкость). Почему? — да потому что вы пишете какой-то код и понятия не имеете какая у него будет алгоритмическая сложность и сколько памяти он сожрет, а если вы не понимаете что происходит, то о какой сознательной разработке можно говорить?
и LINQ это совсем не SQL — действия SQL прогнозируемы, а сложность легко проверяется просмотром плана выполнения.
K>Как считаете, ожидает C++ развитие в сторону LINQ?
Нет.
C# — активно развивающийся, поддерживаемый мощной корпорацией, язык для бизнес-приложений, там постоянно работают с реляционными базами данных, поэтому и родился linq. На C++ бизнес-приложения уже не пишут, с реляционными базами данных так часто не работают, и мощная корпорация за ним не стоит, так что и требований для таких вещей нет, и реализовывать их никому не охота.
Здравствуйте, kvasya, Вы писали:
K>И помня о мощи C++ и помня, например, об Александреску и его умопомрачительных пассажей...
Да, в неопытных руках это будет бомба почище "шаблонной эйфории".
K>Как считаете, ожидает C++ развитие в сторону LINQ?
Да ну нафиг. В первую очередь это породит очередную волну говнокодеров александреску-стайл. И только потом более менее схлынет и начнут использовать только там где надо.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, kvasya, Вы писали:
K>Здравствуйте, -MyXa-, Вы писали:
MX>>Здравствуйте, kvasya, Вы писали:
MX>>Boost.Proto
K>Каким образом это LINQ? K>Я с boost.proto не работал, поэтому спрашиваю, возможно ли реализовать, например, такое (C#):
K>
K> List<int> data = new List<int> { 1, 2, 4, 0, 5, 6 };
K> var largerThanTwoData = from v in data
K> where v > 2
K> select v;
K>
K>Спасибо.
#include <algorithm>
#include <functional>
#include <list>
#include <boost/assign.hpp>
#include <boost/lambda/lambda.hpp>
using namespace std;
using namespace boost::assign;
using namespace boost::lambda;
int main()
{
list<int> data = list_of(1)(2)(4)(0)(5)(6);
list<int> largerThanTwo;
copy_if(data.begin(), data.end(), back_inserter(largerThanTwo), _1 > 2);
}
Так сойдет ?
Под LINQ идут слишком много понятий.
Что конкретно вам нужно ?
Синтаксис from where select ? Или может методы расширения ? Или нормальные лямбды ? Или компиляция выражений во времени выполнения программы ?
K>В перспективе? K>Мне это представляется очень сложным, учитывая то, что внесли в c# для поддержки технологии. Но так хочется K>И помня о мощи C++ и помня, например, об Александреску и его умопомрачительных пассажей...
K>Как считаете, ожидает C++ развитие в сторону LINQ?
K>Или я может быть что-нибудь пропустил, есть какие-то серьезные наработки в этом направлении?
Уже сказали что, не всегда легко оценить алгоритмическую сложность LINQ. Но я думаю, что эта проблема решаема — достаточно научиться строить аналог плана SQL запроса. Главная проблемма LINQ'а — его нерасширяемость. В С++ мы привыкли к тому, что можем кастомизировать (функтором, стратегией, шаблонным параметром, аллокатором) какой угодно алгоритм или контейнер. Не кастомизируются, только самые атомарные вещи, которые легко самому переписать. Это даёт нам возможность после анализа алгоритма изменять минимально необходимую часть кода.
В случае же LINQ-а проблема не столько в том, чтобы найти узкое место, сколько в том, чтобы его поправить. Вот не нравится мне стратегия итерирования, или я вижу, что LINQ не использует отсортированность коллекции. Если средства LINQ не позволяют явно задать нужное поведение, то у меня есть два варианта: переписать весь запрос вручную (в том числе и ту логику, которая в LINQе меня устраивает) или отнаследоваться от библиотечного класса и написать свой обработчик from-where-select, что очевидно не является достаточно гибким механизмом.
Мне кажется, что спасением С++ мог бы стать подход используемый в Немерле — полноценный механизм кастомизации синтаксиса. В общем-то это будет небольшой и логичный шаг вперёд после перегрузки операторов и темплейтов. Тогда LINQ элегантно и эффективно можно будет реализовать в какой-нибудь библиотеке типа Boost.LINQ.
Здравствуйте, kvasya, Вы писали:
K>В перспективе? K>Мне это представляется очень сложным, учитывая то, что внесли в c# для поддержки технологии. Но так хочется K>И помня о мощи C++ и помня, например, об Александреску и его умопомрачительных пассажей... K>Как считаете, ожидает C++ развитие в сторону LINQ? K>Или я может быть что-нибудь пропустил, есть какие-то серьезные наработки в этом направлении?
ИМХО Linq — это в первую очередь механизм квазицитирования. Syntax sugar сам по себе весьма вторичен, а часто даже и не очень удобен. Поэтому тут лучше обобщить вопрос, мне кажется.
Синтаксис сам по себе — не нужен. Его полезность даже в C# — это большой вопрос. Я как-то создавал подобную тему и где-то половина отписавшихся высказывалась, что они синтаксисом не пользуются или просто не считают его особенно полезным.
А вот квази-цитаты — это уже более интересный вопрос.
Здравствуйте, kvasya, Вы писали:
K>В перспективе? K>Мне это представляется очень сложным, учитывая то, что внесли в c# для поддержки технологии. Но так хочется K>И помня о мощи C++ и помня, например, об Александреску и его умопомрачительных пассажей... K>Как считаете, ожидает C++ развитие в сторону LINQ? K>Или я может быть что-нибудь пропустил, есть какие-то серьезные наработки в этом направлении?
Язык C разрабатывался так что любая конструкция генерирует простой код. Своего рода машинно-независимый ассемблер.
C++ более-менее сохранил эту концепцию. (Исключение, которое первым приходит на ум, это исключения )
Прикладные вещи типа LINQ нафиг не нужны в C++. Для этого есть библиотеки.
Ладно, если вас так обидел мой смайлик, скажу, что меня рассмешило:
ROP>Язык C разрабатывался так что любая конструкция генерирует простой код. Своего рода машинно-независимый ассемблер. ROP>C++ более-менее сохранил эту концепцию.
Да, это очень смешное утверждение. Я как вспомню, какие на C++ бывают простые конструкции из одной строчки, генерирующие мегабайты кода. Да вы на буст взгляните же ж, какой там простой код-то.
R>...да потому что вы пишете какой-то код и понятия не имеете какая у него будет алгоритмическая сложность и сколько памяти он сожрет, а если вы не понимаете что происходит, то о какой сознательной разработке можно говорить?
Если руководствоваться такими рассуждениями, то можно вообще не начинать программировать, либо писать все в машинных кодах.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, kvasya, Вы писали:
K>>И помня о мощи C++ и помня, например, об Александреску и его умопомрачительных пассажей... CC>Да, в неопытных руках это будет бомба почище "шаблонной эйфории".
Честно говоря у меня даже мысль о таких возможностях взрывает мозг
K>>Как считаете, ожидает C++ развитие в сторону LINQ? CC>Да ну нафиг. В первую очередь это породит очередную волну говнокодеров александреску-стайл. И только потом более менее схлынет и начнут использовать только там где надо.
Безусловно, но это же не умалит достоинств самой технологии.
Здравствуйте, Тролль зеленый и толстый, Вы писали:
ТЗИ>Я вот глядя на этот запрос, сразу бы сказал, что у него сложность будет линейная. Чего тут сложного-то?
Я не копал вглубь, мне просто не нужен инструмент который является синтаксическим сахаром и решает задачи тупейшим и непроизводительнейшим образом. Признаю только инструменты, которые решают задачи лучше(в широком смысле), чем сделал бы средний разработчик с 1го раза.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, k06a, Вы писали:
K>>Сейчас пишу свою реализацию LINQ на C++. J>Открой для себя Boost.Range J>http://www.rsdn.ru/forum/etude/4501680.1.aspx
В перспективе?
Мне это представляется очень сложным, учитывая то, что внесли в c# для поддержки технологии. Но так хочется
И помня о мощи C++ и помня, например, об Александреску и его умопомрачительных пассажей...
Как считаете, ожидает C++ развитие в сторону LINQ?
Или я может быть что-нибудь пропустил, есть какие-то серьезные наработки в этом направлении?
+2
Но это C++
__>Под LINQ идут слишком много понятий. __>Что конкретно вам нужно ? __>Синтаксис from where select ? Или может методы расширения ? Или нормальные лямбды ? Или компиляция выражений во времени выполнения программы ?
Мне лично нужна типизация объектов источника данных, потенциально — любого. Как это будет — в принципе фиолетово, но в C# LINQ выглядит очень гармонично.
Здравствуйте, Тролль зеленый и толстый, Вы писали:
ТЗИ>Лол, R.O. Prokopiev из мести поставил смайлик.
Поставил, потому, что чепуху ты написал.
Раньше, когда писали опредени на C++ никому и в голову не приходило превращать его в фокспро.
Даже в дельфи (который более высокоуровневый) такого не было.
ROP>Раньше, когда писали опредени на C++ никому и в голову не приходило превращать его в фокспро. ROP>Даже в дельфи (который более высокоуровневый) такого не было.
Ничего не понял. Вы имеете в виду, что раньше на C++ писали более просто?
Здравствуйте, rm822, Вы писали:
K>>Как считаете, ожидает C++ развитие в сторону LINQ? R>Я от души надеюсь что нет. LINQ это инструмент быдлокодера (да, есть люди которые понимают как он работает и какой код генерирует, но это большая редкость). Почему? — да потому что вы пишете какой-то код и понятия не имеете какая у него будет алгоритмическая сложность и сколько памяти он сожрет, а если вы не понимаете что происходит, то о какой сознательной разработке можно говорить? R>и LINQ это совсем не SQL — действия SQL прогнозируемы, а сложность легко проверяется просмотром плана выполнения.
Здравствуйте, Тролль зеленый и толстый, Вы писали:
ТЗИ>Ладно, если вас так обидел мой смайлик, скажу, что меня рассмешило:
ROP>>Язык C разрабатывался так что любая конструкция генерирует простой код. Своего рода машинно-независимый ассемблер. ROP>>C++ более-менее сохранил эту концепцию.
ТЗИ>Да, это очень смешное утверждение. Я как вспомню, какие на C++ бывают простые конструкции из одной строчки, генерирующие мегабайты кода. Да вы на буст взгляните же ж, какой там простой код-то.
Это всё по сути инлайн-вызовы. Я о другом. О том, что всегда можно (при соответствующем навыке) проконтролировать,
какой код сгенерируется. Высокоуровневых вещей в C++ мало. Например ввод-вывод, подсчёт ссылок и пр. реализуются библиотечными средствами. Сборка мусора не реализуема, но она и не нужна — расходится с концепцией языка.
LINQ тоже будет слишком высокоуровневой конструкцией для C++. К тому же это проблемно-ориентированное расширение C++,
А C++ язык универсальный.
Здравствуйте, Тролль зеленый и толстый, Вы писали:
K>>Как считаете, ожидает C++ развитие в сторону LINQ?
ТЗИ>Нет.
ТЗИ>C# — активно развивающийся, поддерживаемый мощной корпорацией, язык для бизнес-приложений, там постоянно работают с реляционными базами данных, поэтому и родился linq. На C++ бизнес-приложения уже не пишут, с реляционными базами данных так часто не работают, и мощная корпорация за ним не стоит, так что и требований для таких вещей нет, и реализовывать их никому не охота.
Здравствуйте, Тролль зеленый и толстый, Вы писали:
ROP>>Раньше, когда писали опредени на C++ никому и в голову не приходило превращать его в фокспро. ROP>>Даже в дельфи (который более высокоуровневый) такого не было.
ТЗИ>Ничего не понял. Вы имеете в виду, что раньше на C++ писали более просто?
Бизнес-приложения раньше активно писали на C++, и никто до сих пор не включил туда SQL-образные конструкции.
Потому, что есть библиотеки.
Здравствуйте, rm822, Вы писали:
R>Здравствуйте, kvasya, Вы писали: K>>Как считаете, ожидает C++ развитие в сторону LINQ? R>Я от души надеюсь что нет. LINQ это инструмент быдлокодера (да, есть люди которые понимают как он работает и какой код генерирует, но это большая редкость). Почему? — да потому что вы пишете какой-то код и понятия не имеете какая у него будет алгоритмическая сложность и сколько памяти он сожрет, а если вы не понимаете что происходит, то о какой сознательной разработке можно говорить?
Ах, так и думал, что пойдут отмазки про быдлокодеров и формощлепщиков
И главное какие! От души! Йииииес!
R>и LINQ это совсем не SQL — действия SQL прогнозируемы, а сложность легко проверяется просмотром плана выполнения.
Аааа. Ну интересно. Вот, например, SQL запрос:
SELECT * FROM Orders WHERE OrderSum > 0
Ну-ка, спрогнозируй мне действия SQL... Только чур в план не заглядывать
MM>Ну-ка, спрогнозируй мне действия SQL... Только чур в план не заглядывать
легко, если считать ордерс реальной таблицей и ордернум — реальным полем без всяких там партишнингов то варианты
1. по ордер нуму нет индекса, будет скан таблицы
2. по ордернуму есть индекс, некластерный
а) из статов следует что выборка < примерно 10% таблицы — будет сик по некластерному индексу с джойном на кластерный
б) из статов следует что выборка >= примерно 10% таблицы — будет скан по кластерному индексу
3. ордер нум — кластерный индекс — будет сик по кластерному индексу
Здравствуйте, rm822, Вы писали:
MM>>SELECT * FROM Orders WHERE OrderSum > 0 MM>>Ну-ка, спрогнозируй мне действия SQL... Только чур в план не заглядывать R>легко, если считать ордерс реальной таблицей и ордернум — реальным полем без всяких там партишнингов то варианты R>1. по ордер нуму нет индекса, будет скан таблицы R>2. по ордернуму есть индекс, некластерный R> а) из статов следует что выборка < примерно 10% таблицы — будет сик по некластерному индексу с джойном на кластерный R> б) из статов следует что выборка >= примерно 10% таблицы — будет скан по кластерному индексу R>3. ордер нум — кластерный индекс — будет сик по кластерному индексу
Откуда ты все это узнал? Мне вот из запроса этого совершенно не ясно. Я вижу только "выбрать все записи, у которых сумма больше нуля".
MM>Откуда ты все это узнал? Мне вот из запроса этого совершенно не ясно. Я вижу только "выбрать все записи, у которых сумма больше нуля".
Все БД работают по одним принципам, на похожих структурах данных, которые за последние 10лет почти не менялись. Этого вполне достаточно
Здравствуйте, rm822, Вы писали:
MM>>Откуда ты все это узнал? Мне вот из запроса этого совершенно не ясно. Я вижу только "выбрать все записи, у которых сумма больше нуля". R>Все БД работают по одним принципам, на похожих структурах данных, которые за последние 10лет почти не менялись. Этого вполне достаточно
Весь Linq работает по одним принципам. Этого вполне достаточно.
On 13/05/2010 14:45, rm822 wrote:
> MM>Откуда ты все это узнал? Мне вот из запроса этого совершенно не ясно. > Я вижу только "выбрать все записи, у которых сумма больше нуля". > Все БД работают по одним принципам, на похожих структурах данных, > которые за последние 10лет почти не менялись. Этого вполне достаточно
List<int> data = new List<int> { 1, 2, 4, 0, 5, 6 };
var largerThanTwoData = from v in data
where v > 2
select v;
А тут что такого сверхсекретного? Коллекциям лет гораздо больше и тоже почти ничего не менялось.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, MxMsk, Вы писали: MM>Весь Linq работает по одним принципам. Этого вполне достаточно.
ок. вы их знаете? можете предсказать во что развернется запрос? моежете прикинуть алгоритмическую сложность и потребление памяти?
Здравствуйте, rm822, Вы писали:
R>Здравствуйте, MxMsk, Вы писали: MM>>Весь Linq работает по одним принципам. Этого вполне достаточно. R>ок. вы их знаете? можете предсказать во что развернется запрос? моежете прикинуть алгоритмическую сложность и потребление памяти?
Ой, вот только не надо этих умных слов, мы же не перед девчонками здесь. Принципы Linq-To-Objects я знаю на достаточном уровне. Если нужно, и сложность могу прикинуть и память тоже. С Linq-To-Sql я не работаю, т.к. на текущем проекте нет БД. Но если бы была и мы использовали Linq, то просто изучил бы его и все. И потом, я уверен, что часто при написании проги, обращающейся к БД о всяких там умных словах думают там, где что-то начинает тормозить (или может вызвать тормоза). И в этот момент вполне можно потратить время на доскональное изучение, в остальном часто достаточно общих принципов. Но так вообще везде, и в Linq в том числе.
т.е. не можете. я так и думал
вот поэтому линку и приблуда для быдлокодеров. сначала вы пишете какую-то хрень, потом через годик объем данных изменяется со 100 элементов до 1000 и все начинает тормозить, потому что где-то там O(n*n).
On 13/05/2010 15:42, rm822 wrote:
> т.е. не можете. я так и думал > вот поэтому линку и приблуда для быдлокодеров. сначала вы пишете > какую-то хрень, потом через годик объем данных изменяется со 100 > элементов до 1000 и все начинает тормозить, потому что где-то там O(n*n).
Так он же написал — зависит от. Если linq-sql, то оно примерно один в один преобразуется в соответсвующий sql запрос (а как он выполняется ты уже сам рассказывал). Если же как в примере выше для List, то обычный цикл по коллекции.
В общем, всё довольно интуитивно понятно.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, rm822, Вы писали:
R>т.е. не можете. я так и думал R>вот поэтому линку и приблуда для быдлокодеров. сначала вы пишете какую-то хрень, потом через годик объем данных изменяется со 100 элементов до 1000 и все начинает тормозить, потому что где-то там O(n*n).
Если следовать твоим рассуждениям, то всякий язык/библиотека, на котором можно написать что-нибудь нерабочее, является приблудой для быдлокодеров. Отчасти это так. Но речь ведь не об этом. Я тебе уже написал, что не работаю с Linq-To-Sql, но постоянно использую различные конструкции Linq-To-Objects, где я вполне могу рассудить, что хорошо, а что плохо. Если бы я поработал с Linq-To-Sql достаточное время, то уверен, смог бы дать тебе более подходящий ответ. Когда ты пишешь запрос на простом SQL, ты не можешь со стопроцентной уверенностью предсказать план запроса. А это означает, что ты либо допускаешь определенную последовательность выполнения, либо смотришь план. Первое ничем не отличается от применения Linq, второе точно также возможно и при применении Linq.
Здравствуйте, kvasya, Вы писали:
K>Здравствуйте, _nn_, Вы писали:
__>>Так сойдет ?
K>+2 K>Но это C++
Мы тут на форуме С++
__>>Под LINQ идут слишком много понятий. __>>Что конкретно вам нужно ? __>>Синтаксис from where select ? Или может методы расширения ? Или нормальные лямбды ? Или компиляция выражений во времени выполнения программы ?
K>Мне лично нужна типизация объектов источника данных, потенциально — любого. Как это будет — в принципе фиолетово, но в C# LINQ выглядит очень гармонично.
Что-то я не совсем понимаю что вам хочется.
Можете дать пример ?
Здравствуйте, Тролль зеленый и толстый, Вы писали:
ТЗИ>Да, это было мощно. А если ты такой умный, то почему тебе трудно изучить как работает Linq и прогнозировать себе на здоровье?
Не трудно, прогноз по линку не порадовал даже на простейших операциях. Вот для примера он не детектит что коллекция отсортирована
Тупость линку и делает его технологией которую сложно применять правильно.
static void WriteTime()
{
DateTime t = DateTime.Now;
Console.WriteLine(t +"." + t.Millisecond);
}
static void Main(string[] args)
{
SortedList<int, int> data = new SortedList<int, int>();
int itemCount = 100000000;
for (int i = 0; i < itemCount; ++i)
{
data.Add(i, i * 2);
}
var last2 = from v in data.Keys where v >= itemCount - 2 select v;
WriteTime();
foreach (var k in last2)
Console.WriteLine(k);
WriteTime();
WriteTime();
for (int i = data.IndexOfKey(itemCount - 2); i < data.Count; ++i )
Console.WriteLine(data.Keys[i]);
WriteTime();
}
R>Не трудно, прогноз по линку не порадовал даже на простейших операциях. Вот для примера он не детектит что коллекция отсортирована R>Тупость линку и делает его технологией которую сложно применять правильно.
Ну так он же весь построен на IEnumerable, как он может детектить, что коллекция отсортирована? Мне кажется, что, наоборот, сложность запросов linq гораздо проще предсказывать, чем сложность запросов SQL, поскольку linq устроен просто как дверь.
Я вот глядя на этот запрос, сразу бы сказал, что у него сложность будет линейная. Чего тут сложного-то?
var last2 = from v in data.Keys where v >= itemCount - 2 select v;
R>Я не копал вглубь, мне просто не нужен инструмент который является синтаксическим сахаром и решает задачи тупейшим и непроизводительнейшим образом. Признаю только инструменты, которые решают задачи лучше(в широком смысле), чем сделал бы средний разработчик с 1го раза.
Ну тогда понятно — тебя не устраивает эффективность. С другой стороны, с помощью linq можно достигнуть некоторой экономии времени при написании кода и сделать его более "семантически насыщенным", а производительность может быть приемлемой.
Не эта ли философия — "приемлемая производительность + сокращение времени разработки" — движет программированием? Этой философии отвечает и сам .Net.
Здравствуйте, Тролль зеленый и толстый, Вы писали:
ТЗИ>Ну тогда понятно — тебя не устраивает эффективность. С другой стороны, с помощью linq можно достигнуть некоторой экономии времени при написании кода и сделать его более "семантически насыщенным", а производительность может быть приемлемой.
ТЗИ>Не эта ли философия — "приемлемая производительность + сокращение времени разработки" — движет программированием? Этой философии отвечает и сам .Net.
Да, меня лично не устраивает эффективность, готов признать что сокращение времени разработки позволило бы этой технологии жить, но имхо это сокращение времени либо незначительно, либо его нет вовсе (по крайней мере я его не заметил).
Про философию: верно только отчасти, есть извечный треугольник цена + качество + перфоманс, в мск стоимость разработчиков довольно высокая и с индусами конкурировать только по цене — нереально, остается повышать качество и производительность до недоступного им уровня
Сейчас пишу свою реализацию LINQ на C++.
Пишу с тестами на Google C++ Testing Framework.
Минимальные требования для компиляции: C++11 and STL.
Используемый контроль версий: Mercurial (Hg).
Используемый хостинг: Google Code
Если есть желание присоединиться — свяжитесь со мной.
Здравствуйте, kvasya, Вы писали:
K>Здравствуйте, -MyXa-, Вы писали:
MX>>Здравствуйте, kvasya, Вы писали:
MX>>Boost.Proto
K>Каким образом это LINQ? K>Я с boost.proto не работал, поэтому спрашиваю, возможно ли реализовать, например, такое (C#):
K>
K> List<int> data = new List<int> { 1, 2, 4, 0, 5, 6 };
K> var largerThanTwoData = from v in data
K> where v > 2
K> select v;
K>
K>Спасибо.
Как насчёт такого варианта на C++11 + boolinq?
int src[] = {1,2,4,0,5,6};
auto dst = boolinq::from(src).where([](int v){return v > 2;})
.toVector();
Сейчас работаю над библиотекой boolinq: http://code.google.com/p/boolinq/
Если есть желание помочь — присоединяйтесь ...
И конечно же буду рад пообщаться на близлежащие темы)))